10EMA ダブルクロストレンド追跡戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-29 16:03:55
タグ:

img

概要

この戦略は,10EMAと50EMAの二重クロスに基づいたトレンド追跡戦略です. 10EMAを時間表に補助判断として組み込み,交替的な牛と熊市場のトレンド方向を動的に見つけ,自動追跡ストップ損失を達成します.

戦略原則

この戦略の基本論理は,10EMAと50EMAの黄金十字と死十字に基づいています.特に,10EMAが50EMAを横切って黄金十字を形成すると,市場は上昇傾向に入ると判断されます.10EMAが50EMAを下回って死十字を形成すると,市場は下落傾向に入ると判断されます.

ロングまたはショートポジションは,ゴールデンクロスまたはデスクロスの後1-5バー以内に開きます. さらに,戦略は,補助判断として,時給チャート上の10EMAも導入します. 時給チャート上の10EMAがゴールデンクロスの後上昇傾向にあり,時給チャート上の10EMAがデスクロスの後下落傾向にある場合にのみロングポジションが開かれ,時給チャート上の10EMAがダウン傾向にある場合にのみショートポジションが開かれ,それによっていくつかの偽信号をフィルタリングします.

ポジションを開いた後,ストップ・ロスはストップ・ロス+リミット・オーダーを追跡する利益とストップ・ロスの方法を採用する.ストップ・ロスの追跡は利益をロックし,取引の収益性を最大化することができる.リーミット・オーダーは,価格が目標に達するとポジションが閉鎖されることを保証する.

利点分析

この戦略の最大の利点は,主要なトレンド方向を判断するためにEMAクロスを使用する一方で,シグナルをフィルターするために補助指標も導入し,シグナル信頼性を向上させるために誤ったクロスを効果的にフィルターすることができます.また,トラッキングストップ損失とリミット・プロフィートテイキングと組み合わせたダブルEMAクロスは,トレンドの追跡利益を最大化し,全体的なリスク・リターン比率が良い取引リスクを効果的に制御することができます.

単一指標戦略と比較して,この戦略はトレンド方向と幅をより正確に判断することができます.従来のストップ損失と比較して,この戦略は,利益をより良くロックするために,より高度な追跡ストップ損失技術を採用します.

リスク分析

この戦略が直面する主なリスクは,断続的なウィップソーとトレンド逆転である.連続した誤ったクロスシグナルが発生すると,戦略はクローズされる可能性があります.また,ポジションを開設した後の価格逆転も損失につながる可能性があります.

ストップロスのリスクを軽減するために,シグナルをフィルターするために補助指標が追加されます.トレンド逆転のリスクを制御するために,比較的寛容なストップロスの範囲が採用され,利息制限設定もこのリスクを軽減するのに役立ちます.ストップロスが起動すると,トレンド方向への再入力を検討することも可能です.

オプティマイゼーションの方向性

この戦略にはいくつかの最適化方向があります.第一に,EMA期間やポジション遅延バーなどの異なるパラメータ組み合わせをテストして最適なパラメータを見つけることができる.第二に,MACDやBOLLなどのより多くの補助指標をシグナルフィルタリングのために導入してシグナル品質を改善することができます.第三に,ストップ・ロストとテイク・プロフィートロジックは,タイム・ストップ・ロストや振動型ストップ・ロストなどの他のストップ・ロスト方法を採用して最適化することができます.第四に,特定の時間帯または変動範囲の間にシグナルを起動するなど,より多くの市場条件を組み合わせて戦略取引シグナルを起動することができます.

概要

この10EMAダブルクロストレンドトラッキング戦略は,EMAのゴールデンクロスとデスクロスを通して現在のトレンド方向を判断し,利益とリスクを制御するためにストップロスのトラッキングと利益の制限を設定し,補助指標を組み合わせてシグナルをフィルタリングし,信号品質を改善する.単一指標と伝統的なストップロスの戦略と比較して,この戦略は正確な判断,最適化されたストップロフトメカニズムなどの利点があります.リスクを制御しながらトレンドの利益を効果的に捉えることができ,従来の取引アカウントに適しています.もちろん,パラメータ最適化やより多くの補助指標の導入を通じて戦略パフォーマンスをさらに向上させるなど,この戦略の改善余地があります.


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

//@version=5
strategy("10ema Strat 9", overlay=true, format=format.price)
//#region // inputs for candles
//time
t1 = time(timeframe.period,"0930-1500") //last hour of market is not ideal for trading
// candle status
bullish = close > open and barstate.isconfirmed
bearish = open > close and barstate.isconfirmed
bullcandle = ta.valuewhen(bullish, close, 0)
bearcandle = ta.valuewhen(bearish, close, 0)
ema1 = input.int(10, minval=1, title="short ema")
ema2 = input.int(50, minval=1, title="long ema")
ema3 = input.int(200, minval=1, title="hourly 10 ema")
//@variable Input for source
src = input(close, title="Source")
offsetema = input.int(title="Offset", defval=0, minval=-500, maxval=500)
sema = ta.ema(src, ema1)//@variable Input for smaller ema1
lema = ta.ema(src, ema2)//@variable Input for longer ema2
hema = ta.ema(src, ema3)// @variable Input for hourly ema3
bullcrosscount = ta.barssince(ta.crossover(sema,lema)) //@variable Input 10/50 cross higher
bearcrosscount = ta.barssince(ta.crossunder(sema,lema)) //@variable Input 10/50 cross lower
ideallong = bullcrosscount <= 5 //number of candles after the cross
idealshort = bearcrosscount <= 5 //number of candles after the cross

emabull = (sema > lema) and bearish and close > sema and close > hema and ideallong and t1 and barstate.isconfirmed
xemabull = ta.barssince(emabull)
dbullema = emabull and emabull[1] and xemabull <=1
bullentry = if dbullema
    ta.valuewhen(emabull[1], high + 0.05, 0)
else 
    ta.valuewhen(emabull, high + 0.05, 0)
bullentryh = dbullema ? bullentry[1] : bullentry
bullentrylow = ta.valuewhen(emabull, low - 0.05, 0)
bullstop = (bullentryh - bullentrylow) <= 1.00 ? bullentryh - 1.00 : (bullentryh - bullentrylow) <= 10.40 ? bullentrylow : na
bulltarget = (bullentryh - bullstop) * 1.62 + bullentryh

// bear setup
emabear = (sema < lema) and bullish and close < sema and close < hema and idealshort and t1 and barstate.isconfirmed
xemabear = ta.barssince(emabear)
dbearema = emabear and emabear [1] and xemabear <=1
bearentry = if dbearema
    ta.valuewhen(emabear[1], low - 0.05, 0)
else
    ta.valuewhen(emabear, low - 0.05, 0)
bearentryh = dbearema ? bearentry[1] : bearentry
bearentryhigh = ta.valuewhen(emabear, high + 0.05, 0)
bearstop = (bearentryhigh - bearentryh) <= 1.00 ? bearentryh + 1.00 : (bearentryh - bearentryhigh) <= 10.40 ? bearentryhigh : na
beartarget = bearentryh - (bearstop-bearentryh) * 1.62

bullclose = (xemabull <=7) and bullish and bullcrosscount >=1 and barstate.isconfirmed //number of candles for a close above
bearclose = (xemabear <=7) and bearish and bearcrosscount >=1 and barstate.isconfirmed //number of candles for a close below
buyzone = ta.barssince(bullclose)
shortzone =  ta.barssince(bearclose)
idealbuy = close >= bullentryh and bullclose and (buyzone<=7)
idealsell = close <= bearentryh and bearclose and (shortzone<=7)

// // bull setup on chart
// if sema > lema and xemabull < 50
//     var line line_bullentry = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bullentry, x=bar_index, y=bullentryh)
//         line.set_xy2(line_bullentry, x=bar_index, y=bullentryh)
//         alert("EMA-bullish", alert.freq_once_per_bar_close)
//     line.set_x2(line_bullentry, x=bar_index)
//     var line line_bullstop = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bullstop, x=bar_index, y=bullstop)
//         line.set_xy2(line_bullstop, x=bar_index, y=bullstop)
//     line.set_x2(line_bullstop, x=bar_index)    
//     var line line_bulltarget = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bulltarget, x=bar_index, y=bulltarget)
//         line.set_xy2(line_bulltarget, x=bar_index, y=bulltarget)
//     line.set_x2(line_bulltarget, x=bar_index)

// //bear setup on chart
// if sema < lema and xemabear < 50
//     var line line_bearentry = line.new(bar_index, na, bar_index, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_bearentry, x=bar_index, y=bearentryh)
//         line.set_xy2(line_bearentry, x=bar_index, y=bearentryh)
//         alert("EMA-bearish", alert.freq_once_per_bar_close)
//     line.set_x2(line_bearentry, x=bar_index)
//     var line line_bearstop = line.new(bar_index, na, bar_index, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_bearstop, x=bar_index, y=bearstop)
//         line.set_xy2(line_bearstop, x=bar_index, y=bearstop)
//     line.set_x2(line_bearstop, x=bar_index)
//     var line line_beartarget = line.new(bar_index, na, bar_index, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_beartarget, x=bar_index, y=beartarget)
//         line.set_xy2(line_beartarget, x=bar_index, y=beartarget)
//     line.set_x2(line_beartarget, x=bar_index)

//#endregion
//execution 
if idealbuy
    strategy.close("sell", comment=na)	
    strategy.entry("buy", strategy.long, limit=bullentryh, stop=bullstop, comment="buy")
strategy.exit("exit","buy", trail_points = low, trail_offset = 5, qty_percent=100, limit=bulltarget, stop=bullstop)

if idealsell
	strategy.close("buy",comment=na)
    strategy.entry("sell", strategy.short, limit=bearentryh, stop=bearstop, comment="sell")
strategy.exit("exit","sell", trail_points = low, trail_offset = 5, qty_percent=100, limit=beartarget, stop=bearstop)
// strategy.close_all(time == close_day) 
//#region // graphical analysis
//Plots
plotshape(emabull, location=location.belowbar, title='emabull')
plotshape(idealbuy, style=shape.circle, color=color.green, title="bull close")
plotshape(emabear, title='emabear')
plotshape(idealsell, location=location.belowbar, style=shape.circle, color=color.red, title="bear close")

// //Dashboard
// var label id = na
// label.delete(id)   // Delete last label
// i_offsetLabel = input(15, "Data Dashboard Offset") 
// offset = i_offsetLabel * (time - time[1])
// dynamicText = "= Bull Setup ="
// id := label.new(x=time + offset, y=open, xloc=xloc.bar_time, text=dynamicText, color=color.rgb(255, 255, 255), size=size.normal)
// label.set_textcolor(id, color.rgb(0, 0, 0))
// label.set_text(id=id, text=dynamicText)
// label.set_textalign(id, text.align_left)
// label.set_text(id=id, text=dynamicText)
// f_round( _val, _decimals) => 
//     _p = math.pow(10, _decimals)
//     math.round(math.abs(_val) * _p) / _p * math.sign(_val)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bulltarget,2)) + "  :Target"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullentryh,2)) + "  :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullstop,2)) + "  :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + "= Bear Setup ="
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearstop,2)) + "  :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearentryh,2)) + "  :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(beartarget,2)) + "  :Target"
// label.set_text(id=id, text=dynamicText)
// //#endregion

もっと