マルチタイムフレーム移動平均値とMACDをベースとした長期・短期開拓戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-03 12:15:46
タグ:

img

概要

この戦略は,トレンド方向を決定するためのマルチタイムフレーム指数関数移動平均 (MTF EMA) の機能と,ATR指標でストップ・ロストとテイク・プロフィート価格を設定しながら,トレンド・シグナルを生成するためのMACD指標の機能を完全に活用しています.この戦略は,強いトレンドを持つデジタルおよびフィアット通貨ペアに適しており,強いトレンドのある市場でより良いパフォーマンスを発揮します.

戦略原則

1. MTF EMA を用いたトレンド判断

マルチタイムフレーム指数関数移動平均 (MTF EMA) は,同一チャート上の複数のタイムフレームの移動平均を表示し,資産の全体的なロング/ショート状態を決定することができます.この戦略は1時間および15分のMTF EMAを採用します.

価格が1時間のMTF EMAを超え,1時間のMTF EMAが15分のMTF EMAを下回るときは,上向きトレンドとして定義されます.価格が1時間のMTF EMAを下回り,1時間のMTF EMAが15分のMTF EMAを下回ると,下向きトレンドとして定義されます.

2.MACDが取引信号を生成する

MACD線がシグナルラインを下から越えると,購入信号が生成される.上から下を通ると,販売信号が生成される.同時に,誤った信号を避けるために,MACD線とシグナルラインにクロスオーバー制限が設定される.

3. ATR で Stop Loss と Take Profit を 設定 する

ATRインジケーターは,ストップ・ロストとテイク・プロフィートの価格を設定するために使用されます.ATRは,市場の変動に基づいて合理的なストップ・ロストとテイク・プロフィートの距離を動的に設定できます.同時に,ストップ・ロストとテイク・プロフィートの倍数は,より柔軟性のある高値と低値のバックテストに基づいて設定されます.

取引戦略

オープンポジションのシグナル

長信号: 上向きとMACDがシグナルラインとクロスオーバー値を限界を下回る 短信号:ダウントレンドとMACDが信号線を下回り,クロスオーバー値が限界を超える

閉じる ポジション 信号

長取利益: ATR の経由で価格の割引 長期ストップ損失:価格がATRストップ損失価格を突破する ショート・テイク・プロフィート: ATRによる価格ブレイク コートストロップ損失: ATRストロップ損失価格を通過する価格

利点分析

この戦略の最大の利点は,トレンドを決定する際にMTF EMAの強みと,トレードシグナルを生成する際にMACDの強みを完全に利用することです.MTF EMAは,全体的なトレンド方向を明確に判断し,不安定な市場で頻繁な取引を避けることができます.MACD指標は,価格パターンの短期的な変化をよりうまく捉え,トレードシグナルを生成することができます.両方を一緒に使用することで,より多くの取引機会を得ながらトレンドを捉えることができます.さらに,ATR指標を使用して,ストップ損失を動的に追跡し,利益を得ることは,個々の取引のリスクを効果的に制御することができます.

リスク と 解決策

この戦略には2つの主要なリスクがあります.第一に,明確なトレンドがない場合,MTF EMAは誤った信号を生成し,損失につながる可能性があります.第二に,MACD指標は価格が劇的に変化すると誤った信号を生成し,過剰取引につながる可能性があります.第一リスクでは,MTF EMAパラメータは価格トレンドの変化により適合するように適切に調整できます.第二のリスクは,MACD指標のクロスオーバー制限を設定することによって軽減できます.

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

戦略の次の側面を最適化できる:

  1. MTF EMAのサイクルパラメータを調整し,異なる取引手段の価格特性をより良く調整する

  2. より良い信号のために,MACD指標の快速移動平均値と信号線パラメータを最適化します.

  3. ATR サイクルの異なるパラメータとストップ・ロース/テイク・プロフィートの倍数をテストし,最高のリターンを得る.

  4. フィルター信号に他の補助指標を追加

概要

この長期・短期開拓戦略は,トレンド判断のためのMTF EMA,トレードシグナル生成のためのMACD,ダイナミックストップ・ロスト・アンド・テイク・プロフィートのATRの方法を組み合わせている.明らかなトレンドのある市場で良いリターンを得ることができる.より良いパフォーマンスを達成するためにこの戦略のパラメータと最適化に十分な余地がある.しかし,リスクを制御し,不安定な市場で盲目取引を避ける必要があります.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
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/
// © Steven A. Zmuda Burke / stevenz17
//@version=4
// From Date Inputs
fromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 04, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2022, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 01, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 05, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2022, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

// Input
strategy("LONG", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, slippage=1, commission_type=strategy.commission.percent, 
     commission_value=0.015)
SOURCE = input(title = "═════════════════════ SOURCE ═════════════════════", defval = false, type = input.bool)
sourcehl2 = input(title="Source hl2 or (open+close)/2 ?",type=input.bool,defval=true)
source = sourcehl2 ? hl2 : ((open+close)/2)

//MTF EMA
MTFEMA = input(title = "════════════════════ MTF EMA ════════════════════", defval = false, type = input.bool)

res1=input(title="MTF EMA 1", type=input.resolution, defval="60")
len1 = input(title = "EMA Period 1", type=input.integer, defval=70, minval=1)
ema1 = ema(source, len1)
emaStep1 = security (syminfo.tickerid, res1, ema1, barmerge.gaps_off, barmerge.lookahead_off)
mtf1 = emaStep1

res2=input(title="MTF EMA 2", type=input.resolution, defval="15")
len2 = input(title = "EMA Period 2", type=input.integer, defval=68, minval=1)
ema2 = ema(source, len2)
emaStep2 = security (syminfo.tickerid, res2, ema2, barmerge.gaps_off, barmerge.lookahead_off)
mtf2 = emaStep2

t1 = plot(mtf1, linewidth=4, color= color.aqua, title="EMA")
t2 = plot(mtf2, linewidth=4, color= color.navy, title="EMA")
fill(t1, t2, transp = 70, color = mtf1 > mtf2 ? color.red : color.green)

///MACD
MACD= input(title = "═════════════════════ MACD ══════════════════════", defval = false, type = input.bool)
MACDsource=close
fastLength = input(13, minval=1, title="MACD fast moving average")
slowLength=input(18,minval=1, title="MACD slow moving average")
signalLength=input(24,minval=1, title="MACD signal line moving average")
MacdEmaLength =input(9, title="MACD EMA period", minval=1)
useEma = input(true, title="Use EMA (otherwise SMA)")
useOldAlgo = input(false, title="Use normal MACD")
Lmacsig=input(title="LONG MACD and signal crossover limit",type=input.integer,defval=180)

// Fast line
ma1= useEma ? ema(MACDsource, fastLength) : sma(MACDsource, fastLength) 
ma2 = useEma ?  ema(ma1,fastLength) :  sma(ma1,fastLength) 
fastMA = ((2 * ma1) - ma2)

// Slow line
mas1=  useEma ? ema(MACDsource , slowLength) :  sma(MACDsource , slowLength)
mas2 =  useEma ? ema(mas1 , slowLength): sma(mas1 , slowLength)
slowMA = ((2 * mas1) - mas2)

// MACD line
macd = fastMA - slowMA

// Signal line
emasig1 = ema(macd, signalLength)
emasig2 = ema(emasig1, signalLength)
signal = useOldAlgo ? sma(macd, signalLength) : (2 * emasig1) - emasig2

hist = macd - signal

histline = hist > 0 ? color.green : color.red

//MACD ribbon
macdribbon=input(title="Show MACD ribbon?",type=input.bool,defval=false)
macdx=input(title="MACD ribbon multiplier", type=input.integer, defval=3, minval=1)

leadLine1 = macdribbon ? macd*macdx + source : na
leadLine2 = macdribbon ? signal*macdx + source : na
leadLine3 = hist + source

//MACD plot
p3 = plot(leadLine1, color= color.green, title="MACD", transp = 100, linewidth = 8)
p4 = plot(leadLine2, color= color.red, title="Signal", transp = 100, linewidth = 8)
fill(p3, p4, transp = 20, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

plot((leadLine3), color = histline, title="Histogram", linewidth = 3) 


l="TEst"

upHist = (hist > 0) ? hist : 0
downHist = (hist <= 0) ? hist : 0

p1 = plot(upHist, color=color.green, transp=40, style=plot.style_columns, title='Positive delta')
p2 = plot(downHist, color=color.green, transp=40, style=plot.style_columns, title='Negative delta') 

zeroLine = plot(macd, color=color.black, transp=0, linewidth=2, title='MACD line')
signalLine = plot(signal, color=color.gray, transp=0, linewidth=2, title='Signal')

ribbonDiff = color.green
fill(zeroLine, signalLine, color=ribbonDiff)

circleYPosition = signal
plot(ema(macd,MacdEmaLength) , color=color.red, transp=0, linewidth=2, title='EMA on MACD line')

ribbonDiff2 = hist > 0 ? color.green : color.red
plot(crossunder(signal,macd) ? circleYPosition : na,style=plot.style_circles, linewidth=4, color=ribbonDiff, title='Dots')


//STOCHASTIC
stochchch= input(title = "═══════════════════ STOCHASTIC ════════════════════", defval = false, type = input.bool)
StochOn = input(title="Stochastic On?",type=input.bool,defval=true)
periodK = input(10, title="K", minval=1)
periodD = input(1, title="D", minval=1)
smoothK = input(3, title="Smooth", minval=1)
stochlimit = input(30, title="Stoch value crossover", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)

stochSignal = StochOn ? (d < stochlimit ? true : false) : true

pp= input(1, title="avg price length", minval=1)
p = ema (source, pp)
K = k + p

plot(k, title="%K", color=#0094FF)
plot(d, title="%D", color=#FF6A00)
h0 = hline(72, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
fill(h0, h1, color=#9915FF, transp=80, title="Background")



//Long 
LS= "════════════════════════════════ LONG CONDITIONS ═══════════════════════════"

uptrend = close > mtf1 and mtf1 < mtf2
downtrend = close < mtf1 and mtf1 > mtf2 

crossMACD = crossunder(macd,signal) 

LongBuy = uptrend and stochSignal? crossMACD and signal < Lmacsig and macd < Lmacsig : na

LONG = strategy.position_size > 0
SHORT = strategy.position_size < 0
FLAT = strategy.position_size == 0 

plotshape(LongBuy, style=shape.xcross, text="LONG", color=color.green)

//ATR & TP/SL

ATRTPSLX= input(title = "═════════════════ LONG SL ═════════════════", defval = false, type = input.bool)

maxIdLossPcnt = input(5, "Max Intraday Loss(%)", type=input.float, minval=0.0, step=0.1)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

SSL2=input(title="Long Stop Loss when MTF EMA cross?",type=input.bool,defval=false)

SSLOP = LONG  and crossunder(source, mtf1) 

SlossPercOn = input(title="Long Stop Loss (%) on?",type=input.bool,defval=false)
SlossPerc = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=4.7) * 0.01
SSpricePerc = LONG and SlossPercOn? strategy.position_avg_price * (-1 - SlossPerc) : na
plot(series = SSpricePerc, linewidth=2, color= color.maroon,style=plot.style_linebr, title="Long Stop Loss %") 
SSLX = LONG and crossunder(source, SSpricePerc)

SSLatr= input(title="Long Stop Loss ATR?",type=input.bool,defval=true)
useStructure=input(title="Look back for High/Lows?",type=input.bool,defval=true)
Slookback=input(title="How far to look back for High/Lows:",type=input.integer,defval=18,minval=1)
SatrLenghth=input(title="Long ATR Lenghth",type=input.integer,defval=9,minval=1)
SatrStopMultiplier=input(title="Long ATR Stop x ?", type=input.float,defval=4.3, minval=0.1,step=0.1)

Satr = atr(SatrLenghth)
LongStop = SSLatr ? ((useStructure ? lowest(low, Slookback) : source) - Satr * SatrStopMultiplier) : na

SStop = crossunder(source,LongStop)

plot(Satr, color=color.blue, title="ATR", transp=100)
plot(series = uptrend ? LongStop : na, color=color.red, style=plot.style_linebr, title="Long Trailing Stop", transp=0)


ATRTPSLXX= input(title = "═════════════════ LONG TP ═════════════════", defval = false, type = input.bool)

TpPercOn = input(title="Long Take Profit (%) on?",type=input.bool,defval=true)
TpPerc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=5.3) * 0.01
TppricePerc = LONG and TpPercOn? strategy.position_avg_price * (-1 + TpPerc) : na
plot(series = TppricePerc, linewidth=2, color= color.lime,style=plot.style_linebr, title="Long Take Profit %") 
TPLX = LONG and crossunder(source, TppricePerc)

TP1=input(title="1 Long Take Profit On?",type=input.bool,defval=true)

useStructure1=input(title="Look back for High/Lows?",type=input.bool,defval=true)
STplookback=input(title="How far to look back for High/Lows for 1 TP",type=input.integer,defval=12,minval=1)
STpatrLenghth=input(title="Long ATR Lenghth 1 TP",type=input.integer,defval=24,minval=1)
SatrProfitMultiplier = input(title="First Long ATR Take Profit x ?", type=input.float,defval=5.5, minval=0.1,step=0.1)
STpatr = atr(STpatrLenghth)
LongTakeProfit = (useStructure1 ? highest(high, STplookback) : source) + STpatr * SatrProfitMultiplier
LongTP = TP1 ? crossover(source, LongTakeProfit): false
plot(series = uptrend ? LongTakeProfit: na , color=color.green, style=plot.style_linebr, title="Long Trailing Take Profit", transp=0)


// Bar color
barcolor(cross(macd, signal) ? (macd - signal > 0 ? (uptrend and macd < 0 and signal < 0 ? color.yellow : na) : (downtrend and macd > 0 and signal > 0 ? color.blue : na)) : na)

// Strategy ATR

GOLONG = LongBuy and SSLatr and FLAT

if GOLONG and TP1
    strategy.entry(id="Entry LONG 1TP", long=true,comment="Entry Long")
    strategy.exit("Long Profit or Loss 1TP","Entry LONG 1TP", limit=LongTakeProfit, stop=LongStop)
if SSLX
    strategy.close(id="Entry LONG 1TP", comment="% Long SL EXIT")
if TPLX
    strategy.close(id="Entry LONG 1TP", comment="% Long TP EXIT")
    
if SSLOP and SSL2
    strategy.close(id="Entry LONG 1TP", comment="MTF EMA cross EXIT")    
    
if (not time_cond)
    strategy.close_all()
    strategy.cancel_all()    


//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

//@version=4

もっと