この戦略は,価格ブレイクを使用するボリュームベースのダイナミックDCA戦略である. 最新の価格低値を特定し,価格がその低値を下回り,取引量が増加するとポジションを構築し始める. 価格が低下し続けると,戦略は,設定された総ポジション数に達するまで浮動損失の大きさに基づいて各ポジションの量を動的に調整する. 同時に,戦略は,歴史的な価格減少パーセントの中位値に基づいて利益を得る価格を設定する.
この戦略は,ポジションのサイズを動的に調整し,歴史的なデータに基づいてパラメータを設定することで,価格リバウンド中により大きな利益を追求しながらリスクを制御することを目的としています.しかし,戦略のパフォーマンスはパラメータ設定と市場状況に大きく依存しており,リスクは依然として存在しています.より多くの指標を導入し,マネーマネジメントを最適化し,適応型テイク・プロフィートとストップ・ロスを使用することで,戦略のパフォーマンスをさらに改善することができます.
/*backtest start: 2024-04-04 00:00:00 end: 2024-04-11 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © AHMEDABDELAZIZZIZO //@version=5 strategy("Qfl Dca strategy", overlay=true) // Parameters swing = input(3 , title = "Swing Points") mediandropmult = input.float(1.1, "Median drop Mult", step=0.1 , tooltip = "The script Calculate The Median Drop for all last Bases That Was cracked you can Increase or decrease it") floatinglossvalue = input(-5 , "Floating Loss" , tooltip = "Position Floating Loss to start firs DCA order") num_orders = input(5 , "Number of all orders" , tooltip = " The number of orders is including the base order and the DCA orders the script will alculate every order qty based on the orders number So that the position size doubles with every order") length = input(20, title="Length of relative volume" ,tooltip = " the length of relative volume indicator") mult = input(2.0, title="Volume Multiplier" , tooltip = "you can adjust the relative volume multiplier to find best parameter") tpmult = input.float(1, step=0.1 ,title = "Take Profit Multiplier" ,tooltip = " By default, the script is set to take profits based on the same median drop percent you can adjust it as you like") // Pivot Calculation p = ta.pivotlow(low, swing, swing) v = ta.valuewhen(p, low[swing], 0) // Variables var float[] lows = array.new_float() var float chn = na // Calculate drops if v < v[1] chn := (v[1] - v) / v[1] * 100 if array.size(lows) < 4000 array.push(lows, chn) else array.shift(lows) array.push(lows, chn) mediandrop = array.avg(lows) maxdrop = array.max(lows) mindrop = array.min(lows) // Table display textcolor = color.white // tabl = table.new(position=position.top_right, columns=4, rows=4) // table.cell(table_id=tabl, column=1, row=1, text="Avg Drop %", width=15, text_color=textcolor) // table.cell(table_id=tabl, column=2, row=1, text="Min Drop %", width=15, text_color=textcolor) // table.cell(table_id=tabl, column=3, row=1, text="Max Drop %", width=15, text_color=textcolor) // table.cell(table_id=tabl, column=1, row=2, text=str.tostring(mediandrop), width=10, text_color=textcolor) // table.cell(table_id=tabl, column=2, row=2, text=str.tostring(mindrop), width=10, text_color=textcolor) // table.cell(table_id=tabl, column=3, row=2, text=str.tostring(maxdrop), width=10, text_color=textcolor) // Plot support t = fixnan(ta.pivotlow(low, swing, swing)) plot(t, color=ta.change(t) ? na : #03f590b6, linewidth=3, offset=-(swing), title="Support") // Calculate relative volume avgVolume = ta.sma(volume, length) relVolume = volume / avgVolume // Base Activation var bool baseisactive = na if not na(p) baseisactive := true // Buy Signal Calculation buyprice = v * (1 - (mediandrop / 100) * mediandropmult) signal = close <= buyprice and relVolume > mult and baseisactive // Take Profit Calculation tpsl = (mediandrop / 100) tp = (strategy.position_avg_price * (1 + (tpsl * tpmult))) // Position Sizing capital_per_order(num_orders, equity) => equity / math.pow(2, (num_orders - 1)) equity_per_order = capital_per_order(num_orders, strategy.equity) qty_per_order(equity_per_order, order_number) => equity_per_order * order_number / close // Calculate floating loss floatingLoss = ((close - strategy.position_avg_price) / strategy.position_avg_price) * 100 // Strategy Entries if signal and strategy.opentrades == 0 strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, 1)) baseisactive := false for i = 1 to num_orders -1 if signal and strategy.opentrades == i and floatingLoss <= floatinglossvalue strategy.entry("Buy", strategy.long, qty=qty_per_order(equity_per_order, i), comment="DCA Order" + str.tostring(i)) baseisactive := false // Strategy Exit strategy.exit("exit", "Buy", limit=tp) // Plot plot(strategy.position_avg_price, color=color.rgb(238, 255, 0), style=plot.style_linebr, linewidth=2)