この戦略の主なアイデアは,高速MAが遅いMAを横切ったときにロング,高速MAが遅いMAを横切ったときにショート,ポジションに入ると後続的なメリットを得ることを設定することです.価格がメリットを得るラインに達すると,後続的なメリットを得ることを誘発し,利益を最大化するために継続的にメリットを得るラインを調整します.
戦略は以下の主要な部分で構成されています.
移動平均を計算します. 移動平均は20で,移動平均は50です.
入場条件を決定します.速いMAが遅いMAを横切ったときにロング,速いMAが遅いMAを下回ったときにショートします.
トレンド方向を決定します. 長い信号と短い信号からバーの数を記録し,上昇傾向か下落傾向かを判断します.
入場価格.入場価格として取引信号が起動した時の価格を記録する.
利益を引き取る線を設定します.ロングの場合,利益を引き取る値は高く * (1 + 利益を引き取る割合);ショートの場合,利益を引き取る値は低く * (1 - 利益を引き取る割合).
利益を引き継いで 利益を引き継ぐ線は 調整を続け 利益の方向に固定した割合で動いています
価格が上昇すると 利益線を引く
オプションのアクティベーション機能もあります. 価格がアクティベーションレベルを突破したときのみ,後尾の取利益が起動します.
この戦略の最大の利点は,利益を引き継ぐことで利益を最大化することです.価格が有利方向に動くと,利益を引き継ぐ線は利益を引き継ぐ方向に動きます.
また,MAクロスオーバーでトレンドフィルタリングを追加し,トレンドではない市場で不必要なウィップソウを避ける.アクティベーション機能は,価格のわずかな変動によって利益を引き継ぐことを回避する.
トレンド,エントリー,収益を組み合わせることで トレンドに乗って継続的に利益を得て 収益を最大化できます
主なリスクは,利益を得るために適切な価格動きが必要である.価格が急速に逆転すると損失を引き起こす可能性があります.
また 変動する市場では 頻繁に 利益を引き出すことが 損失を引き起こす可能性があります
利得率が高すぎると リスクが上がります
リスクは,適切な利益率を設定し,不安定な市場での取引を避け,またはストップロスを使用することによって管理できます.
戦略は以下の側面で最適化できます.
より良い組み合わせを見つけるために異なる期間をテストすることで MA パラメータを最適化します.
異なるアクティベーションレベルをテストすることでアクティベーション機能を最適化します
バックテストによって利益率を最適化します
リスクをコントロールするために適切なレベルでストップロスを追加します
ボリューム,ATRストップなどの追加のフィルターをテストする.
株式や通貨や暗号などの市場でテストします
この戦略は,トレンド,エントリー,トライリング・テイク・プロフィートなどの複数のモジュールを統合し,トレンドに乗って利益を最大化します. しかし,リスクは管理され,不安定な市場を避け,使用する前にパラメータを最適化する必要があります.トライリング・テイク・プロフィートによってより大きな利益を得るアイデアを提供します.
/*backtest start: 2023-01-01 00:00:00 end: 2023-10-06 00:00:00 period: 2d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //@author=Daveatt SystemName = "BEST Trailing Profit Strategy" // This string is to personalize the text that appears with your orders on the chart through strategy() calls and entry/exit markers, and in the alert default message. // Although leaving it empty will not cause problems in study mode, TradeId = "BEST" // These values are used both in the strategy() header and in the script's relevant inputs as default values so they match. // Unless these values match in the script's Inputs and the TV backtesting Properties, results between them cannot be compared. InitCapital = 1000000 InitPosition = 100 InitCommission = 0.075 InitPyramidMax = 1 CalcOnorderFills = true CalcOnTick = true DefaultQtyType = strategy.fixed DefaultQtyValue = strategy.fixed Precision = 2 Overlay=true // strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay, // pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, // commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2) // strategy(title=SystemName, shorttitle=SystemName, overlay=true, // pyramiding=0, default_qty_value=100, precision=7, currency=currency.USD, // commission_value=0.2,commission_type=strategy.commission.percent, initial_capital=10000) // // Author: Daveatt // Revision: R0.1 Beta // Date: 8-Dec-2019 // // inputs src = input(defval=close, type=input.source, title="Source") slowLength = input(20, "Fast Length",minval=2,step=1) fastLength = input(50, "Fast Length",minval=2,step=1) // Calculate moving averages fastSMA = sma(src, slowLength) slowSMA = sma(src, fastLength) // Calculate trading conditions enterLong = crossover(fastSMA, slowSMA) enterShort = crossunder(fastSMA, slowSMA) // trend states since_buy = barssince(enterLong) since_sell = barssince(enterShort) buy_trend = since_sell > since_buy sell_trend = since_sell < since_buy change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1]) // get the entry price entry_price = valuewhen(enterLong or enterShort, src, 0) // Plot moving averages plot(series=fastSMA, color=color.teal) plot(series=slowSMA, color=color.orange) // Plot the entries plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small) plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small) /////////////////////////////// //======[ Take Profit ]======// /////////////////////////////// // Use TP? useTP = input(true, "Use take profit") // TP trailing ProfitTrailPerc = input(1.0, "Trailing Profit (%)",minval=0,step=0.5,type=input.float) * 0.01 use_TP_Trigger = input(true, "Use Take Profit Trigger") // Will trigger the take profit trailing once reached takeProfitTrigger = input(3.0, "Take Profit Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01 // ttp := ttp>tp ? tp : ttp takeprofitPriceTrigger = 0.0 takeprofitPriceTrigger := if (use_TP_Trigger) if (buy_trend) entry_price * (1 + takeProfitTrigger) else entry_price * (1 - takeProfitTrigger) else -1 //plot(entry_price, title='entry_price', transp=100) var TP_Trigger_Long_HIT = false TP_Trigger_Long_HIT := useTP and use_TP_Trigger and buy_trend and high >= takeprofitPriceTrigger ? true : TP_Trigger_Long_HIT[1] var TP_Trigger_Short_HIT = false TP_Trigger_Short_HIT := useTP and use_TP_Trigger and sell_trend and low <= takeprofitPriceTrigger ? true : TP_Trigger_Short_HIT[1] display_long_TP_trigger = useTP and buy_trend and TP_Trigger_Long_HIT == false and takeprofitPriceTrigger != -1 display_short_TP_trigger = useTP and sell_trend and TP_Trigger_Short_HIT == false and takeprofitPriceTrigger != -1 display_TP_trigger = display_long_TP_trigger or display_short_TP_trigger //🔷🔷🔷 // @hugo: Will display the TP trigger as long as not hit // once the TP trigger is hit, the TP trailing will activate plot(display_TP_trigger ? takeprofitPriceTrigger : na, title='takeprofitPriceTrigger', transp=0, color=color.orange, style=plot.style_cross, linewidth=3) longTrailTP= 0.0, shortTrailTP = 0.0 // Trailing Profit // Start trailing once trigger is reached longTrailTP := if useTP and buy_trend tpValue = high * (1 + ProfitTrailPerc) max(tpValue, longTrailTP[1]) else 0 shortTrailTP := if useTP and sell_trend tpValue = low * (1 - ProfitTrailPerc) min(tpValue, shortTrailTP[1]) else 999999 //plot(longTrailTP, title='debug longTrailTP', transp=100) //plot(shortTrailTP, title='debug shortTrailTP', transp=100) ////////////////////////////////////////////////////////////////////////////////////////// //*** TRAILING TAKE PROFIT HIT CONDITIONS TO BE USED IN ALERTS ***// ////////////////////////////////////////////////////////////////////////////////////////// //🔷🔷🔷 // @hugo: I use crossover/crossunder for the alerts to trigger the events only once cond_long_trail_tp_hit = useTP and buy_trend and crossover(high, longTrailTP[1]) and (TP_Trigger_Long_HIT or use_TP_Trigger == false) cond_short_trail_tp_hit = useTP and sell_trend and crossunder(low, shortTrailTP[1]) and (TP_Trigger_Short_HIT or use_TP_Trigger == false) // 🔷🔷🔷 // Plot take profits values for confirmation // Display the trailing TP until not hit plot(series= useTP and buy_trend and high <= longTrailTP and (TP_Trigger_Long_HIT or use_TP_Trigger == false) ? longTrailTP : na, color=color.aqua, style=plot.style_circles, linewidth=2, title="Long Trail TP") plot(series= useTP and sell_trend and low >= shortTrailTP and (TP_Trigger_Short_HIT or use_TP_Trigger == false) ? shortTrailTP : na, color=color.aqua, style=plot.style_circles, linewidth=2, title="Short Trail TP") close_long = cond_long_trail_tp_hit close_short = cond_short_trail_tp_hit // Submit entry orders strategy.entry("EL", long=true, when=enterLong) strategy.close("EL", when=close_long) //if (enterShort) strategy.entry("ES", long=false, when=enterShort) strategy.close("ES", when=close_short) /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////// ALERTS //////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////// //* Put Entry Alerts below *// ////////////////////////////// // IN STUDY MODE ONLY // ⚠️⚠️⚠️ For alerts on the signal itself ⚠️⚠️⚠️ //alertcondition(buy_event, "Open Long", "LONG") //alertcondition(sell_event, "Open Short", "SHORT") // For the closes you will want to trigger these alerts on condition with alert // option "Once Per Bar" for TP and SL if change_trend TP_Trigger_Long_HIT := false TP_Trigger_Short_HIT := false