A estratégia é chamada de
Calcule a linha rápida, a linha lenta e o histograma MACD do indicador MACD. Definir longo quando ver cruz de ouro e curto quando ver cruz de morte.
Calcule as médias móveis de 5 dias, 25 dias, 45 dias e 100 dias.
Calcule a distância entre os dois grupos de médias móveis. Se a distância exceder um certo limite, significa a divergência das médias móveis, que podem ser definidas como sinais de negociação.
Calcule o indicador ZLSMA, que representa a direção da tendência de médio a longo prazo do preço.
Combine o crossover MACD, os sinais de divergência da média móvel e o julgamento da tendência do ZLSMA para definir estratégias de negociação longas e curtas.
Configure os pontos de lucro e stop loss para realizar a lógica de saída automatizada.
Os sinais de múltiplos filtros melhoram a eficiência da estratégia.
A ZLSMA ajuda a determinar a direcção da tendência a médio e longo prazo para evitar a negociação contra a tendência.
A saída automatizada, definindo pontos de lucro e stop-loss, reduz a frequência de intervenção humana.
Para obter os melhores resultados, os parâmetros precisam ser otimizados.
Pontos fixos de captação de lucro e stop-loss limitam o potencial de lucro ou aumentam as perdas.
As estratégias de média móvel funcionam mal em mercados de intervalo, podendo ser necessários outros indicadores ou intervenção manual.
Otimizar as combinações de parâmetros da média móvel através do ensaio de médias móveis de comprimento diferente.
Teste adicionando outros indicadores, tais como KDJ e BOLL, para determinar os pontos de entrada e saída.
Tente estratégias dinâmicas de stop loss baseadas em medidas de volatilidade.
Adicione modelos de aprendizagem de máquina para encontrar parâmetros ideais automaticamente.
Esta estratégia integra MACD, múltiplas médias móveis e determinação de tendência ZLSMA para alcançar a negociação automatizada. Ao filtrar com múltiplos sinais, a estabilidade da estratégia é melhorada; ao definir a lógica de saída, os riscos são reduzidos. Há certo valor prático para a negociação real. A otimização subsequente de parâmetros, expansão do indicador, paradas dinâmicas etc. podem melhorar ainda mais o desempenho da estratégia.
/*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)