Pine 脚本 (TradingView) - 如何将止损移至获利水平

Nik*_*nin 3 pine-script

TradingView 上有一个 Pine 脚本代码,其中有 2 个止盈级别和 2 个止损级别:tradingview.com。当实现第一个止盈时,一半仓位被平仓,第一个止损移至入场水平(盈亏平衡)。

您是否有任何想法如何通过以下逻辑设置 3 个止盈水平:

  • 当达到 TP 1 时,SL 将移至盈亏平衡

  • 当达到 TP 2 时,SL 移至 TP 2

  • 当达到 TP 3 时,退出仓位

非常感谢您的帮助!

//@version=4
strategy("SL1 Pips after TP1 (MA)", commission_type=strategy.commission.cash_per_order, overlay=true, default_qty_value=1000, initial_capital=100)

// Strategy
Buy  = input(true)
Sell = input(true)

// Date Range
start_year    = input(title='Start year'   ,defval=2020)
start_month   = input(title='Start month'  ,defval=1)
start_day     = input(title='Start day'    ,defval=1)
start_hour    = input(title='Start hour'   ,defval=0)
start_minute  = input(title='Start minute' ,defval=0)
end_time      = input(title='set end time?',defval=false)
end_year      = input(title='end year'     ,defval=2019)
end_month     = input(title='end month'    ,defval=12)
end_day       = input(title='end day'      ,defval=31)
end_hour      = input(title='end hour'     ,defval=23)
end_minute    = input(title='end minute'   ,defval=59)

// MA
ema_period = input(title='EMA period',defval=10)
wma_period = input(title='WMA period',defval=20)
ema        = ema(close,ema_period)
wma        = wma(close,wma_period)

// Entry Condition
buy =
 crossover(ema,wma) and
 nz(strategy.position_size) == 0 and Buy and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)
 
sell =
 crossunder(ema,wma) and
 nz(strategy.position_size) == 0 and Sell and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)

// Pips
pip = input(20)*10*syminfo.mintick

// Trading parameters //
var bool  LS  = na
var bool  SS  = na
var float EP  = na
var float TVL = na
var float TVS = na
var float TSL = na
var float TSS = na
var float TP1 = na
var float TP2 = na
var float SL1 = na
var float SL2 = na

if buy or sell and strategy.position_size == 0
    EP  := close
    SL1 := EP - pip     * (sell?-1:1)
    SL2 := EP - pip     * (sell?-1:1)
    TP1 := EP + pip     * (sell?-1:1)
    TP2 := EP + pip * 2 * (sell?-1:1) 
   
// current trade direction    
LS := buy  or strategy.position_size > 0
SS := sell or strategy.position_size < 0

// adjust trade parameters and trailing stop calculations
TVL := max(TP1,open) - pip[1]
TVS := min(TP1,open) + pip[1]
TSL := open[1] > TSL[1] ? max(TVL,TSL[1]):TVL 
TSS := open[1] < TSS[1] ? min(TVS,TSS[1]):TVS

if LS and high > TP1
    if open <= TP1
        SL2:=min(EP,TSL)
    
if SS and low < TP1
    if open >= TP1
        SL2:=max(EP,TSS)

// Closing conditions
close_long  = LS and open < SL2
close_short = SS and open > SL2

// Buy
strategy.entry("buy"  , strategy.long, when=buy and not SS)
strategy.exit ("exit1", from_entry="buy", stop=SL1, limit=TP1, qty_percent=50)
strategy.exit ("exit2", from_entry="buy", stop=SL2, limit=TP2)

// Sell
strategy.entry("sell" , strategy.short, when=sell and not LS)
strategy.exit ("exit3", from_entry="sell", stop=SL1, limit=TP1, qty_percent=50)
strategy.exit ("exit4", from_entry="sell", stop=SL2, limit=TP2)

// Plots
a=plot(strategy.position_size >  0 ? SL1 : na, color=#dc143c, style=plot.style_linebr)
b=plot(strategy.position_size <  0 ? SL1 : na, color=#dc143c, style=plot.style_linebr) 
c=plot(strategy.position_size >  0 ? TP1 : na, color=#00ced1, style=plot.style_linebr) 
d=plot(strategy.position_size <  0 ? TP1 : na, color=#00ced1, style=plot.style_linebr) 
e=plot(strategy.position_size >  0 ? TP2 : na, color=#00ced1, style=plot.style_linebr) 
f=plot(strategy.position_size <  0 ? TP2 : na, color=#00ced1, style=plot.style_linebr) 
g=plot(strategy.position_size >= 0 ? na  : EP, color=#ffffff, style=plot.style_linebr) 
h=plot(strategy.position_size <= 0 ? na  : EP, color=#ffffff, style=plot.style_linebr) 

plot(ema,title="ema",color=#fff176)
plot(wma,title="wma",color=#00ced1)
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助!

And*_*y D 8

这是您需要的示例:

\n
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/\n// \xc2\xa9 adolgov\n\n// @description\n// when tp1 is reached, sl is moved to break-even\n// when tp2 is reached, sl is moved to tp1\n// when tp3 is reached - exit\n\n//@version=4\nstrategy("Stepped trailing strategy example", overlay=true)\n\n// random entry condition\nlongCondition = crossover(sma(close, 14), sma(close, 28))\nif (longCondition)\n    strategy.entry("My Long Entry Id", strategy.long)\n\n// sl & tp in points\nsl = input(100)\ntp1 = input(100)\ntp2 = input(200)\ntp3 = input(300)\n\ncurProfitInPts() =>\n    if strategy.position_size > 0\n        (high - strategy.position_avg_price) / syminfo.mintick\n    else if strategy.position_size < 0\n        (strategy.position_avg_price - low) / syminfo.mintick\n    else\n        0\n        \ncalcStopLossPrice(OffsetPts) =>\n    if strategy.position_size > 0\n        strategy.position_avg_price - OffsetPts * syminfo.mintick\n    else if strategy.position_size < 0\n        strategy.position_avg_price + OffsetPts * syminfo.mintick\n    else\n        0\n        \ncalcProfitTrgtPrice(OffsetPts) =>\n    calcStopLossPrice(-OffsetPts)\n\ngetCurrentStage() =>\n    var stage = 0\n    if strategy.position_size == 0 \n        stage := 0\n    if stage == 0 and strategy.position_size != 0\n        stage := 1\n    else if stage == 1 and curProfitInPts() >= tp1\n        stage := 2\n    else if stage == 2 and curProfitInPts() >= tp2\n        stage := 3\n    stage\n\nstopLevel = -1.\nprofitLevel = calcProfitTrgtPrice(tp3)\n\n// based on current stage set up exit\n// note: we use same exit ids ("x") consciously, for MODIFY the exit\'s parameters\ncurStage = getCurrentStage()\nif curStage == 1\n    stopLevel := calcStopLossPrice(sl)\n    strategy.exit("x", loss = sl, profit = tp3, comment = "sl or tp3")\nelse if curStage == 2\n    stopLevel := calcStopLossPrice(0)\n    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "breakeven or tp3")\nelse if curStage == 3\n    stopLevel := calcStopLossPrice(-tp1)\n    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "tp1 or tp3")\nelse\n    strategy.cancel("x")\n
Run Code Online (Sandbox Code Playgroud)\n

你可以在这里看到它是如何工作的

\n