
双均線逆転戦略 (Dual Moving Average Reversion Strategy) は,典型的な短期間の逆転取引戦略である.この戦略は,2つの異なるパラメータセットの均線を使用して取引信号を発信し,トレンドが逆転したときに利益を得ます.
この戦略は,2つの均線を使用して取引信号の生成を行う.最初の均線マオペニングはトレンドの方向を判断するために,第二の均線マクロッシングは取引信号を発信するために使用される.
maopeningが上昇すると,現在トレンド上昇段階にあることを示し; maopeningが低下すると,現在トレンド下降段階にあることを示します. マクロージングを1以上の係数で掛けることで,より敏感になり,反転信号を事前に発信できます.
具体的には,maopeningが上昇し,maclosingがダウンしてmaopeningを通過すると,トレンドの逆転を示し,戦略は空白を打開する.maopeningが低下し,maclosingがオンになってmaopeningを通過すると,トレンドの逆転を示し,戦略は多めに打開する.
この戦略のパラメータには平均線型,長さ,データソースなどが含まれ,これらのパラメータを調整することで,より良い取引効果を得ることができます. さらに,戦略は,ポジション開設方法,損失停止方法などのいくつかのオプションを内蔵し,必要に応じて設定することができます.
双方向の逆転戦略の利点は主に以下の通りです.
小回転,ショートライン取引に適している。2つの高速平均線を使用し,短期トレンドの反転を素早く捉えることができる,小回転である。
簡単な操作で簡単に理解できます. 交差する2つの均等な線は取引の信号です. とてもシンプルでわかりやすいです.
調整可能なパラメータが多く,最適化できる。2つの平均線を含むパラメータと係数,最適化によって最適なパラメータの組み合わせを見つけることができる。
スケジューラブルで自動取引に適している. 戦略の論理はシンプルで明快で,実行頻度は高く,自動取引を実現するためにプログラミングに適している.
制御可能なリスク,ストップ・メカニズムがある.移動ストップまたは数値ストップを設定し,単一の損失を制御できます.
双方向の逆転策にはいくつかのリスクがあります.
双均線交差は滞りである.均線は価格に滞りである.交差が起こる時,トレンドはしばらくの間逆転しているかもしれない.
傾向の逆転は持続しないし,すぐにまた逆転して,罠に陥るかもしれない.
撤回は残っている. タイムリーな止損は単一の損失を減らすことができますが,連続した止損は大きな撤回を引き起こすこともあります.
データ最適化のリスク 過剰最適化パラメータは,歴史データで良好なパフォーマンスを示したが,実態ディスクでの効果は良好ではない.
リスクに対応する解決策は以下の通りです.
パラメータを最適化して,迅速に対応する均線設定を見つけます.
量値指標,波動率指標など,他の指標と組み合わせて,封鎖を避ける.
連続停止の確率を下げるため,停止位置を調整する.
多組パラメータ最適化テストで,パラメータの強さを評価する.
双均線逆転戦略は以下の点で最適化できます.
異なる種類の平均線をテストし,より反応性の高い平均線を探します.例えば,カマ,ZLEMAなどです.
平均線パラメータを最適化して,最適な長さの組み合わせを見つけます.通常,短い周期の平均線はより効果的です.
閉店価格,平均価格,典型的な価格など,さまざまなデータソースをテストする.
トレンドフィルターを追加し,不適切な反転信号を回避する. ドンキアンチャネルなどを使用する.
量価指標MACD,OBVなどの他の指標と組み合わせて確認する.
移動停止,最大損失など,リスク管理の仕組みを増やす.
ポートフォリオを最適化し,最適の資産配置比率を探します.
パラメータの強度テストを追加し,パラメータの最適化過度のリスクを評価する.
双均線逆転戦略は,市場における短期逆転を捕捉するのに適した簡単な実用的なショートライン戦略である.この戦略は,撤回が小さく,実行が容易で,量取引に適している.しかし,滞留,封鎖などのリスクなどもいくつか存在している.パラメータを最適化,指標フィルタリングを増やし,リスク管理を改善するなどの方法によって戦略の効果を向上させ,安定した,実効性のある高効率の戦略を開発することができる.
/*backtest
start: 2023-10-17 00:00:00
end: 2023-11-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title = "hamster-bot MRS 2", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 9, commission_value = 0.045, backtest_fill_limits_assumption = 1)
info_options = "Options"
on_close = input(false, title = "Entry on close", inline=info_options, group=info_options)
OFFS = input.int(0, minval = 0, maxval = 1, title = "| Offset View", inline=info_options, group=info_options)
trade_offset = input.int(0, minval = 0, maxval = 1, title = "Trade", inline=info_options, group=info_options)
use_kalman_filter = input.bool(false, title="Use Kalman filter", group=info_options)
//MA Opening
info_opening = "MA Opening"
maopeningtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_opening, group=info_opening)
maopeningsrc = input.source(ohlc4, title = "", inline=info_opening, group=info_opening)
maopeninglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_opening, group=info_opening)
//MA Closing
info_closing = "MA Closing"
maclosingtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_closing, group=info_closing)
maclosingsrc = input.source(ohlc4, title = "", inline=info_closing, group=info_closing)
maclosinglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_closing, group=info_closing)
maclosingmul = input.float(1, step = 0.005, title = "mul", inline=info_closing, group=info_closing)
long1on = input(true, title = "", inline = "long1")
long1shift = input.float(0.96, step = 0.005, title = "Long", inline = "long1")
long1lot = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "long1")
short1on = input(true, title = "", inline = "short1")
short1shift = input.float(1.04, step = 0.005, title = "short", inline = "short1")
short1lot = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "short1")
startTime = input(timestamp("01 Jan 2010 00:00 +0000"), "Start date", inline = "period")
finalTime = input(timestamp("31 Dec 2030 23:59 +0000"), "Final date", inline = "period")
HMA(_src, _length) => ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
EHMA(_src, _length) => ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
THMA(_src, _length) => ta.wma(ta.wma(_src,_length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)
tema(sec, length)=>
tema1= ta.ema(sec, length)
tema2= ta.ema(tema1, length)
tema3= ta.ema(tema2, length)
tema_r = 3*tema1-3*tema2+tema3
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
ATR_func(_src, _len)=>
atrLow = low - ta.atr(_len)
trailAtrLow = atrLow
trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]
supportHit = _src <= trailAtrLow
trailAtrLow := supportHit ? atrLow : trailAtrLow
trailAtrLow
f_dema(src, len)=>
EMA1 = ta.ema(src, len)
EMA2 = ta.ema(EMA1, len)
DEMA = (2*EMA1)-EMA2
f_zlema(src, period) =>
lag = math.round((period - 1) / 2)
ema_data = src + (src - src[lag])
zl= ta.ema(ema_data, period)
f_kalman_filter(src) =>
float value1= na
float value2 = na
value1 := 0.2 * (src - src[1]) + 0.8 * nz(value1[1])
value2 := 0.1 * (ta.tr) + 0.8 * nz(value2[1])
lambda = math.abs(value1 / value2)
alpha = (-math.pow(lambda, 2) + math.sqrt(math.pow(lambda, 4) + 16 * math.pow(lambda, 2)))/8
value3 = float(na)
value3 := alpha * src + (1 - alpha) * nz(value3[1])
//SWITCH
ma_func(modeSwitch, src, len, use_k_f=true) =>
modeSwitch == "SMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.sma(src, len)) : ta.sma(src, len) :
modeSwitch == "RMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.rma(src, len)) : ta.rma(src, len) :
modeSwitch == "EMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.ema(src, len)) : ta.ema(src, len) :
modeSwitch == "TEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(tema(src, len)) : tema(src, len):
modeSwitch == "DEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(f_dema(src, len)) : f_dema(src, len):
modeSwitch == "ZLEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(f_zlema(src, len)) : f_zlema(src, len):
modeSwitch == "WMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.wma(src, len)) : ta.wma(src, len):
modeSwitch == "VWMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.vwma(src, len)) : ta.vwma(src, len):
modeSwitch == "Hma" ? use_kalman_filter and use_k_f ? f_kalman_filter(HMA(src, len)) : HMA(src, len):
modeSwitch == "Ehma" ? use_kalman_filter and use_k_f ? f_kalman_filter(EHMA(src, len)) : EHMA(src, len):
modeSwitch == "Thma" ? use_kalman_filter and use_k_f ? f_kalman_filter(THMA(src, len/2)) : THMA(src, len/2):
modeSwitch == "ATR" ? use_kalman_filter and use_k_f ? f_kalman_filter(ATR_func(src, len)): ATR_func(src, len) :
modeSwitch == "L" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.lowest(len)): ta.lowest(len) :
modeSwitch == "H" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.highest(len)): ta.highest(len) :
modeSwitch == "DMA" ? donchian(len) : na
//Var
sum = 0.0
maopening = 0.0
maclosing = 0.0
os = maopeningsrc
cs = maclosingsrc
pos = strategy.position_size
p = 0.0
p := pos == 0 ? (strategy.equity / 100) / close : p[1]
truetime = true
loss = 0.0
maxloss = 0.0
equity = 0.0
//MA Opening
maopening := ma_func(maopeningtyp, maopeningsrc, maopeninglen)
//MA Closing
maclosing := ma_func(maclosingtyp, maclosingsrc, maclosinglen) * maclosingmul
long1 = long1on == false ? 0 : long1shift == 0 ? 0 : long1lot == 0 ? 0 : maopening == 0 ? 0 : maopening * long1shift
short1 = short1on == false ? 0 : short1shift == 0 ? 0 : short1lot == 0 ? 0 : maopening == 0 ? 0 : maopening * short1shift
//Colors
maopeningcol = maopening == 0 ? na : color.blue
maclosingcol = maclosing == 0 ? na : color.fuchsia
long1col = long1 == 0 ? na : color.green
short1col = short1 == 0 ? na : color.red
//Lines
plot(maopening, offset = OFFS, color = maopeningcol)
plot(maclosing, offset = OFFS, color = maclosingcol)
long1line = long1 == 0 ? close : long1
short1line = short1 == 0 ? close : short1
plot(long1line, offset = OFFS, color = long1col)
plot(short1line, offset = OFFS, color = short1col)
//Lots
lotlong1 = p * long1lot
lotshort1 = p * short1lot
//Entry
if maopening > 0 and maclosing > 0 and truetime
//Long
sum := 0
strategy.entry("L", strategy.long, lotlong1, limit = on_close ? na : long1, when = long1 > 0 and pos <= sum and (on_close ? close <= long1[trade_offset] : true))
sum := lotlong1
//Short
sum := 0
pos := -1 * pos
strategy.entry("S", strategy.short, lotshort1, limit = on_close ? na : short1, when = short1 > 0 and pos <= sum and (on_close ? close >= short1[trade_offset] : true))
sum := lotshort1
strategy.exit("Exit", na, limit = maclosing)
if time > finalTime
strategy.close_all()