在特定条件下在 Pine 脚本中绘制通道

问题描述

我正在尝试使用以下代码在交易视图图表中绘制通道。它可以很好地作为基本需求,但是,我需要即兴创作,我无法找到编写代码的逻辑。需要你的帮助..

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © PavanSada08143

//@version=4
study("Channel","CT",true)
delay_plot_til_closed = true
repaint = (not(delay_plot_til_closed) or barstate.ishistory or barstate.isconfirmed)
fleftBars = input(title="Look Back Period",type=input.integer,defval=20,minval=1,maxval=50,step=1,group="Fibo Channel Settings")
frightBars=input(title="Look Forward Period",defval=5,maxval=30,group="Fibo Channel Settings")
widt = input(defval = 1,title = "Line Width",inline ="FiboSet1",group="Fibo Channel Settings")
extendit = input(defval = true,title = "Extend Lines to Right",group="Fibo Channel Settings")
PeakPointsConfirmation = input(title="Confirm Peak on Move %",type=input.float,defval=0.15,minval=0.05,maxval=0.25,step=0.01,group="Fibo Channel Settings")
UpChannelOption = input(title="Up Channel",type=input.string,options=["solid (─)","dotted (┈)","dashed (╌)"],defval="dashed (╌)",group="Fibo Channel Settings")

UpChanlineStyle = (UpChannelOption == "dotted (┈)") ? line.style_dotted :
     (UpChannelOption == "dashed (╌)") ? line.style_dashed :
         line.style_solid

DownChannelOption = input(title="Down Channel",group="Fibo Channel Settings")

DownChanlineStyle = (DownChannelOption == "dotted (┈)") ? line.style_dotted :
     (UpChannelOption == "dashed (╌)") ? line.style_dashed :
         line.style_solid

fb1 = input(title="Fibo Channel 1",defval=0.236,group="Fibo Channel Percentage")
fb2 = input(title="Fibo Channel 2",defval=0.618,group="Fibo Channel Percentage")
fb3 = input(title="Fibo Channel 3",defval=1.618,group="Fibo Channel Percentage")
fb4 = input(title="Fibo Channel 4",defval=2.618,group="Fibo Channel Percentage")

//========================== Variables ===============================
var float TenPctOfPivotLow = 0,float TenPctOfPivotHigh = 0
var float CurrentPivotLow = 0,float CurrentPivotHigh = 0
var float TempPivotLow = 0,float TempPivotHigh = 0
var int TempCandlePivotLow = 0,int TempCandlePivotHigh = 0
var int HasclosedAboveTenPct = 0,int HasclosedBelowTenPct = 0
var float LastKnownPivotLow = 1e99,float LastKnownPivotHigh = 1e99 
var int CandleOfLatestLow = 0,int CandleOfLatestHigh = 0
var int CandleOfLastKnownPivotLow = 0,int CandleOfLastKnownPivotHigh = 0
var float Slope = 0,int Trend = 0
var int DistanceBwTwoZeroPoints = 0,int MidToLeftDistance = 0,int MidToRightDistance = 0
var float ExpValueOf100FromMidToLeft = 0,float ExpValueOf100FromMidToRight = 0
var fibo_ratios = array.new_float(0)
var bool AlreadyDownChannelExists = false,bool AlreadyUpChannelExists = false
var line DrawUpTrendLine = line.new(bar_index,low,bar_index,low)
var line DrawUpHighTrendLine = line.new(bar_index,low)
var Downfibolines = array.new_line(4)
var Upfibolines = array.new_line(4)
var line DrawDownTrendLine = line.new(bar_index,high,high)
var line DrawUpLowTrendLine = line.new(bar_index,high)
if barstate.isfirst
    array.push(fibo_ratios,fb1)
    array.push(fibo_ratios,fb2)
    array.push(fibo_ratios,fb3)
    array.push(fibo_ratios,fb4)
    
//========================== BASIC CALCULATION ===============================

PivotHigh=0.00,PivotHigh := nz(pivothigh(high,fleftBars,frightBars),0.00)
PivotLow=0.00,PivotLow := nz(pivotlow(low,0.00)

//========================== PIVOT HIGH CALCULATION ===============================

if PivotHigh != 0.00 // Candles where Pivot High is found
    TempPivotHigh:= PivotHigh
    TempCandlePivotHigh := valuewhen(TempPivotHigh,bar_index[frightBars],0)
    TenPctOfPivotHigh := (TempPivotHigh - ((TempPivotHigh * PeakPointsConfirmation)/100))
else
    TempPivotHigh:= TempPivotHigh[1]
    TempCandlePivotHigh := TempCandlePivotHigh[1]
    TenPctOfPivotHigh := TenPctOfPivotHigh[1]

HasclosedBelowTenPct := 0
for i = 0 to 30
    if close[i] <= TenPctOfPivotHigh and bar_index[i] > TempCandlePivotHigh
        HasclosedBelowTenPct:= HasclosedBelowTenPct + 1
    if HasclosedBelowTenPct == 1
        LastKnownPivotHigh:= CurrentPivotHigh[1]
        CandleOfLastKnownPivotHigh:=CandleOfLatestHigh[1]
        CurrentPivotHigh := TempPivotHigh
        CandleOfLatestHigh := TempCandlePivotHigh
    else
        LastKnownPivotHigh:= LastKnownPivotHigh[1]
        CandleOfLastKnownPivotHigh:=CandleOfLastKnownPivotHigh[1]
        CurrentPivotHigh := CurrentPivotHigh[1]
        CandleOfLatestHigh := CandleOfLatestHigh[1]


//========================== PIVOT LOW CALCULATION ===============================

if PivotLow != 0.00 // Candles where Pivot Low is found
    TempPivotLow:= PivotLow
    TempCandlePivotLow := valuewhen(TempPivotLow,0)
    TenPctOfPivotLow := (TempPivotLow + ((TempPivotLow * PeakPointsConfirmation)/100))
else
    TempPivotLow:= TempPivotLow[1]
    TempCandlePivotLow := TempCandlePivotLow[1]
    TenPctOfPivotLow := TenPctOfPivotLow[1]
    
    
HasclosedAboveTenPct := 0
for i = 0 to 30
    if close[i] >= TenPctOfPivotLow and bar_index[i] > TempCandlePivotLow
        HasclosedAboveTenPct:= HasclosedAboveTenPct + 1
    if HasclosedAboveTenPct == 1
        LastKnownPivotLow:= CurrentPivotLow[1]
        CandleOfLastKnownPivotLow:=CandleOfLatestLow[1]
        CurrentPivotLow := TempPivotLow
        CandleOfLatestLow := TempCandlePivotLow
    else
        LastKnownPivotLow:= LastKnownPivotLow[1]
        CandleOfLastKnownPivotLow:=CandleOfLastKnownPivotLow[1]
        CurrentPivotLow := CurrentPivotLow[1]
        CandleOfLatestLow := CandleOfLatestLow[1]

//===================== Determination of Trend ========================
DistanceBwTwoZeroPoints:= 0
Slope:= 0
MidToLeftDistance:= 0
MidToRightDistance:= 0
ExpValueOf100FromMidToLeft := 0
ExpValueOf100FromMidToRight := 0
if CurrentPivotLow > LastKnownPivotLow and repaint and AlreadyUpChannelExists == false
    AlreadyUpChannelExists := true
    DistanceBwTwoZeroPoints:= CandleOfLatestLow - CandleOfLastKnownPivotLow
    Slope:= (CurrentPivotLow - LastKnownPivotLow) / DistanceBwTwoZeroPoints
    MidToRightDistance:= CandleOfLatestLow - CandleOfLatestHigh
    MidToLeftDistance:= CandleOfLatestHigh - CandleOfLastKnownPivotLow
    ExpValueOf100FromMidToLeft := CurrentPivotHigh - (Slope * MidToLeftDistance)
    ExpValueOf100FromMidToRight := CurrentPivotHigh + (Slope * MidToRightDistance)
    Trend:= 1
else if CurrentPivotHigh < LastKnownPivotHigh and repaint and AlreadyDownChannelExists == false
    AlreadyDownChannelExists := true
    DistanceBwTwoZeroPoints:= CandleOfLatestHigh - CandleOfLastKnownPivotHigh
    Slope:= (LastKnownPivotHigh - CurrentPivotHigh) / DistanceBwTwoZeroPoints
    MidToLeftDistance:= CandleOfLatestLow - CandleOfLastKnownPivotHigh
    MidToRightDistance:= CandleOfLatestHigh - CandleOfLatestLow
    ExpValueOf100FromMidToLeft := CurrentPivotLow + (Slope * MidToLeftDistance)
    ExpValueOf100FromMidToRight := CurrentPivotLow - (Slope * MidToRightDistance)
    Trend:= -1

if (CurrentPivotLow < LastKnownPivotLow) or (MidToRightDistance <= 0) or (CurrentPivotHigh < LastKnownPivotHigh) or dayofmonth(time[bar_index - CandleOfLatestLow]) != dayofmonth(time[bar_index - CandleOfLastKnownPivotLow])
    AlreadyUpChannelExists := false

if (CurrentPivotHigh < LastKnownPivotHigh) or (MidToRightDistance <= 0) or (CurrentPivotLow < LastKnownPivotLow) or dayofmonth(time[bar_index - CandleOfLatestHigh]) != dayofmonth(time[bar_index - CandleOfLastKnownPivotHigh])
    AlreadyDownChannelExists := false


if Trend== 1
    line.delete(DrawDownTrendLine)
    line.delete(DrawUpLowTrendLine)
    for ab = 0 to 3
        line.delete(array.get(Downfibolines,ab))
    DrawUpTrendLine := line.new(CandleOfLastKnownPivotLow,LastKnownPivotLow,CandleOfLatestLow,CurrentPivotLow,style=UpChanlineStyle,color=color.lime,width = widt,extend = extendit ? extend.right : extend.none)
    line.delete(DrawUpTrendLine[1])
    DrawUpHighTrendLine := line.new(CandleOfLastKnownPivotLow,ExpValueOf100FromMidToLeft,ExpValueOf100FromMidToRight,extend = extendit ? extend.right : extend.none)
    line.delete(DrawUpHighTrendLine[1])
    for x = 0 to 3
        line.delete(array.get(Upfibolines,x))
        array.set(Upfibolines,x,line.new(x1 = CandleOfLastKnownPivotLow,y1 = LastKnownPivotLow + (( ExpValueOf100FromMidToLeft - LastKnownPivotLow ) * array.get(fibo_ratios,x)),x2 = CandleOfLatestLow,y2 = CurrentPivotLow + (( ExpValueOf100FromMidToRight - CurrentPivotLow ) * array.get(fibo_ratios,color = x == 0? color.aqua : x == 1? color.lime : color.yellow,style =  UpChanlineStyle,extend = extendit ? extend.right : extend.none))
else if Trend== -1
    line.delete(DrawUpTrendLine)
    line.delete(DrawUpHighTrendLine)
    for aa = 0 to 3
        line.delete(array.get(Upfibolines,aa))
    DrawDownTrendLine := line.new(CandleOfLastKnownPivotHigh,LastKnownPivotHigh,CandleOfLatestHigh,CurrentPivotHigh,style=DownChanlineStyle,color=color.red,extend = extendit ? extend.right : extend.none)
    line.delete(DrawDownTrendLine[1])
    DrawUpLowTrendLine := line.new(CandleOfLastKnownPivotHigh,extend = extendit ? extend.right : extend.none)
    line.delete(DrawUpLowTrendLine[1])
    for x = 0 to 3
        line.delete(array.get(Downfibolines,x))
        array.set(Downfibolines,line.new(x1 = CandleOfLastKnownPivotHigh,y1 = LastKnownPivotHigh + (( ExpValueOf100FromMidToLeft - LastKnownPivotHigh ) * array.get(fibo_ratios,x2 = CandleOfLatestHigh,y2 = CurrentPivotHigh + (( ExpValueOf100FromMidToRight - CurrentPivotHigh ) * array.get(fibo_ratios,color = x == 0? color.aqua : x == 1? color.red : color.yellow,style =  DownChanlineStyle,extend = extendit ? extend.right : extend.none))

上述脚本首先确定了 3 个要点。如果要为上升趋势绘制通道,则需要第一个低点和下一个高点,最后是更高的低点。反之,下降趋势需要高点、低点和低点。

基于这些点,通道被绘制在图表上。在任何时候,我都只需要一个频道就可以显示在图表上。

目前的问题是:

  1. 假设它最初找到了这 3 个点以实现上升趋势。在 几根蜡烛,如果发现新高,它会重新调整蜡烛 删除旧的。你能帮我提出一个条件,要么 零线被打破或价格(高)已达到“fb4”没有新的渠道 应该绘制?

  2. 在通道下降且价格在范围内时发现上升趋势 零线和 fb4 线。目前,它删除下行通道 并绘制了一个新的上升通道。你能帮我提出一个条件吗 零线被打破或价格(高)已达到“fb4”没有 应该绘制新频道吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)