このインディケーター/スタディスクリプトは,同じアラートが複数回発射されるという問題に直面したので作成しました.例えば,すでにロング状態にあるときにロング信号を起動します.非常に基本的な戦略では問題はありませんが,より大きなスクリプトと多くの変数で,複雑さを生み出すように見えました.
これは,TradingLine振動器によって解決され,新しい位置に切り替えたときのみ,アラートが起動します.
ロングが表示される場合,アラート設定では"継続ロング"と表示されます.この条件を使用して既存の位置 (オプション) に追加できます.継続信号は明るい緑色/赤色ドットとしてグラフ化されています.
この簡単な例スクリプトでは,EMA10,EMA200,emaPlus1AtrとemaMinus1Atrを使用します.
書き込みで使うには,自分の BUY/SELL/EXIT 信号を修正して追加する必要があります.
////ここであなたの買/売/出出シグナルを入力してください: ////
//////////////////////////////////////////////////
自分の取引戦略や脚本に対する 追加の視覚的確認として
バックテスト
/*backtest start: 2022-04-16 00:00:00 end: 2022-05-15 23:59:00 period: 2h basePeriod: 15m 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/ // © zombie76 //@version=5 indicator("ML Alerts Template [indicator]", shorttitle = "ML Alerts Template [indicator]", overlay=false) ///////////////////////////////////////////////////////////////////////// tradeshorts = input(title='- *Trade Shorts* - ', defval=true) tradeexitsignals = input(title='- *Trade Exits* -', defval=true) ///////////////////////////////////////////////////////////////////////// src = (close) source = (close) ///////////////////// EMA's //////////////////////// p10=input(title="EMA 1",defval=10) p200=input(title="EMA 2",defval=200) ema10=ta.ema(close,p10) ema200=ta.ema(close,p200) //////////////////////////////////////////////////// //************* ATR ***************// lengthatr = input(12, title="ATR Length") atr = ta.rma(ta.tr(true), lengthatr) ema = ta.ema(close, lengthatr) emaPlus1Atr = ema + atr emaMinus1Atr = ema - atr //************ END ATR ***********// ////////////////////////////// HIST /////////////////////////////////// fastLengthHist = input(title='Hist Fast Length',defval=12) slowLengthHist=input(title='Hist Slow Length',defval=26) signalLength=input(title='Hist Signal Length',defval=9) fastMA = ta.ema(source, fastLengthHist) slowMA = ta.ema(source, slowLengthHist) macd = fastMA - slowMA signal = ta.sma(macd, signalLength) hist = macd - signal /////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////// //// INPUT YOUR BUY/SELL/EXIT SIGNALS HERE: //// ////////////////////////////////////////////////// tradeups = ema10 > ema10[1] and low > emaMinus1Atr and hist > hist[1] // LONG tradeexits = tradeexitsignals and (ema10 < ema10[1]) and not tradeups // Exit Long tradedowns = ((ema10 < ema10[1] and hist < hist[1]) or (high > emaPlus1Atr and close < emaPlus1Atr and close < open and hist < hist[1])) and not tradeups // SHORT exitshort = low < emaMinus1Atr and close > open and ema10 > ema10[1] and hist > hist[1] // Exit Short ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////////////////// Buy Sell Line /////////////////////////////////////////// ////////////////////////// DO NOT EDIT ANYTHING BELOW ///////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// // Filters out signals if opposite signal is also on: heikDownColor() => tradedowns heikUpColor() => tradeups heikExitColor() => tradeexitsignals and tradeexits previnashort = 0 previnalong = 0 previnaexit = 0 // Heiki Down Filter // //short// inashort_filt = heikDownColor() and tradeshorts and not heikUpColor() previnashort := inashort_filt ? 1 : heikUpColor() ? -1 : previnashort[1] inashort2 = previnashort[1] == 1 // Heiki Up Filter // //long// inalong_filt = heikUpColor() and not (heikDownColor() or tradeexits) previnalong := inalong_filt ? 1 : heikDownColor() ? -1 : previnalong[1] inalong2 = previnalong[1] == 1 // Heiki Exit Filter // //exit// inaexit_filt = heikExitColor() and not heikDownColor() and not (heikUpColor() or tradeups) previnaexit := inaexit_filt ? 1 : heikDownColor() or heikUpColor() ? -1 : previnaexit[1] inaexit2 = previnaexit[1] == 1 // Heiki Exit Filter 2 // //exit short// previnasexits = 0 inasexits_filt = exitshort and (inashort2 or tradedowns) and not tradeups //and not tradedowns[1] previnasexits := inasexits_filt ? 1 : heikDownColor() or heikUpColor() ? -1 : previnasexits[1] inasexit2 = previnasexits[1] == 1 //and not exitshort[1] /////////////////////////////////////////////////////// heikDownColor_filt = (heikDownColor() and not heikUpColor()) or (heikDownColor() and not heikExitColor()) heikUpColor_filt = tradeups or ((heikUpColor() or inalong2) and not (tradeexits or tradedowns or (inaexit2 and not tradeups))) heikExitColor_filt = heikExitColor() and not (heikDownColor_filt or tradeups) heikNeuColor_filt = (heikUpColor() or heikDownColor() or tradeups) prev5 = 0 prev5 := (heikUpColor_filt and (not (tradedowns or tradeexits))) or tradeups ? 1000 : (tradeshorts and tradedowns) or not (inashort2 and (exitshort or inasexit2)) and (tradeshorts and (inashort2 or heikDownColor_filt)) ? -1000 : not (tradeups or heikUpColor_filt) and (((not tradeshorts and (heikExitColor_filt)) or (inashort2 and exitshort) or (tradeshorts and tradeexits and heikUpColor_filt and not (heikDownColor_filt)) or (tradeshorts and tradeexits and not heikDownColor_filt and not heikUpColor_filt))) ? 0 : prev5[0] plot(prev5, color=color.new(color.aqua, 10), style=plot.style_stepline, title='Trade Line') shortdata2 = prev5[0] == -1000 and (heikDownColor_filt or inashort2) //and heikNeuColor_filt longdata2 = prev5[0] == 1000 and (heikUpColor_filt or not (heikExitColor_filt or heikDownColor_filt)) exitdata2 = prev5[0] == 0 and not (heikNeuColor_filt or heikDownColor_filt) ////////////////////// END Buy Sell Line /////////////////////////////////// /////////////////////////////////// Plot Dots ////////////////////////////// plotshape(longdata2 and not tradeexits, style=shape.diamond, location=location.bottom, color=color.new(color.lime, 50)) //LONG plotshape(shortdata2 and tradeshorts, style=shape.diamond, location=location.bottom, color=color.new(color.red, 50)) // SHORT plotshape(exitdata2 and not (tradeups or heikUpColor_filt), style=shape.diamond, location=location.bottom, color=color.new(color.purple, 50)) // EXIT plotshape(tradeups and not tradeups[1], style=shape.diamond, location=location.bottom, color=color.new(color.lime, 0)) //LONG plotshape(tradedowns and tradeshorts and not tradedowns[1], style=shape.diamond, location=location.bottom, color=color.new(color.red, 0)) // SHORT plotshape(prev5[0] == 0 and (prev5[1] > 0 or prev5[1] < 0) and not (tradeups or heikUpColor_filt), style=shape.diamond, location=location.bottom, color=color.new(color.white, 70)) //////////////////////////////////////////////////////////////////////////// ///////////////////////////////// GoLong = prev5[0] > 0 and prev5[1] < 900 GoShort = prev5[0] < 0 and prev5[1] > -900 GoExit = prev5[0] == 0 and (prev5[1] > 0 or prev5[1] < 0) ///////////// Alerts //////////////// alertcondition(condition=GoLong, title="1_Warp LONG", message="LONG *") alertcondition(condition=GoShort and tradeshorts, title="2_Warp SHORT", message="SHORT *") alertcondition(condition=GoExit, title="3_EXIT Warp", message="EXIT *") ////// Alerts Add to Position ////// alertcondition(condition=tradeups and not exitdata2[1] and not tradeups[1], title="4_Warp Add to LONG", message="LONG *increase") alertcondition(condition=tradedowns and tradeshorts and not exitdata2[1] and not tradedowns[1], title="5_Warp Add to SHORT", message="SHORT *increase") //////////////// END ALL ///////////////////// if GoLong strategy.entry("Enter Long", strategy.long) else if GoShort strategy.entry("Enter Short", strategy.short)