이것은 움직이는 평균선을 동적으로 활용하는 그리드 트레이딩 전략이다. 그것은 MA와 변동성 범위의 설정을 기반으로 움직이는 평균 라인의 위와 아래의 여러 구매 및 판매 구역을 그린다. 가격이 다른 구매 구역으로 떨어지면 대응하는 긴 오더가 열릴 것이다. 가격이 판매 구역으로 돌아갈 때 열린 오더가 순차적으로 닫힐 것이다. 따라서 동적인 그리드 거래 메커니즘을 형성한다.
리스크는 그리드 간격을 완화하고, ATR 매개 변수를 최적화하고, 주문 양을 줄여서 등을 통해 줄일 수 있습니다. 트렌딩 및 범위 시나리오에 다른 매개 변수 세트를 사용할 수도 있습니다.
이러한 추가 최적화는 전략을 더 역동적이고 지역적으로 향상시킬 것입니다.
결론적으로, 이것은 전체적으로 성숙하고 간단한 트렌드 추종 그리드 전략이다. 주요 트렌드를 결정하기 위해 이동 평균을 사용하며, 래치 트레이드에 대한 동적 그리드 메커니즘을 구축한다. 특정 리스크 제어 기능을 가지고 있다. 추가 양자 최적화로 매우 실용적인 양자 도구가 될 수 있다.
/*backtest start: 2022-12-13 00:00:00 end: 2023-12-19 00:00:00 period: 1d basePeriod: 1h 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/ // © Seungdori_ //@version=5 strategy("Grid Strategy with MA", overlay=true, initial_capital = 100000, default_qty_type = strategy.cash, default_qty_value = 10000, pyramiding = 10, process_orders_on_close = true, commission_type = strategy.commission.percent, commission_value = 0.04) //Inputs// length = input.int(defval = 100, title = 'MA Length', group = 'MA') MA_Type = input.string("SMA", title="MA Type", options=['EMA', 'HMA', 'LSMA', 'RMA', 'SMA', 'WMA'],group = 'MA') logic = input.string(defval='ATR', title ='Grid Logic', options = ['ATR', 'Percent']) band_mult = input.float(2.5, step = 0.1, title = 'Band Multiplier/Percent', group = 'Parameter') atr_len = input.int(defval=100, title = 'ATR Length', group ='parameter') //Var// var int order_cond = 0 var bool order_1 = false var bool order_2 = false var bool order_3 = false var bool order_4 = false var bool order_5 = false var bool order_6 = false var bool order_7 = false var bool order_8 = false var bool order_9 = false var bool order_10 = false var bool order_11 = false var bool order_12 = false var bool order_13 = false var bool order_14 = false var bool order_15 = false ///////////////////// //Region : Function// ///////////////////// getMA(source ,ma_type, length) => maPrice = ta.ema(source, length) ema = ta.ema(source, length) sma = ta.sma(source, length) if ma_type == 'SMA' maPrice := ta.sma(source, length) maPrice if ma_type == 'HMA' maPrice := ta.hma(source, length) maPrice if ma_type == 'WMA' maPrice := ta.wma(source, length) maPrice if ma_type == "RMA" maPrice := ta.rma(source, length) if ma_type == "LSMA" maPrice := ta.linreg(source, length, 0) maPrice main_plot = getMA(ohlc4, MA_Type, length) atr = ta.atr(length) premium_zone_1 = logic == 'ATR' ? ta.ema(main_plot + atr*(band_mult*1), 5) : ta.ema((main_plot*(1+band_mult*0.01*1)), 5) premium_zone_2 = logic == 'ATR' ? ta.ema(main_plot + atr*(band_mult*2), 5) : ta.ema((main_plot*(1+band_mult*0.01*2)), 5) premium_zone_3 = logic == 'ATR' ? ta.ema(main_plot + atr*(band_mult*3), 5) : ta.ema((main_plot*(1+band_mult*0.01*3)), 5) premium_zone_4 = logic == 'ATR' ? ta.ema(main_plot + atr*(band_mult*4), 5) : ta.ema((main_plot*(1+band_mult*0.01*4)), 5) premium_zone_5 = logic == 'ATR' ? ta.ema(main_plot + atr*(band_mult*5), 5) : ta.ema((main_plot*(1+band_mult*0.01*5)), 5) premium_zone_6 = logic == 'ATR' ? ta.ema(main_plot + atr*(band_mult*6), 5) : ta.ema((main_plot*(1+band_mult*0.01*6)), 5) premium_zone_7 = logic == 'ATR' ? ta.ema(main_plot + atr*(band_mult*7), 5) : ta.ema((main_plot*(1+band_mult*0.01*7)), 5) premium_zone_8 = logic == 'ATR' ? ta.ema(main_plot + atr*(band_mult*8), 5) : ta.ema((main_plot*(1+band_mult*0.01*8)), 5) //premium_zone_9 = ta.rma(main_plot + atr*(band_mult*9), 5) //premium_zone_10 = ta.rma(main_plot + atr*(band_mult*10), 5) discount_zone_1 = logic == 'ATR' ? ta.ema(main_plot - atr*(band_mult*1), 5) : ta.ema((main_plot*(1-band_mult*0.01*1)), 5) discount_zone_2 = logic == 'ATR' ? ta.ema(main_plot - atr*(band_mult*2), 5) : ta.ema((main_plot*(1-band_mult*0.01*2)), 5) discount_zone_3 = logic == 'ATR' ? ta.ema(main_plot - atr*(band_mult*3), 5) : ta.ema((main_plot*(1-band_mult*0.01*3)), 5) discount_zone_4 = logic == 'ATR' ? ta.ema(main_plot - atr*(band_mult*4), 5) : ta.ema((main_plot*(1-band_mult*0.01*4)), 5) discount_zone_5 = logic == 'ATR' ? ta.ema(main_plot - atr*(band_mult*5), 5) : ta.ema((main_plot*(1-band_mult*0.01*5)), 5) discount_zone_6 = logic == 'ATR' ? ta.ema(main_plot - atr*(band_mult*6), 5) : ta.ema((main_plot*(1-band_mult*0.01*6)), 5) discount_zone_7 = logic == 'ATR' ? ta.ema(main_plot - atr*(band_mult*7), 5) : ta.ema((main_plot*(1-band_mult*0.01*7)), 5) discount_zone_8 = logic == 'ATR' ? ta.ema(main_plot - atr*(band_mult*8), 5) : ta.ema((main_plot*(1-band_mult*0.01*8)), 5) //discount_zon_9 = ta.sma(main_plot - atr*(band_mult*9), 5) //discount_zone_10 =ta.sma( main_plot - atr*(band_mult*10), 5) //Region End// //////////////////// // Region : Plots// /////////////////// dis_low1 = plot(discount_zone_1, color=color.new(color.green, 80)) dis_low2 = plot(discount_zone_2, color=color.new(color.green, 70)) dis_low3 = plot(discount_zone_3, color=color.new(color.green, 60)) dis_low4 = plot(discount_zone_4, color=color.new(color.green, 50)) dis_low5 = plot(discount_zone_5, color=color.new(color.green, 40)) dis_low6 = plot(discount_zone_6, color=color.new(color.green, 30)) dis_low7 = plot(discount_zone_7, color=color.new(color.green, 20)) dis_low8 = plot(discount_zone_8, color=color.new(color.green, 10)) //dis_low9 = plot(discount_zone_9, color=color.new(color.green, 0)) //dis_low10 = plot(discount_zone_10, color=color.new(color.green, 0)) plot(main_plot, color =color.new(color.gray, 10)) pre_up1 = plot(premium_zone_1, color=color.new(color.red, 80)) pre_up2 = plot(premium_zone_2, color=color.new(color.red, 70)) pre_up3 = plot(premium_zone_3, color=color.new(color.red, 60)) pre_up4 = plot(premium_zone_4, color=color.new(color.red, 50)) pre_up5 = plot(premium_zone_5, color=color.new(color.red, 40)) pre_up6 = plot(premium_zone_6, color=color.new(color.red, 30)) pre_up7 = plot(premium_zone_7, color=color.new(color.red, 20)) pre_up8 = plot(premium_zone_8, color=color.new(color.red, 10)) //pre_up9 = plot(premium_zone_9, color=color.new(color.red, 0)) //pre_up10 = plot(premium_zone_10, color=color.new(color.red, 0)) fill(dis_low1, dis_low2, color=color.new(color.green, 95)) fill(dis_low2, dis_low3, color=color.new(color.green, 90)) fill(dis_low3, dis_low4, color=color.new(color.green, 85)) fill(dis_low4, dis_low5, color=color.new(color.green, 80)) fill(dis_low5, dis_low6, color=color.new(color.green, 75)) fill(dis_low6, dis_low7, color=color.new(color.green, 70)) fill(dis_low7, dis_low8, color=color.new(color.green, 65)) //fill(dis_low8, dis_low9, color=color.new(color.green, 60)) //fill(dis_low9, dis_low10, color=color.new(color.green, 55)) fill(pre_up1, pre_up2, color=color.new(color.red, 95)) fill(pre_up2, pre_up3, color=color.new(color.red, 90)) fill(pre_up3, pre_up4, color=color.new(color.red, 85)) fill(pre_up4, pre_up5, color=color.new(color.red, 80)) fill(pre_up5, pre_up6, color=color.new(color.red, 75)) fill(pre_up6, pre_up7, color=color.new(color.red, 70)) fill(pre_up7, pre_up8, color=color.new(color.red, 65)) //fill(pre_up8, pre_up9, color=color.new(color.red, 60)) //fill(pre_up9, pre_up10, color=color.new(color.red, 55)) //Region End// /////////////////////// //Region : Strategies// /////////////////////// //Longs// longCondition1 = ta.crossunder(low, discount_zone_7) longCondition2 = ta.crossunder(low, discount_zone_6) longCondition3 = ta.crossunder(low, discount_zone_5) longCondition4 = ta.crossunder(low, discount_zone_4) longCondition5 = ta.crossunder(low, discount_zone_3) longCondition6 = ta.crossunder(low, discount_zone_2) longCondition7 = ta.crossunder(low, discount_zone_1) longCondition8 = ta.crossunder(low, main_plot) longCondition9 = ta.crossunder(low, premium_zone_1) longCondition10 = ta.crossunder(low, premium_zone_2) longCondition11 = ta.crossunder(low, premium_zone_3) longCondition12 = ta.crossunder(low, premium_zone_4) longCondition13 = ta.crossunder(low, premium_zone_5) longCondition14 = ta.crossunder(low, premium_zone_6) longCondition15 = ta.crossunder(low, premium_zone_7) if (longCondition1) and order_1 == false strategy.entry("Long1", strategy.long) order_1 := true if (longCondition2) and order_2 == false strategy.entry("Long2", strategy.long) order_2 := true if (longCondition3) and order_3 == false strategy.entry("Long3", strategy.long) order_3 := true if (longCondition4) and order_4 == false strategy.entry("Long4", strategy.long) order_4 := true if (longCondition5) and order_5 == false strategy.entry("Long5", strategy.long) order_5 := true if (longCondition6) and order_6 == false strategy.entry("Long6", strategy.long) order_6 := true if (longCondition7) and order_7 == false strategy.entry("Long7", strategy.long) order_7 := true if (longCondition8) and order_8 == false strategy.entry("Long8", strategy.long) order_8 := true if (longCondition9) and order_9 == false strategy.entry("Long9", strategy.long) order_9 := true if (longCondition10) and order_10 == false strategy.entry("Long10", strategy.long) order_10 := true if (longCondition11) and order_11 == false strategy.entry("Long11", strategy.long) order_11 := true if (longCondition12) and order_12 == false strategy.entry("Long12", strategy.long) order_12 := true if (longCondition13) and order_13 == false strategy.entry("Long13", strategy.long) order_13 := true if (longCondition14) and order_14 == false strategy.entry("Long14", strategy.long) order_14 := true if (longCondition15) and order_15 == false strategy.entry("Long14", strategy.long) order_15 := true //Close// shortCondition1 = ta.crossover(high, discount_zone_6) shortCondition2 = ta.crossover(high, discount_zone_5) shortCondition3 = ta.crossover(high, discount_zone_4) shortCondition4 = ta.crossover(high, discount_zone_3) shortCondition5 = ta.crossover(high, discount_zone_2) shortCondition6 = ta.crossover(high, discount_zone_1) shortCondition7 = ta.crossover(high, main_plot) shortCondition8 = ta.crossover(high, premium_zone_1) shortCondition9 = ta.crossover(high, premium_zone_2) shortCondition10 = ta.crossover(high, premium_zone_3) shortCondition11 = ta.crossover(high, premium_zone_4) shortCondition12 = ta.crossover(high, premium_zone_5) shortCondition13 = ta.crossover(high, premium_zone_6) shortCondition14 = ta.crossover(high, premium_zone_7) shortCondition15 = ta.crossover(high, premium_zone_8) if (shortCondition1) and order_1 == true strategy.close("Long1") order_1 := false if (shortCondition2) and order_2 == true strategy.close("Long2") order_2 := false if (shortCondition3) and order_3 == true strategy.close("Long3") order_3 := false if (shortCondition4) and order_4 == true strategy.close("Long4") order_4 := false if (shortCondition5) and order_5 == true strategy.close("Long5") order_5 := false if (shortCondition6) and order_6 == true strategy.close("Long6") order_6 := false if (shortCondition7) and order_7 == true strategy.close("Long7") order_7 := false if (shortCondition8) and order_8 == true strategy.close("Long8") order_8 := false if (shortCondition9) and order_9 == true strategy.close("Long9") order_9 := false if (shortCondition10) and order_10 == true strategy.close("Long10") order_10 := false if (shortCondition11) and order_11 == true strategy.close("Long11") order_11 := false if (shortCondition12) and order_12 == true strategy.close("Long12") order_12 := false if (shortCondition13) and order_13 == true strategy.close("Long13") order_13 := false if (shortCondition14) and order_14 == true strategy.close("Long14") order_14 := false if (shortCondition15) and order_15 == true strategy.close("Long15") order_15 := false