
この戦略は,動的抵抗サポート帯とMA均線の交差を入場信号として使用し,トレンドトラッキングのストップダスの方法を使用して,長線トラッキングの利益を実現します.
動的抵抗位とサポート位をパーセント統計方法を使って計算し,可能な反転領域を構成する.
価格が逆転領域に入ると,MAの快線を突破するか,MAの慢線を突破するかを判断し,取引シグナルを生成する.
入場後,ストップ・トラッキングを起動し,ダイナミック・ストップ・ロスを採用して利益をロックし,トレンドを追跡する.
価格がストップ・ローズまたはストップ・ポジションを触発すると,平仓を退場する.
ダイナミック・レジスタンス・サポート帯は,入場精度を向上させるため,反転可能な領域を識別できます.
MA平均線交差は,偽信号を避けるために,百位通路と結合する.
ストップ・ロスト・トラッキング方式は,利益を効果的にロックし,撤回拡大を防止する.
複数のパラメータを設定し,異なる市場環境に対応します.
偽信号の発生の危険性がある.
パラメータ設定が不適切である場合,過激なフィールドへの入り込みが起こりうるため,適切な緩和が求められる.
測定データには十分な周期があり,制限を避けるべきである.
固定盤の過程で,空飛ぶのを防ぐために,止損幅を適切に増加させるべきである.
異なるMA周期パラメータの組み合わせ効果をテストする.
ダイナミックレジスタンスサポートパラメータを調整し,反転認識効果を最適化します.
異なるストップ・ストラッキングパラメータが戦略的利益曲線に与える影響を評価する.
安定性を高めるために,他の指標のフィルター信号を組み合わせてみてください.
この戦略の全体的な考え方は明確で,動的抵抗支柱帯を信号フィルターとして認識し,トレンド方向を判断するMA均線を用いて取引信号を生成し,ストップダストトラッキング方式でリスクを効果的に制御し,パラメータ最適化によって戦略効果を継続的に向上させることができる.さらなる研究と最適化の価値がある.
/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 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/
// © allanster
//@version=4
strategy("MA-EMA Crossover LT", shorttitle="MA-EMA XO", overlay=true)
//==================== STRATEGY CODE ======================
tradeType = input("BOTH", title="Trade Type ", options=["LONG", "SHORT", "BOTH"])
// === BACKTEST RANGE ===
FromMonth = 01//input(defval=01, title="From Month", minval=1)
FromDay = 01//input(defval=01, title="From Day", minval=1)
FromYear = input(defval=2017, title="From Year", minval=2000)
ToMonth = 12//input(defval=12, title="To Month", minval=1)
ToDay = 31//input(defval=31, title="To Day", minval=1)
ToYear = input(defval=9999, title="To Year", minval=2000)
testPeriod() =>
time > timestamp(FromYear, FromMonth, FromDay, 00, 00) and
time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
stopLossPercent = input(1.00, "Stop Loss Percent")
profitPercent_long = input(3.50, "Profit Percent LONG")
profitPercent_short = input(3.0, "Profit Percent SHORT")
atr_multi_PT = input(1.50, "ATR Multiple for PT")
atr_multi_SL = input(1.50, "ATR Multiple for SL")
//////////////////////////////
isLongOpen = false
isShortOpen = false
//Order open on previous ticker?
isLongOpen := nz(isLongOpen[1])
isShortOpen := nz(isShortOpen[1])
/////////////////////
//Trailing and Profit variables
trigger = 0.0
trigger := na
profitTrigger = 0.0
profitTrigger := na
//obtain values from last ticker
entryPrice = 0.0
entryPrice := nz(entryPrice[1])
stopLossLevel = 0.0
stopLossLevel := nz(stopLossLevel[1])
profitPriceLevel = 0.0
profitPriceLevel := nz(profitPriceLevel[1])
//If in active trade, lets load with current value
if isLongOpen
profitTrigger := profitPriceLevel ? high : na
trigger := stopLossLevel ? ohlc4 : na
trigger
if isShortOpen
profitTrigger := profitPriceLevel ? low : na
trigger := stopLossLevel ? ohlc4 : na
trigger
isStopLoss = isLongOpen ? trigger < stopLossLevel :
isShortOpen ? trigger > stopLossLevel : na
isProfitCatch = isLongOpen ? profitTrigger > profitPriceLevel :
isShortOpen ? profitTrigger < profitPriceLevel : na
//=================== Optional Entry Condition ============
src = close
len = input(defval = 128, title = "DZ Length", type = input.integer, minval = 1)
// use_dz = input(false, title="Use Dynamic Zone")
pcntAbove = input(defval = 40, title = "Hi is Above X% of Sample", type = input.float, minval = 0, maxval = 100, step = 1.0)
pcntBelow = input(defval = 60, title = "Lo is Below X% of Sample", type = input.float, minval = 0, maxval = 100, step = 1.0)
smplAbove = percentile_nearest_rank(src, len, pcntAbove)
smplBelow = percentile_nearest_rank(src, len, 100 - pcntBelow)
above = plot(src > smplAbove ? src : smplAbove, title = "Above Line", color = na)
probOB = plot(smplAbove, title = "OB", color = color.green)
probOS = plot(smplBelow, title = "OS", color = color.red)
below = plot(src < smplBelow ? src : smplBelow, title = "Below Line", color = na)
fill(above, probOB, color = #00FF00, transp = 80)
fill(below, probOS, color = #FF0000, transp = 80)
// long_dz = close > smplAbove
// short_dz = close < smplBelow
//============== Entry Conditions =====================
timeframe = input("5D", title="MA16 Resolution", type=input.resolution)
_ma = sma(hlc3, 16)
ma=security(syminfo.tickerid, timeframe, _ma, barmerge.gaps_off, barmerge.lookahead_on)
_ema=ema(hlc3,7)
ema=security(syminfo.tickerid, timeframe, _ema, barmerge.gaps_off, barmerge.lookahead_on)
long = ma[1] > ema[1] ? crossover(ema, ma) : abs(ma - ema)/ma > 0.025 ? crossover(close, ema) : false
short = ma[1] < ema[1] ? crossunder(ema,ma) : abs(ma - ema)/ma > 0.025 ? crossunder(close, ema): false //:crossunder(close, ema)
longEntry = (tradeType == "LONG" or tradeType == "BOTH") and long
shortEntry = (tradeType == "SHORT" or tradeType == "BOTH") and short
//Upon Entry, do this.
if longEntry or shortEntry
entryPrice := ohlc4
entryPrice
//set price points for new orders
use_dz_sl = input(true, title="Use DZ SL")
if isLongOpen
stopLossLevel := use_dz_sl? max(smplAbove, ma) : ema - 0.25*atr_multi_PT* atr(32) //ma
profitTrail = ma + atr_multi_PT* atr(32)
profitPriceLevel := max( (1 + 0.01 * profitPercent_long) * entryPrice, profitTrail)
profitPriceLevel
if isShortOpen
stopLossLevel := use_dz_sl? min(smplBelow, ma) : ema + 0.25*atr_multi_PT* atr(32) //ma
profitTrail = ma - atr_multi_PT* atr(32)
profitPriceLevel := min( (1 - 0.01 * profitPercent_short) * entryPrice, profitTrail)
profitPriceLevel
shortExit = isShortOpen[1] and (isStopLoss or isProfitCatch or longEntry)
longExit = isLongOpen[1] and (isStopLoss or isProfitCatch or shortEntry)
if (longExit or shortExit) and not(longEntry or shortEntry)
trigger := na
profitTrigger := na
entryPrice := na
stopLossLevel := na
profitPriceLevel := na
// highest := na
// lowest := na
// lowest
if testPeriod() and (tradeType == "LONG" or tradeType == "BOTH")
strategy.entry("long", strategy.long, when=longEntry)
strategy.close("long", when=longExit)
if testPeriod() and (tradeType == "SHORT" or tradeType == "BOTH")
strategy.entry("short", strategy.short, when=shortEntry)
strategy.close("short", when=shortExit)
//If the value changed to invoke a buy, lets set it before we leave
isLongOpen := longEntry ? true : longExit == true ? false : isLongOpen
isShortOpen := shortEntry ? true : shortExit == true ? false : isShortOpen
plotshape(isShortOpen, title="Short Open", color=color.red, style=shape.triangledown, location=location.bottom)
plotshape(isLongOpen, title="Long Open", color=color.green, style=shape.triangleup, location=location.bottom)
plotshape(entryPrice ? entryPrice : na, title="Entry Level", color=color.black, style=shape.cross, location=location.absolute)
plotshape(stopLossLevel ? stopLossLevel : na, title="Stop Loss Level", color=color.orange, style=shape.xcross, location=location.absolute)
plotshape(profitPriceLevel ? profitPriceLevel : na, title="Profit Level", color=color.blue, style=shape.xcross, location=location.absolute)
plotshape(profitTrigger[1] ? isProfitCatch : na, title="Profit Exit Triggered", style=shape.diamond, location=location.abovebar, color=color.blue, size=size.small)
plotshape(trigger[1] ? isStopLoss : na, title="Stop Loss Triggered", style=shape.diamond, location=location.belowbar, color=color.orange, size=size.small)
plot(ma, title="MA 16", color=color.yellow)
plot(ema, title="EMA 7", color=color.blue)