この戦略は"Triple EMAと線形回帰に基づいたトレンドフォロー戦略"と呼ばれる.トレンド方向を特定するために,三重指数移動平均線と線形回帰線のクロスオーバーを使用して,利潤をロックするために適応ストップロスを設定する.
トリプルEMA (TEMA) は,単一EMAとダブルEMAの強みを組み合わせ,価格傾向の変化をより敏感に捉える.線形回帰線は,価格の長期的な均衡傾向を反映する.短期TEMAが長期線形回帰線を超えると,長期取引を検討する上向きの傾向を示唆する.反対はショートを検討する下向きの傾向を示唆する.
この戦略は,市場変動に基づいてストップ距離を設定し調整する.これは固定ストップを回避し,ストップが市場変動を適応的に追跡することを可能にします.
この戦略の利点は,指標コンボがトレンド方向を比較的正確に特定することにある.適応型ストップロスの方法もより高度である.しかし,パラメータは特定の製品に対して慎重にテストおよび最適化され,市場の変化に常に適応する必要があります.
要するに,複数の技術指標を合理的に統合し,厳格なリスク管理措置を講じることで,戦略取引の効率化とリスクを軽減する能力が向上できる.
/*backtest start: 2023-01-01 00:00:00 end: 2023-02-20 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Wunderbit Trading //@version=4 strategy("Automated Bitcoin (BTC) Investment Strategy", overlay=true, initial_capital=5000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent,commission_value=0.1) //////////// Functions Atr(p) => atr = 0. Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1]))) atr := nz(atr[1] + (Tr - atr[1])/p,Tr) //TEMA TEMA(series, length) => if (length > 0) ema1 = ema(series, length) ema2 = ema(ema1, length) ema3 = ema(ema2, length) (3 * ema1) - (3 * ema2) + ema3 else na tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"]) /////////////////////////////////////////////////// /// INDICATORS source=close /// TREND trend_type1 = input("TEMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"]) trend_type2 = input("LSMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"]) trend_type1_length=input(25, "Length of the First Trend Line") trend_type2_length=input(100, "Length of the Second Trend Line") leadLine1 = if trend_type1=="LSMA" linreg(close, trend_type1_length, 0) else if trend_type1=="TEMA" TEMA(close,trend_type1_length) else if trend_type1 =="EMA" ema(close,trend_type1_length) else sma(close,trend_type1_length) leadLine2 = if trend_type2=="LSMA" linreg(close, trend_type2_length, 0) else if trend_type2=="TEMA" TEMA(close,trend_type2_length) else if trend_type2 =="EMA" ema(close,trend_type2_length) else sma(close,trend_type2_length) p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) //Upward Trend UT=crossover(leadLine1,leadLine2) DT=crossunder(leadLine1,leadLine2) // TP/ SL/ FOR LONG // TAKE PROFIT AND STOP LOSS long_tp1_inp = input(15, title='Long Take Profit 1 %', step=0.1)/100 long_tp1_qty = input(20, title="Long Take Profit 1 Qty", step=1) long_tp2_inp = input(30, title='Long Take Profit 2%', step=0.1)/100 long_tp2_qty = input(20, title="Long Take Profit 2 Qty", step=1) long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) long_sl_input = input(5, title='stop loss in %', step=0.1)/100 long_sl_input_level = strategy.position_avg_price * (1 - long_sl_input) // Stop Loss multiplier = input(3.5, "SL Mutiplier", minval=1, step=0.1) ATR_period=input(8,"ATR period", minval=1, step=1) // Strategy //LONG STRATEGY CONDITION SC = input(close, "Source", input.source) SL1 = multiplier * Atr(ATR_period) // Stop Loss Trail1 = 0.0 Trail1 := iff(SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0), min(nz(Trail1[1], 0), SC + SL1), iff(SC > nz(Trail1[1], 0), SC - SL1, SC + SL1)) Trail1_high=highest(Trail1,50) // iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1), entry_long=crossover(leadLine1,leadLine2) and Trail1_high < close exit_long = close < Trail1_high or crossover(leadLine2,leadLine1) or close < long_sl_input_level ///// BACKTEST PERIOD /////// testStartYear = input(2016, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(9999, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false if testPeriod() if tradeType=="LONG" or tradeType=="BOTH" if strategy.position_size == 0 or strategy.position_size > 0 strategy.entry("long", strategy.long, comment="BUY", when=entry_long) strategy.exit("TP1", "long", qty_percent=long_tp1_qty, limit=long_take_level_1) strategy.exit("TP2", "long", qty_percent=long_tp2_qty, limit=long_take_level_2) strategy.close("long", when=exit_long, comment="SL" ) // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit") plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit") plot(strategy.position_size > 0 ? Trail1_high : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")