
これは,移動平均とMACD指数を使って双方向の突破操作を行う定量取引戦略である.これは,長時間周期でトレンドの方向を判断し,短時間周期で入場機会を探す優位性を有するクロスタイム軸操作の特性を有している.
この戦略は,3つの異なる長さのSMMA平均線と1つのEMA平均線を使用してトレンドの方向を判断する.同時に,それは短期的な傾向と入場タイミングを判断するMACD指標と組み合わせる.具体的には,その購入条件は,価格がすべての平均線を横断し,短線が均等に長平均線の上に触発される場合である.売る条件は,価格がすべての平均線を横断し,短平均線が長平均線の下に触発される場合である.
この戦略は,移動平均が中長期のトレンド方向を判断し,短期の逆転を判断するMACDを同時に利用して,有利な入場タイミングを捉えていることがわかります.この多時間軸の合同操作は,この戦略の重要な特徴です.
この時軸横断操作の利点は,高確率のトレンド方向において,適切な短期転換点入場を選択して,それにより優れたリスク・リターンを得ることができるという点にある.具体的には,以下の3つの利点は主要である.
3つのSMMA平均線と1つのEMA平均線の多級波により,中長期のトレンド方向を効果的に判断し,逆行操作を避ける.
MACD指数は,短期的な逆転点の入場を判断し,優良な入場価格を得ることができる.
厳格な移動平均の順序関係がフィルタリング条件として,誤操作の確率を減らすことができる.
この戦略の主なリスクは,
移動平均は後退性があるため,短期的なトレンド転換の機会を逃す可能性があります.
MACD指数は偽のシグナルを生成しやすいので,価格フィルターと組み合わせる必要があります.
複数の時間軸の判断により,戦略の複雑性が高まり,失効が容易になる.
リスク1とリスク2では,平均線周期とシグナル周期を適切に短縮することで最適化することができ,短期トレンドの逆転に迅速に対応できます.リスク3では,異なる品種と周期に対して最適化テストを行う必要があり,戦略パラメータをその品種の特性に厳密に適合させることができます.
この戦略は,以下のような点で最適化できます.
移動平均とMACDのパラメータを最適化して,異なる周期と品種特性を最適にマッチさせる.例えば,平均線の長さを短くし,Signalのパラメータを大きくするなど.
ストップ・ストラテジーを追加し,ATRまたは他の指標を使用して合理的な移動ストラットを設定します.これは戦略のリスク管理を大幅に改善します.
代替 MACD 信号のより良い指標やフィルタリング方法を探す.例えば,波動率指標を導入し,シグナルをフィルタリングするなど.
異なるストップ・ストップ・ロード比率の関係をテストして,リスク・リターンより優れているパラメータの組み合わせを得る.
全体として,これは独特の跨時間軸の思考を持つ突破的なシステムである.移動平均とMACDの優位性を同時に利用し,複数の時間帯の合同判断操作戦略を実現している.パラメータとフィルタ条件の最適化調整によって,この戦略は非常に実用的な量化取引プログラムになることができる.
/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
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/
// © SoftKill21
//@version=4
strategy("Koala Script",initial_capital=1000,
commission_type=strategy.commission.cash_per_contract,
commission_value=0.000065,
slippage=3)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len
len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2
len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3
len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4 : (smma4[1] * (len4 - 1) + src4) / len4
len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)
timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")
time_cond = time >= startDate and time <= finishDate and londonEntry
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
srcc = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)
// Calculating
fast_ma = sma_source ? sma(srcc, fast_length) : ema(srcc, fast_length)
slow_ma = sma_source ? sma(srcc, slow_length) : ema(srcc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma and londonEntry and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma and londonEntry and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5
//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond
length=input(14, title="ATR Length")
mult=input(1.0, title="Percentage Multiplier (for ex., 0.7 = 70%)", step=0.1, minval=0.1, maxval=5.0)
oa=input(false, title="Show actual ATR")
ii=syminfo.pointvalue==0
s=ii?na:oa?atr(length):(syminfo.pointvalue * mult * atr(length))
tp=input(300,title="tp")
sl=input(300,title="sl")
//tp = s*10000
//sl= s*10000
//if(tp>300)
// tp:=300
//if(sl>300)
// sl:=300
//if(sl<150)
// sl:=150
//if(tp<150)
// tp:=150
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------''
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit //floating profit/loss
risk = input(3,type=input.float,title="Risk %")/100 //risk % per trade
//Calculate the size of the next trade
temp01 = balance * risk //Risk in USD
temp02 = temp01/sl //Risk in lots
temp03 = temp02*100000 //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 10000)
size := 10000 //Set min. lot size
strategy.entry("long",1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
//strategy.close("long",when= crossunder(close[4],smma4) and close[4] > close[3] and close[3]>close[2] and close[2] > close[1] and close[1] > close)
strategy.entry("short",0,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)
//strategy.close("short",when= crossover(close[4],smma4) and close[4] < close[3] and close[3]< close[2] and close[2] < close[1] and close[1] < close)
strategy.close_all(when = not london)
maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)