移動平均額とATRトレーリングストップに基づく定量取引

作者: リン・ハーンチャオチャン, 日付: 2023-12-08 15:53:22
タグ:

img

概要

この戦略は"移動平均封筒とATRトレーリングストップに基づく柔軟量取引戦略"を略して"MADEFlex"と呼ばれる.移動平均封筒指標とATRトレーリングストップメカニズムを組み合わせて柔軟で制御可能な量取引ソリューションを実装する.

原則

この戦略の核心は,移動平均移動幅 (MADE) インデカターである. MADEは移動指数移動幅 (EMA) とパーセント因数を掛けることで上下帯を形成する.価格が上帯を超えると売り信号が生成され,価格が下帯を超えると買い信号が生成される.この戦略は,平均真の範囲 (ATR) のトレーリングストップメカニズムを持つMADEインデカターを組み込む.ATRトレーリングストップは,ATR値の複数の倍数に基づいてストップ損失を設定し,ストップ損失ラインの柔軟なトラッキングを可能にします.これは,既存の利益をロックしながら不必要なストップ損失を回避します.

MADEインジケーターには,Period,percent above perAb, and percentage below perBlという3つのパラメータが含まれている.PeriodパラメータはEMAの期間を決定する.EMAからの上下帯距離はパーセント因子によって制御される.ATRの後続ストップ部分は主にATR期 nATRPeriodとATR倍数 nATRMultipによって設定される.価格が前のバーのストップ損失線を超えると,ストップ損失線は固定ATR損失をマイナスした価格に調整される.価格が前バーのストップ損失線を下回ると,ストップ損失線は価格プラス固定ATR損失に調整される.

最後に,MADE指標信号とATRトレーリングストップ条件を組み合わせて購入・売却信号が生成される.リバース入力スイッチでリバーストレードが可能である.

利点分析

MADEFlex戦略には以下の利点があります.

  1. より信頼性の高い結合信号とストップ損失.MADE自体は偽信号を生成する傾向があります.ATRのトライルストップを組み込むことは,いくつかのノイズを効果的にフィルタリングすることができます.

  2. MADEパラメータとATRパラメータは,信号の量と品質を制御するために調整できます.

  3. リバース・トレーディングのサポート リバース・トレーディングはアプリケーションシナリオを豊かにします

  4. 直感的に視覚化されたストップ ストップ効果を視覚的に判断する

リスク分析

MADEFlex 戦略には以下のリスクもあります

  1. MADE パラメータが正しくない場合,誤った信号が過剰に発生します.適切なパラメータは慎重にテストする必要があります.

  2. 過度に緩やかなATRストップは,停止機会を逃す可能性があります.適切なATR倍数をテストする必要があります.

  3. リバース・トレーディングではリスクが高く,特に波動性が高い場合,リバース・トレーディングでは損失リスクが増加する可能性があります.慎重に使用する必要があります.

  4. ストップ損失なしでの潜在的な損失が高くなる.極端な市場状況では,ストップ損失保護の欠如により損失が増加する可能性があります.

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

MADEFlex戦略は,次の方向に最適化することができます:

  1. MADE パラメータを最適化して信号品質を向上させる.より信頼性の高いパラメータセットを見つけるために,異なる期間とパーセントの組み合わせをテストすることができます.

  2. より良い停止効果のためにATRの後ろ停止パラメータを最適化します.より適切な組み合わせを決定するためにATR期間と倍数をテストすることができます.

  3. 誤った信号をさらに減らすために他のフィルターを追加します.例えばフィルタリングのために波動性指標を組み合わせます.

  4. 特定の利益レベルで退場する利益取りのメカニズムを追加します.これは利益をロックし,リスクを制御します.

  5. 機械学習方法を活用してパラメータを動的に最適化します.例えば,強化学習です.これは戦略に柔軟性を追加します.

結論

MADEFlex戦略は,移動平均封筒指標とATRトレーリングストップ方法論からの取引信号を成功裏に組み合わせています.調整可能なパラメータを通じて,柔軟で制御可能な定量的な取引ソリューションを実装します.この戦略は比較的高い信頼性と強力な制御能力を持っています.使用および最適化するための定量的な基礎を持つユーザーに適しています.さらなる最適化により,より重要な戦略パフォーマンスを期待できます.


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

//@version=5
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 27/09/2022
// Moving Average Displaced Envelope. These envelopes are calculated 
// by multiplying percentage factors with their displaced expotential 
// moving average (EMA) core.
// How To Trade Using:
// Adjust the envelopes percentage factors to control the quantity and 
// quality of the signals. If a previous high goes above the envelope 
// a sell signal is generated. Conversely, if the previous low goes below 
// the envelope a buy signal is given.
//
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
//
// ATR TS used by filter for MADE signals.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
strategy(title='Moving Average Displaced Envelope & ATRTS', shorttitle='MADE+ATR', overlay=true)
tradeDirection = input.string('Both', title='Trade Direction', options=['Both', 'Long', 'Short'])
Price = input(title='Source', defval=close)
Period = input.int(defval=9, minval=1)
perAb = input.float(title='Percent above', defval=.5, minval=0.01, step=0.1)
perBl = input.float(title='Percent below', defval=.5, minval=0.01, step=0.1)
disp = input.int(title='Displacement', defval=13, minval=1)

nATRPeriod = input(15)
nATRMultip = input(2)
useATR = input(false, title='ATR Filter')
reverse = input(false, title='Trade reverse')

longAllowed = tradeDirection == 'Long' or tradeDirection == 'Both'
shortAllowed = tradeDirection == 'Short' or tradeDirection == 'Both'
pos = 0
sEMA = ta.ema(Price, Period)
top = sEMA[disp] * ((100 + perAb) / 100)
bott = sEMA[disp] * ((100 - perBl) / 100)

xATR = ta.atr(nATRPeriod)
xHHs =ta.sma(ta.highest(nATRPeriod), nATRPeriod)
xLLs =ta.sma(ta.lowest(nATRPeriod),nATRPeriod)
nSpread = (xHHs - xLLs) / 2
nLoss = nATRMultip * xATR
var xATRTrailingStop = 0.0
xATRTrailingStop := close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), close - nLoss) :
     close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), close + nLoss) : 
     close > nz(xATRTrailingStop[1], 0) ? close - nLoss : close + nLoss

ATRLong = close > xATRTrailingStop ? true : false
ATRShort = close < xATRTrailingStop ? true : false

iff_1 = close > top ? 1 : pos[1]
pos := close < bott ? -1 : iff_1
iff_2 = reverse and pos == -1 ? 1 : pos
possig = reverse and pos == 1 ? -1 : iff_2
clr = strategy.position_size
if possig == 1 
    if longAllowed and ATRLong
        strategy.entry('Long', strategy.long)
    else
        if ATRLong or strategy.position_size > 0
            strategy.close_all()
if possig == -1 
    if shortAllowed and ATRShort
        strategy.entry('Short', strategy.short)
    else    
        if ATRShort or strategy.position_size < 0
            strategy.close_all()
if possig == 0
    strategy.close_all()
    
plot(xATRTrailingStop[1], color=color.blue, title='ATR Trailing Stop')
barcolor(clr < 0 ? #b50404 : clr > 0 ? #079605 : #0536b3)



もっと