En la carga de los recursos... Cargando...

Estrategia de negociación de promedios móviles múltiples

El autor:¿ Qué pasa?, Fecha: 2024-02-29 14:32:29
Las etiquetas:

img

Resumen general

La estrategia se llama Multiple Moving Average Trading Strategy. Utiliza el cruce del indicador MACD y múltiples promedios móviles como señales de negociación, con la ayuda del indicador ZLSMA para determinar la tendencia, y establece la lógica de salida de ganancias y stop-loss para realizar la negociación automatizada.

Principio de la estrategia

  1. Calcule la línea rápida, la línea lenta y el histograma MACD del indicador MACD. Establezca largo cuando vea cruz dorada y corto cuando vea cruz de muerte.

  2. Calcule las medias móviles de 5 días, 25 días, 45 días y 100 días.

  3. Calcule la distancia entre los dos grupos de medias móviles. Si la distancia excede un cierto umbral, significa la divergencia de las medias móviles, que se pueden establecer como señales comerciales.

  4. Calcular el indicador ZLSMA, que representa la dirección de tendencia a mediano y largo plazo del precio.

  5. Combine el cruce MACD, las señales de divergencia de la media móvil y el juicio de tendencia de ZLSMA para establecer estrategias comerciales largas y cortas.

  6. Establezca puntos de toma de ganancias y stop loss para realizar la lógica de salida automatizada.

Análisis de ventajas

  1. Las señales de múltiples filtros mejoran la eficiencia de la estrategia.

  2. La ZLSMA ayuda a determinar la dirección de la tendencia a medio y largo plazo para evitar la negociación contra la tendencia.

  3. La salida automatizada mediante el establecimiento de puntos de toma de ganancias y stop-loss reduce la frecuencia de la intervención humana.

Análisis de riesgos

  1. Los parámetros deben optimizarse para obtener los mejores resultados.

  2. Los puntos fijos de toma de ganancias y de parada de pérdidas limitan el potencial de ganancias o aumentan las pérdidas.

  3. Las estrategias de media móvil funcionan mal en los mercados de rango limitado, pudiendo necesitarse otros indicadores o intervención manual.

Direcciones de optimización

  1. Optimizar las combinaciones de parámetros de la media móvil mediante pruebas de diferentes medias móviles de longitud.

  2. Prueba añadiendo otros indicadores como KDJ y BOLL para determinar los puntos de entrada y salida.

  3. Pruebe estrategias dinámicas de stop loss basadas en medidas de volatilidad.

  4. Agregue modelos de aprendizaje automático para encontrar parámetros óptimos automáticamente.

Conclusión

Esta estrategia integra MACD, múltiples promedios móviles y determinación de tendencias ZLSMA para lograr una negociación automatizada. Al filtrar con múltiples señales, se mejora la estabilidad de la estrategia; al establecer la lógica de salida, se reducen los riesgos. Hay cierto valor práctico para el comercio real. La optimización posterior de parámetros, la expansión del indicador, las paradas dinámicas, etc. pueden mejorar aún más el rendimiento de la estrategia.


/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("MACD ZLSMA_izumi⑤(4つの条件、MCDがクロスしてたら)", overlay=true)

fast_length = input(title = "Fast Length", defval = 12)
slow_length = input(title = "Slow Length", defval = 26)
src = input(title = "Source", defval = close)
signal_length = input.int(title = "Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type",  defval = "EMA", options = ["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"])
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

alertcondition(hist[1] >= 0 and hist < 0, title = 'Rising to falling', message = 'The MACD histogram switched from a rising to falling state')
alertcondition(hist[1] <= 0 and hist > 0, title = 'Falling to rising', message = 'The MACD histogram switched from a falling to rising state')

hline(0, "Zero Line", color = color.new(#787B86, 50))
plot(hist, title = "Histogram", style = plot.style_columns, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)))
plot(macd,   title = "MACD",   color = #2962FF)
plot(signal, title = "Signal", color = #FF6D00)

//MACDクロス設定
enterLong = ta.crossover(macd, signal)
enterShort = ta.crossunder(macd, signal)

//移動平均線の期間を設定
ema5 = input(5, title="ma期間5")
ema25 = input(25, title="ma期間25")
ema45 = input(45, title="ma期間45")
ema100 = input(100, title="ma期間100")

//移動平均線を計算
//sma関数で「ema25」バー分のcloseを移動平均線として「Kema」に設定
Kema5 = ta.sma(close,ema5)
Kema25 = ta.sma(close,ema25)
Kema45 = ta.sma(close,ema45)
Kema100 = ta.sma(close,ema100)



//移動平均線をプロット
plot(Kema5, color=color.rgb(82, 249, 255),title="ema5")
plot(Kema25, color=color.red,title="ema25")
plot(Kema45, color=color.blue,title="ema45")
plot(Kema100, color=color.green,title="ema100")

//ema同士の距離が30以上の時に「distancOK」にTureを返す
//distance1 = math.abs(Kema5-Kema25)
distance2 = math.abs(Kema25-Kema45)
distanceValue1 = input(0.030, title ="ema同士の乖離値") 
//distanceOk1 = distance1 > distanceValue1
distanceOk2 = distance2 > distanceValue1

//2区間のema同士の距離が30以上の時に「distanceOKK」にTrueを返す
//distanceOkK1 = distanceOk1 and distanceOk2
distanceOkK1 = distanceOk2

//5EMAとロウソクの乖離判定
//DistanceValue5ema = input(0.03, title ="5emaとロウソクの乖離率")
//emaDistance = math.abs(Kema5 - close)
//emaDistance5ema = emaDistance < DistanceValue5ema

//ZLSMA追加のコード
length = input.int(32, title="Length")
offset = input.int(0, title="offset")
src2 = input(close, title="Source")
lsma = ta.linreg(src2, length, offset)
lsma2 = ta.linreg(lsma, length, offset)
eq= lsma-lsma2
zlsma = lsma+eq
//ZLSMAのプロット
plot(zlsma, color=color.yellow, linewidth=3)

//ZLSMAの前回高値を検索
//var float zlsmaHigh = na
//var float zlsmaHighValue = na
//if ta.highest(zlsma,35) == zlsma[3]
//    zlsmaHighValue := zlsmaHigh
//    zlsmaHigh := zlsma[3]

//if (na(zlsmaHighValue))
 //   zlsmaHighValue := zlsmaHigh

//ZLSMAの前回安値を検索
//var float zlsmaLow = na
//var float zlsmaLowValue = na
//if ta.lowest(zlsma,35) == zlsma[3]
//    zlsmaLowValue := zlsmaLow
//    zlsmaLow := zlsma[3]

///if (na(zlsmaLowValue))
//    zlsmaLowValue := zlsmaLow

//利確・損切りポイントの初期化(変数の初期化)
var longProfit = 0.0
var longStop = 0.0
var shortProfit = 0.0
var shortStop = 0.0

//inputで設定画面の選択項目を設定
longProfitValue = input(0.06, title ="ロング利確pips")
shortProfitValue = input(-0.06, title ="ショート利確pips")
longStopValue = input(-0.06, title ="ロング損切pips")
shortStopValue = input(0.06, title ="ショート損切pips")

// クロスの強さを推定 
//angleThreshold = input(0.001, title = "クロスの強さ調節" )

// クロスの強さの閾値、この値を調整してクロスの強さの基準を変える 
//macdDiff = macdLine - signalLine 
//strongCross = math.abs(macdDiff) > angleThreshold 

// エントリー条件 (MACDラインとシグナルラインがクロス)
//ta.crossover(macdLine, signalLine) and strongCross 


//ロングエントリー条件
if  distanceOkK1 and enterLong
	strategy.entry("long", strategy.long, comment="long")
    longProfit := close + longProfitValue
    longStop := close + longStopValue

//    if na(strategy.position_avg_price) and close>strategy.position_avg_price + 0.05 * syminfo.mintick 
 //       longStop := strategy.position_avg_price + 10 * syminfo.mintick
  //  strategy.exit("exit", "long",stop = longStop)

strategy.exit("exit", "long", limit = longProfit,stop = longStop)


if  distanceOkK1 and enterShort
	strategy.entry("short", strategy.short, comment="short")
    shortProfit := close + shortProfitValue
    shortStop := close + shortStopValue

 //   if na(strategy.position_avg_price) and close>strategy.position_avg_price - 0.05 * syminfo.mintick 
  //      shortStop := strategy.position_avg_price - 0.1 * syminfo.mintick
  //  strategy.exit("exit", "long",stop = longStop)


strategy.exit("exit", "short", limit = shortProfit,stop = shortStop)
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Más.