移動平均と平均真の範囲トレーリングストップロスに基づく定量取引戦略


作成日: 2023-12-08 15:53:22 最終変更日: 2023-12-08 15:53:22
コピー: 1 クリック数: 696
1
フォロー
1621
フォロワー

移動平均と平均真の範囲トレーリングストップロスに基づく定量取引戦略

概要

この戦略の名前はMADEFlex,全称は,移動平均信封と平均リアルレンジの尾行ストロップに基づく柔軟な量化取引戦略である.この戦略は,移動平均信封指標と平均リアルレンジの尾行ストロップの仕組みを組み合わせて,柔軟で制御可能な量化取引ソリューションを実現している.

戦略原則

この戦略の核心は,移動平均線封筒 (MADE) 指数である.MADE指数は,パーセント因子で位移を実行する指数移動平均 (EMA) を形成し,上下軌道に回る.価格が上線を突破すると,売り信号を生じ,価格が下線を突破すると,買い信号を生じます.この戦略は,MADE指数と平均真範囲 (ATR) の尾行止損機構を組み合わせている.ATRの尾行止損は,ATRの値の数倍で止損を設定し,止損ラインの柔軟な追跡を実現する.これにより,不要な止損を回避し,すでに達成した利益をロックすることができます.

具体的には,MADE指標には3つのパラメータが含まれている.周期Period,上線パーセントperAb,下線パーセントperBl.周期PeriodはEMAの周期長さを決定する.上線,下線距離のEMAの幅は,パーセント因子によって制御される.ATR尾行ストップは,主にATR周期nATRPeriodとATR倍数nATRMultipによって設定される.価格が上K線のストップラインを超えると,ストップラインを調整して価格を固定ATR損失から減算する.価格が上K線のストップラインを下回ると,ストップラインを調整して価格に固定ATR損失を加える.

最終的には,MADE指数信号とATRフォローストープ条件のフィルタリングを組み合わせて,買取と販売の信号を生成します.逆操作は,逆取引の入力スイッチreverseで実現できます.

優位分析

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

  1. 指示器信号と止損機構を組み合わせると,より信頼性が高い。MADE指示器自体は誤信号を生成しやすい。ATR尾行止損を組み合わせると,部分的なノイズを効果的にフィルターできる。

  2. 調整可能なパラメータが豊富で,制御の柔軟性がある.MADE指標のパラメータとATRパラメータを調整し,信号の量と質を制御することができる.

  3. リバース操作をサポートする. リバーススイッチによるリバース取引が可能で,戦略的な使用シナリオを豊かにする.

  4. 視覚化ストーパー 直観.ストープラインを描き,直観的にストープ効果を判断する.

リスク分析

MADEFlexには以下のリスクがあります.

  1. MADE指標のパラメータが不適切である場合,大量の誤信号が生じることがあります.適切なパラメータを決定するために慎重にテストする必要があります.

  2. ATRの止損が過度に緩やかである場合,止損のチャンスを逃す可能性があります.適切なATR倍数を決定するテストが推奨されます.

  3. 逆操作はリスクが高い.特に高波動の状況では,逆操作は損失のリスクを増加させる可能性があります.慎重に使用する必要があります.

  4. 停止保護がない場合,より大きな損失が生じることがあります.

最適化の方向

MADEFlexの戦略は,以下の方向から最適化できます.

  1. MADEパラメータを最適化し,信号品質を向上させる.異なる周期,パーセントパラメータをテストし,より信頼性の高いパラメータの組み合わせを見つける.

  2. ATRの停止パラメータを最適化して,よりよい停止効果を達成する.ATR周期とATR倍数をテストして,より適切な組み合わせを決定する.

  3. 他のフィルタリング条件を追加し,誤信号をさらに減らす.例えば,波動率指数と組み合わせてさらにフィルタリング信号.

  4. ストップ・ストップ・ストラテジーを追加し,利益が一定レベルに達した後にストップ・ストラトジーを退出させる. 利益をロックし,リスクを制御する.

  5. 機械学習法と組み合わせた動的最適化パラメータ. 強化学習などの方法を使用したリアルタイム最適化パラメータにより,戦略がより柔軟になる.

要約する

MADEFlex戦略は,移動平均封筒指標の取引信号と平均リアル範囲の追随ストロップ方法を成功裏に組み合わせている.調整可能なパラメータを使用して,柔軟で制御可能な量化取引ソリューションを実現している.この戦略は,高い信頼性,強力な制御能力があり,一定の量化基盤を持つユーザーの使用と最適化に適しています.さらなる最適化により,より顕著な戦略パフォーマンスを生み出すことが期待されています.

ストラテジーソースコード
/*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)