在特定条件下在 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...