Gitterstrategie mit gleitenden Durchschnittslinien

Schriftsteller:ChaoZhang, Datum: 2023-12-20 13:55:15
Tags:

img

Übersicht

Dies ist eine Gitterhandelsstrategie, die bewegliche Durchschnittslinien dynamisch nutzt. Sie zeichnet mehrere Kauf- und Verkaufszonen über und unter der beweglichen Durchschnittslinie anhand der Einstellungen des MA und der Volatilitätsspanne. Wenn der Preis in verschiedene Kaufzonen fällt, werden entsprechende Long-Orders geöffnet. Wenn der Preis in Verkaufszonen zurückkehrt, werden geöffnete Aufträge sequenziell geschlossen. So bildet ein dynamischer Gitterhandelsmechanismus.

Strategie Logik

  1. Die Benutzer setzen Parameter zur Bestimmung der großen gleitenden Durchschnittslinie;
  2. Mehrfache Kauf- und Verkaufszonen werden auf der Grundlage von ATR und Einstellungen unterteilt;
  3. Wenn der Preis in verschiedene Kaufzonen fällt, werden entsprechende Long-Orders ausgelöst.
  4. Wenn sich der Preis wieder in Verkaufszonen bewegt, werden die Aufträge sequenziell geschlossen.
  5. Schließlich entsteht ein dynamisches Netzhandelssystem.

Vorteile

  1. Die Verwendung der MA-Linie zur Bestimmung der Trendrichtung verhindert den Handel gegen den größeren Trend;
  2. Der ATR-Parameter berücksichtigt die Marktvolatilität und macht das Netz dynamischer.
  3. Eröffnungsbestellungen in Chargen kontrollieren Risiken;
  4. Schließbestellungen vermeiden einen kaskadenartigen Stop-Loss.
  5. Einfache Parameter, einfach zu bedienen.

Risiken

  1. Eine erhebliche Schwankung kann häufig zu Netzabfällen führen;
  2. Bei starken Trends könnten die Stop-Loss-Punkte zu nahe liegen, was zu schnellen Stopps nach dem Rückzug führen könnte.
  3. Erhöhte Transaktionen mit mehreren Einträgen führen zu höheren Provisionsgebühren;
  4. Nicht geeignet für Märkte mit Bandbreite oder ohne Trend.

Die Risiken können reduziert werden, indem das Netzintervall gelockert, der ATR-Parameter optimiert, die Auftragsmengen verringert usw. Für Trend- und Ranging-Szenarien könnten auch verschiedene Parameter verwendet werden.

Optimierungsrichtlinien

  1. Es können Spot-Indexindikatoren hinzugefügt werden, um eine bullische/bärenische Verzerrung zu ermitteln.
  2. Quantitative Indikatoren können zur Auswahl von Vermögenswerten mit Trendmerkmalen verwendet werden;
  3. ATR-Parameter oder Netzintervalle können dynamisch anhand der Volatilität angepasst werden;
  4. Der Profit-taking-Mechanismus kann hinzugefügt werden, um Trends zu verfolgen.

Diese weiteren Optimierungen werden die Strategie dynamischer und lokaler machen.

Schlussfolgerung

Zusammenfassend ist dies eine allgemeine ausgereifte und einfache Trend-Folge-Grid-Strategie. Es verwendet gleitende Durchschnitte, um wichtige Trends zu bestimmen, und etabliert einen dynamischen Gittermechanismus für Chargenhandel. Hat bestimmte Risikokontrollfunktionen. Mit weiteren Quant-Optimierungen kann es zu einem sehr praktischen Quant-Tool werden.


/*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



Mehr