안녕하세요, 거래자 여러분
신뢰성 있고 수익성이 높은 거래 전략을 찾는 제 여정의 두 번째 단계를 소개합니다.
전략은 트렌딩 시장에서 매우 수익성이 입증되었지만, 시장 범위에서 손실을 입을 수 있습니다. 시스템을 더 견고하게 만들기 위해 전략은 트렌딩 시스템에만 의존 할 수 없습니다. 다른 시스템이 추가되어야합니다. 나는 좋은 거래 봇이 다른 시스템에 기반한 4가지 이상의 다른 전략으로 구성되어야 한다고 믿습니다. 이것이 제가 현재 작업하고 있는 것입니다.
이 전략을 발표하는 나의 목표는 다른 거래자들이 그들 자신의 전략을 만들 수 있도록 돕는 것이다. 나의 여행에서 나는 좋은, 일관성 있는 결과를 얻기 위해 진정으로 필수적인 괜찮은 위험 관리를 사용하는 좋은 전략을 찾는 것이 어렵다고 생각했다. 또한, 현실적인 성과 예측을 하기 위해 현실적인 수수료를 정의해야 한다. 이것은 수익성에 무게를 두고 있기 때문에 다른 전략의 저자가 종종 0로 설정되어 있는데, 이는 오해의 소지가 있다.
이 전략이 정보적이거나 유용하다고 생각되면 댓글을 남겨주세요.
안녕, 마이클
백테스트
// © Milleman //@version=4 //strategy("MilleMachine", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.06) // Additional settings Mode = input(title="Mode", defval="LongShort", options=["LongShort", "OnlyLong", "OnlyShort","Indicator Mode"]) UseTP = false //input(false, title="Use Take Profit?") QuickSwitch = true //input(true, title="Quickswitch") UseTC = true //input(true, title="Use Trendchange?") // Risk management settings //Spacer2 = input(false, title="======= Risk management settings =======") Risk = input(1.0, title="% Risk",minval=0)/100 RRR = 2 //input(2,title="Risk Reward Ratio",step=0.1,minval=0,maxval=20) SL_Mode = false // input(true, title="ON = Fixed SL / OFF = Dynamic SL (ATR)") SL_Fix = 3 //input(3,title="StopLoss %",step=0.25, minval=0)/100 ATR = atr(14) //input(14,title="Periode ATR")) Mul = input(2,title="ATR Multiplier",step=0.1) xATR = ATR * Mul SL = SL_Mode ? SL_Fix : (1 - close/(close+xATR)) // INDICATORS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Ind(type, src, len) => float result = 0 if type=="McGinley" result := na(result[1]) ? ema(src, len) : result[1] + (src - result[1]) / (len * pow(src/result[1], 4)) if type=="HMA" result := wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len))) if type=="EHMA" result := ema(2*ema(src, len/2)-ema(src, len), round(sqrt(len))) if type=="THMA" lend = len/2 result := wma(wma(src, lend/3)*3-wma(src, lend/2)-wma(src,lend), lend) if type=="SMA" // Simple result := sma(src, len) if type=="EMA" // Exponential result := ema(src, len) if type=="DEMA" // Double Exponential e = ema(src, len) result := 2 * e - ema(e, len) if type=="TEMA" // Triple Exponential e = ema(src, len) result := 3 * (e - ema(e, len)) + ema(ema(e, len), len) if type=="WMA" // Weighted result := wma(src, len) if type=="VWMA" // Volume Weighted result := vwma(src, len) if type=="SMMA" // Smoothed w = wma(src, len) result := (w[1] * (len - 1) + src) / len if type == "RMA" result := rma(src, len) if type=="LSMA" // Least Squares result := linreg(src, len, 0) if type=="ALMA" // Arnaud Legoux result := alma(src, len, 0.85, 6) if type=="Kijun" //Kijun-sen kijun = avg(lowest(len), highest(len)) result :=kijun if type=="WWSA" // Welles Wilder Smoothed Moving Average result := nz(result[1]) + (close -nz(result[1]))/len result // Baseline : Switch from Long to Short and vice versa BL_Act = input(true, title="====== Activate Baseline - Switch L/S ======") BL_type = input(title="Baseline Type", defval="McGinley", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) BL_src = input(close, title="BL source") BL_len = input(50, title="BL length", minval=1) BL = Ind(BL_type,BL_src, BL_len) // Confirmation indicator C1_Act = input(false, title="===== Activate Confirmation indicator =====") C1_type = input(title="C1 Entry indicator", defval="SMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) C1_src = input(close, title="Source") C1_len = input(5,title="Length", minval=1) C1 = Ind(C1_type,C1_src,C1_len) // Entry indicator : Hull Moving Average Spacer5 = input(true, title="====== ENTRY indicator =======") EI_type = input(title="EI Entry indicator", defval="HMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) EI_src = input(close, title="Source") EI_Len = input(46,title="Length", minval=1) EI = Ind(EI_type,EI_src,EI_Len) // Trail stop settings TrailActivation = input(true, title="===== Activate Trailing Stop =====") TS_type = input(title="TS Traling Stop Type", defval="EMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) TrailSLScaling = 1 //input(100, title="SL Scaling", minval=0, step=5)/100 TrailingSourceLong = Ind(TS_type,low,input(5,"Smoothing Trail Long EMA", minval=1)) TrailingSourceShort = Ind(TS_type,high,input(2,"Smoothing Trail Short EMA", minval=1)) //VARIABLES MANAGEMENT TriggerPrice = 0.0, TriggerPrice := TriggerPrice[1] TriggerSL = 0.0, TriggerSL := TriggerSL[1] SLPrice = 0.0, SLPrice := SLPrice[1], TPPrice = 0.0, TPPrice := TPPrice[1] isLong = false, isLong := isLong[1], isShort = false, isShort := isShort[1] //LOGIC GoLong = crossover(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] > 1) and (not C1_Act or C1>C1[1]) and (Mode == "LongShort" or Mode == "OnlyLong") GoShort = crossunder(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] < 1) and (not C1_Act or C1<C1[1]) and (Mode == "LongShort" or Mode == "OnlyShort") ExitLong = isLong and crossunder(EI,EI[1]) and UseTC ExitShort = isShort and crossover(EI,EI[1]) and UseTC //FRAMEWORK //Reset Long-Short memory if isLong and strategy.position_size == 0.0 isLong := false if isShort and strategy.position_size == 0.0 isShort := false //Long if GoLong isLong := true, TriggerPrice := close, TriggerSL := SL TPPrice := UseTP? TriggerPrice * (1 + (TriggerSL * RRR)) : na SLPrice := TriggerPrice * (1-TriggerSL) Entry_Contracts = strategy.equity * Risk / ((TriggerPrice-SLPrice)/TriggerPrice) / TriggerPrice strategy.entry("Long", strategy.long, comment=str.tostring(math.round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts) strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice) if isLong NewValSL = TrailingSourceLong * (1 - (SL*TrailSLScaling)) if TrailActivation and NewValSL > SLPrice SLPrice := NewValSL strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice) if ExitLong strategy.close_all(comment="TrendChange") isLong := false //Short if GoShort isShort := true, TriggerPrice := close, TriggerSL := SL TPPrice := UseTP? TriggerPrice * (1 - (TriggerSL * RRR)) : na SLPrice := TriggerPrice * (1 + TriggerSL) Entry_Contracts = strategy.equity * Risk / ((SLPrice-TriggerPrice)/TriggerPrice) / TriggerPrice strategy.entry("Short", strategy.short, comment=str.tostring(math.round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts) strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice) if isShort NewValSL = TrailingSourceShort * (1 + (SL*TrailSLScaling)) if TrailActivation and NewValSL < SLPrice SLPrice := NewValSL strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice) if ExitShort strategy.close_all(comment="TrendChange") isShort := false //VISUALISATION plot(BL_Act?BL:na, color=color.blue,title="Baseline") plot(C1_Act?C1:na, color=color.yellow,title="confirmation Indicator") EIColor = EI>EI[1] ? color.green : color.red Fill_EI = plot(EI, color=EIColor, linewidth=1, transp=40, title="Entry Indicator EI") Fill_EID = plot(EI[1], color=EIColor, linewidth=1, transp=40, title="Entry Indicator EID") plot(strategy.position_size != 0.0 and (isLong or isShort) ? TriggerPrice : na, title="TriggerPrice", color=color.yellow, style=plot.style_linebr) plot(strategy.position_size != 0.0 and (isLong or isShort) ? TPPrice : na, title="TakeProfit", color=color.green, style=plot.style_linebr) plot(strategy.position_size != 0.0 and (isLong or isShort) ? SLPrice : na, title="StopLoss", color=color.red, style=plot.style_linebr)