脱出 戦略 を 克服 する

作者: リン・ハーンチャオチャン開催日:2023年10月12日 16時47分55秒
タグ:

概要

移動平均クロスオーバー戦略は,非常に一般的な定量的な取引戦略である. 移動平均の黄金十字と死十字を使用して,トレンドと利益を決定する. 短期移動平均が長期移動平均を上回ると,上昇傾向を示し,ロングポジションを取ることができる. 短期移動平均が長期移動平均を下回ると,下落傾向を示し,ショートポジションを取ることができる.

戦略の論理

この戦略は,入口と出口点を決定するために移動平均の黄金十字と死十字に基づいています.コードは2つのブール式入力パラメータを使用します.upOrDownそしてlongOrShort長期または短期を決定するpercentInput価格変化の値パーセントを設定する.closePositionDaysポジションを保持する日数を設定します

基本論理は:昨日の対比値の上昇/減少を計算する.入力値の%に達すると,取引信号が起動する.長い信号である場合,今日の価格が昨日の対比値よりも上昇すると,ロングに行く.ショート信号である場合,今日の価格が昨日の対比値よりも低下すると,ショートに行く.

ロング/ショート後,エントリー日と次の4日間は,チャートに色でマークされます. 4日後にポジションは自動的に閉鎖されます.

利点

  • 傾向を決定するために移動平均のクロスオーバーを使用することは成熟した信頼性の高い方法です
  • シンプルで明快な戦略論理,理解し実行しやすい
  • パラメータを調整することで周波数を制御することができます
  • 自動ストップ損失メカニズムはリスクを効果的に制御します

リスク

  • 移動平均値は遅延効果があり,急速な価格変動のタイミングを逃す可能性があります.
  • 短期的に重要な価格変動が起こり,不必要な信号が生じる.
  • 不適切なパラメータ設定は戦略のパフォーマンスに影響を与える可能性があります.
  • 予期せぬ出来事の影響を効果的に対応できない

リスク管理

  1. 移動平均のパラメータを最適化し,より長い期間がノイズをフィルターするのに役立ちます
  2. 必要のない取引を減らすために 限界率を増加させる
  3. 単一の損失を制御するために異なる保持期間をテストする
  4. 信号をさらに確認するために他の指標と組み合わせる

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

  • SMAではなく EMA,DMA を使ってより敏感にする
  • ストップ・ロスのメカニズムを追加します.例えば,平均を破るときのストップ・ロスは
  • MACD,KDJなどの他の技術指標を追加して,勝利率を改善します
  • パラメータを自動最適化するための機械学習方法を試す
  • 入口と出口のタイミングを最適化します 脱出などです

概要

移動平均クロスオーバー戦略は,非常にシンプルで実用的な定量的な取引戦略である.短期的および長期的トレンドの関係を判断することによって,資産価格の傾向性から利益を得ます.この戦略は,明確な論理で実行しやすく,多くの定量的な取引戦略の基盤を形成します.パラメータチューニングと最適化によってより良いパフォーマンスを得ることができます.しかし,リスクを管理し,誤用を避ける必要があります.


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

//@version=3
//  Created by Leon Ross

strategy(title = "DaysAfterCertainPercentChangev1", shorttitle = "DACPCv1", overlay = true, 
  pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, 
  calc_on_every_tick=true, initial_capital=100000)
  
//Inputs
longOrShort = input(title="Long=Checked Short=Unchecked", type=bool, defval=true) //long=true, down=false
upOrDown = input(title="Direction of Today vs. Previous day: Up=Checked Down=Unchecked", type=bool, defval=true) //up=true, down=false: this is the direction of days vs previous day
percentInput = input(title="Percent", type=float, defval=4.5)
closePositionDays = input(title="How Many Days to Close Position", defval=4)

//Conditions
//percentUpValue = (close / close[1]) - 1
//percentUp = percentUpValue >= (percentInput/100.0)
//upConditions = percentUp
//percentDownValue = 1- (close / close[1])
//percentDown = percentDownValue >= (percentInput/100.0)
//downConditions = percentDown
upValue = (close / close[1]) - 1
downValue = 1 - (close / close[1])
allConditions = if(upOrDown)
    upValue >= (percentInput/100.0)
else
    downValue >= (percentInput/100.0)
    
//Plots
bgcolor(allConditions ? (upOrDown ? green : red) : na, transp=70)
bgcolor(allConditions ? silver : na, transp=70, offset=1)
bgcolor(allConditions ? silver : na, transp=70, offset=2)
bgcolor(allConditions ? silver : na, transp=70, offset=3)
bgcolor(allConditions ? silver : na, transp=70, offset=4)
//bgcolor(downConditions == 1 ? red : na, transp=70)
//bgcolor(downConditions == 1 ? silver : na, transp=70, offset=1)
//bgcolor(downConditions == 1 ? silver : na, transp=70, offset=2)
//bgcolor(downConditions == 1 ? silver : na, transp=70, offset=3)
//bgcolor(downConditions == 1 ? silver : na, transp=70, offset=4)

//Entires
if(longOrShort)
    strategy.entry(id = "Long", long = true, when = allConditions) 
else
    strategy.entry(id = "Short", long = false, when = allConditions)

//Exits
if (barssince(allConditions) == closePositionDays)
    if(longOrShort)
        strategy.close("Long")
    else
        strategy.close("Short")




もっと