이 전략은 가격 브레이크아웃을 사용하는 볼륨 기반의 동적 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)