이 전략은
이 전략은 주로 주요 트렌드의 방향과 힘을 판단하고, 장기 및 짧은 양방향 거래를 설정합니다. 구체적인 운영 원칙은 다음과 같습니다.
긴 신호:
짧은 신호: 긴 신호의 반대
이윤 취득 및 스톱 손실: 두 가지 옵션: 최저 가격/최고 가격 스톱 손실, ATR 스톱 손실
이 전략은 다음과 같은 장점을 가지고 있습니다.
이 전략은 또한 몇 가지 위험을 안고 있습니다.
위의 위험을 줄이기 위해 최적화는 다음과 같은 측면에서 수행 할 수 있습니다.
코드 수준에서 이 전략의 주요 최적화 방향은 다음과 같습니다.
매개 변수 조정과 테스트를 통해 전략은 수익을 극대화하면서 마감과 위험을 줄일 수 있습니다.
이 전략은 주요 트렌드 방향을 결정하기 위해 여러 지표를 통합하고, EMA 지표를 특정 운영 신호로 사용하고, 수익을 잠금하기 위해 트레일링 스톱 로스를 사용합니다. 매개 변수 최적화를 통해 비교적 좋은 안정적인 이익을 얻을 수 있습니다. 그러나 특정 시스템 위험도 주목해야하며, 지표의 효과와 시장 환경의 변화는 지속적으로 모니터링되어야합니다.
/*backtest start: 2023-02-13 00:00:00 end: 2024-02-19 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //Lowest Low/ Highest High & ATR Stop Loss/ Take Profit //Optimized for the 30 minutes chart strategy(title="TradePro's Trading Idea Cipher B+ Divergence EMA Pullback Strategy", shorttitle="WT MFI RSI EMA PB STRAT", overlay = true, pyramiding = 0, max_bars_back=5000, calc_on_order_fills = false, commission_type = strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD) // { Time Range FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12) FromDay=input(defval=1,title="FromDay",minval=1,maxval=31) FromYear=input(defval=2020,title="FromYear",minval=2016) ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12) ToDay=input(defval=1,title="ToDay",minval=1,maxval=31) ToYear=input(defval=9999,title="ToYear",minval=2017) start=timestamp(FromYear,FromMonth,FromDay,00,00) finish=timestamp(ToYear,ToMonth,ToDay,23,59) window()=>true // See if this bar's time happened on/after start date afterStartDate = time >= start and time<=finish?true:false zeroline = 0 // } Time Range // { Wavetrend, RSI, MFI // WaveTrend cl = input(12, "Channel Length") al = input(12, "Average Length") overbought = input(53, title = 'WT Overbought Level 1', type = input.integer) oversold = input(-53, title = 'WT Oversold Level 1', type = input.integer) ap = hlc3 esa = ema(ap, cl) d = ema(abs(ap - esa), cl) ci = (ap - esa) / (0.015 * d) tci = ema(ci, al) wt1 = tci wt2 = sma(wt1,4) wtOs = wt2 <= oversold wtOb = wt2 >= overbought wtX = cross(wt1, wt2) wtUp = wt2 - wt1 <= 0 wtDown = wt2 - wt1 >= 0 buySignal = wtX and wtOs and wtUp sellSignal = wtX and wtOb and wtDown // RSI & MFI rsiMFIPosY = input(2, title = 'MFI Area Y Pos', type = input.float) rsiMFIperiod = input(80,title = 'MFI Period', type = input.integer) rsiMFIMultiplier = input(200, title = 'MFI Area multiplier', type = input.float) f_rsimfi(_period, _multiplier, _tf) => security(syminfo.tickerid, _tf, sma(((close - open) / (high - low)) * _multiplier, _period) - rsiMFIPosY) rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, timeframe.period) // } Wavetrend, RSI, MFI // { EMA emasrc = close res = input(title="EMA Timeframe", type=input.resolution, defval="30") len1 = input(title="EMA1 Length", type=input.integer, defval=200) col1 = color.yellow len2 = input(title="EMA2 Length", type=input.integer, defval=50) col2 = color.blue // Calculate EMA ema1 = ema(emasrc, len1) emaSmooth1 = security(syminfo.tickerid, res, ema1, barmerge.gaps_off, barmerge.lookahead_off) ema2 = ema(emasrc, len2) emaSmooth2 = security(syminfo.tickerid, res, ema2, barmerge.gaps_off, barmerge.lookahead_off) // Draw EMA plot(emaSmooth1, title="EMA1", linewidth=1, color=col1) plot(emaSmooth2, title="EMA2", linewidth=1, color=col2) // } EMA // { Long Entry enablelong = input(true, title="Enable long?") //Long Signal upcondition = close > emaSmooth1 wavetrendlong = wt1 and wt2 < zeroline mfilong = rsiMFI > 0 emapblong1 = (close > emaSmooth2) and (close[1] < emaSmooth2[1]) emapblong2 = ((close[2] > emaSmooth2[2]) and (close[3] > emaSmooth2[3]) and (close[4] > emaSmooth2[4])) or ((close[5] > emaSmooth2[5]) and (close[6] > emaSmooth2[6]) and (close[7] > emaSmooth2[7])) or ((close[8] > emaSmooth2[8]) and (close[9] > emaSmooth2[9]) and (close[10] > emaSmooth2[10])) longcondition = upcondition and wavetrendlong and buySignal and mfilong and emapblong1 and emapblong2 //strategy buy long if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true) strategy.entry("long", strategy.long) plotshape(longcondition, style=shape.arrowup, location=location.abovebar, color=color.green) // } Long Entry // { Short Entry enableshort = input(true, title="Enable short?") //Short Signal downcondition = close < emaSmooth1 wavetrendshort = wt1 and wt2 > zeroline mfishort = rsiMFI < 0 emapbshort1 = (close < emaSmooth2) and (close[1] > emaSmooth2[1]) emapbshort2 = ((close[2] < emaSmooth2[2]) and (close[3] < emaSmooth2[3]) and (close[4] < emaSmooth2[4])) or ((close[5] < emaSmooth2[5]) and (close[6] < emaSmooth2[6]) and (close[7] < emaSmooth2[7])) or ((close[8] < emaSmooth2[8]) and (close[9] < emaSmooth2[9]) and (close[10] < emaSmooth2[10])) shortcondition = downcondition and wavetrendshort and sellSignal and mfishort and emapbshort1 and emapbshort2 //strategy buy short if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true) strategy.entry("short", strategy.short) plotshape(shortcondition, style=shape.arrowdown, location=location.belowbar, color=color.red) // } Short Entry // { Exit Conditions bought = strategy.position_size[1] < strategy.position_size sold = strategy.position_size[1] > strategy.position_size barsbought = barssince(bought) barssold = barssince(sold) slbuffer = input(title="SL Buffer", type=input.float, step=0.1, defval=0) // } Exit Conditions // { Lowest Low/ Highes High Exit Condition enablelowhigh = input(false, title="Enable lowest low/ highest high exit?") //Lowest Low LONG profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=2) loLen = input(title="Lowest Low Lookback", type=input.integer, defval=50, minval=2) stop_level_long = lowest(low, loLen)[1] if enablelowhigh == true and strategy.position_size>0 profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong) + slbuffer strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought] - slbuffer, limit=profit_level_long) //Lowest Low SHORT profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2) highLen = input(title="highest high lookback", type=input.integer, defval=50, minval=2) stop_level_short = highest(high, highLen)[1] if enablelowhigh == true and strategy.position_size<0 profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort) - slbuffer strategy.exit(id="TP/ SL", stop=stop_level_short[barssold] + slbuffer, limit=profit_level_short) // } Lowest Low/ Highes High Exit Condition // { ATR Take Profit/ Stop Loss enableatr = input(true, title="Enable ATR exit?") atrprofitfactorlong = input(title="ATR Profitfactor Long", type=input.float, step=0.1, defval=6) atrstopfactorlong = input(title="ATR Stopfactor Long", type=input.float, step=0.1, defval=5) atrprofitfactorshort = input(title="ATR Profitfactor Short", type=input.float, step=0.1, defval=3) atrstopfactorshort = input(title="ATR Stopfactor Short", type=input.float, step=0.1, defval=5) //ATR lengthATR = input(title="ATR Length", defval=11, minval=1) atr = atr(lengthATR) //LONG EXIT if (afterStartDate) and ((enableatr == true) and (strategy.opentrades > 0)) barsbought1 = barssince(bought) profit_level = strategy.position_avg_price + (atr*atrprofitfactorlong) stop_level = strategy.position_avg_price - (atr*atrstopfactorlong) strategy.exit("Take Profit/ Stop Loss", "long", stop=stop_level[barsbought1], limit=profit_level[barsbought1]) //SHORT EXIT if (afterStartDate) and ((enableatr == true) and (strategy.opentrades > 0)) barssold1 = barssince(sold) profit_level = strategy.position_avg_price - (atr*atrprofitfactorshort) stop_level = strategy.position_avg_price + (atr*atrstopfactorshort) strategy.exit("Take Profit/ Stop Loss", "short", stop=stop_level[barssold1], limit=profit_level[barssold1]) // } ATR Take Profit/ Stop Loss