首页 > 解决方案 > 策略未以指定价格退出

问题描述

我创建了下面的策略。但是当我查看 Strategy Tester 的交易列表时,我发现它们都没有在我的 limit=TP_long 或 stop=SL_long 时退出。这是其中之一它在 108.726 而不是 TP 109.067 或 SL 108.355 退出。任何帮助都可能有用。谢谢

嗨,我创建了以下策略。但是当我查看 Strategy Tester 的交易列表时,我发现它们都没有在我的 limit=TP_long 或 stop=SL_long 时退出。这是其中之一它在 108.726 而不是 TP 109.067 或 SL 108.355 退出。任何帮助都可能有用。谢谢

//@version=4
    strategy(title="EMA3489 + Doji + RSI Strategy", shorttitle="EMA3489 + Doji + RSI Strategy", overlay=true)
    
    //strategy start date
    startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
    startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
    startYear = input(title="Start Year", type=input.integer, defval=2020, minval=2018, maxval=2100)
    
    endDate = input(title="End Date", type=input.integer, defval=1, minval=1, maxval=31)
    endMonth = input(title="End Month", type=input.integer, defval=12, minval=12, maxval=12)
    endYear = input(title="End Year", type=input.integer, defval=2021, minval=2020, maxval=2100)
    
    // Look if the close time of the current bar
    // falls inside the date range
    inDateRange = (time >= timestamp(syminfo.timezone, startYear,startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
    
    //Moving Averages
    maFastSource   = input(defval = close, title = "Fast EMA Source")
    maFastLength   = input(defval = 34, title = "Fast EMA Period", minval = 1)
    // long ma
    maSlowSource   = input(defval = close, title = "Slow EMA Source")
    maSlowLength   = input(defval = 89, title = "Slow EMA Period", minval = 1)
    
    maFast = ema(maFastSource, maFastLength)
    maSlow = ema(maSlowSource, maSlowLength)
    
    //rsi
    rsiSource = input(title="RSI Source", type=input.source, defval=close)
    rsiLength = input(title="RSI Length", type=input.integer, defval=14)
    rsiValue = round(rsi(rsiSource, rsiLength),2)
    rsiOverbought = input(title="RSI Overbought Level", type=input.integer, defval=70)
    rsiOversold = input(title="RSI Oversold Level", type=input.integer, defval=30)
    
    // On the last price bar, make a new trend line
    HOO=input(defval=0.12,type=input.float,title="(H-L)/O")
    p1v=input(defval=3.5,type=input.float,title="(H-L)/(C-O)")
    p3v=input(defval=3.5,type=input.float,title="(H-L)/(H-O) or (H-L)/(O-L)")
    ema1=input(defval=0.1,type=input.float,title="C - FastEMA")
    ema2=input(defval=0.1,type=input.float,title="C - SlowEMA")
    
    p2=(high-low)/open>HOO/100
    
    p1_buy=abs((high-low)/(close-open))>p1v
    p1_sell=abs((high-low)/(close-open))>p1v
    
    p3_buy=(high-low)/(high-open)>p3v
    p3_sell=(high-low)/(open-low)>p3v
    
    emafar_buy = (maFast-close)/open>ema1/100 or (maSlow-close)/open>ema2/100
    emafar_sell = (close-maFast)/open>ema1/100 or (close-maSlow)/open>ema2/100
    
    rsiob=rsiValue>rsiOverbought
    rsios=rsiValue<rsiOversold
    
    //Conditions
    
    openlong = p1_buy and p3_buy and p2 and emafar_buy and rsios
    openshort= p1_sell and p3_sell and p2 and emafar_sell and rsiob
    
    //follow EMA
    SL_long= abs(low)
    TP_long= close+2*abs(close-low)
    SL_short= abs(high)
    TP_short= close-2*abs(high-close)
    //Entry and Exit
    if (inDateRange)
        strategy.entry("Long", strategy.long, when = openlong)
        strategy.exit("Long", limit=TP_long,stop=SL_long,comment="SLTP")
        
        strategy.entry("Short", strategy.short, when = openshort)
        strategy.exit("Short", limit=TP_short,stop=SL_short,comment="SLTP")
    if (not inDateRange)
        strategy.close_all()
        
    //plot
    plot(maFast, title="maFast", color=color.yellow, linewidth=2)
    plot(maSlow, title="maSlow", color=color.green, linewidth=3)
    
    if (openlong)
        label.new(x=bar_index, y=close-150*syminfo.mintick,
          color=color.green, textcolor=color.white,style=label.style_label_up,
          text="BUY: " + tostring(close) + "\nRSI: "+tostring(rsiValue) + "\nTP: " +tostring(TP_long)+" - SL: "+tostring(SL_long))
    if (openshort)
        label.new(x=bar_index, y=close+150*syminfo.mintick,
          color=color.red, textcolor=color.white,
          text="SELL: " + tostring(close) + "\nRSI: "+tostring(rsiValue) + "\nTP: " +tostring(TP_short)+" - SL: "+tostring(SL_short))

我通过使用 valuewhen 找到了方法,并且效果很好。

strategy.entry("Long", strategy.long, when = openlong)
cl=valuewhen(openlong, close, 0)
ll=valuewhen(openlong, low, 0)
strategy.exit("long exit", from_entry="Long", profit=2*abs(cl-ll)/syminfo.mintick,loss=abs(cl-ll)/syminfo.mintick,comment="SLTP LONG")
    
strategy.entry("Short", strategy.short, when = openshort)
cl2=valuewhen(openshort, close, 0)
hl=valuewhen(openshort, high, 0)
strategy.exit("short exit", from_entry="Short", profit=2*abs(cl2-hl)/syminfo.mintick,loss=abs(cl2-hl)/syminfo.mintick,comment="SLTP SHORT")

标签: pine-scriptstrategy-pattern

解决方案


如果每个都strategy.exit必须关闭它自己的strategy.entry,试试这个:

...
    //Entry and Exit
    if (inDateRange)
        if openlong
            strategy.entry("Long", strategy.long)
            strategy.exit("long exit", from_entry="Long", limit=TP_long,stop=SL_long,comment="SLTP")
        
        if openshort
            strategy.entry("Short", strategy.short)
            strategy.exit("short exit", from_entry="Short", limit=TP_short,stop=SL_short,comment="SLTP")
    if (not inDateRange)
        strategy.close_all()
...

推荐阅读