移動平均クロスオーバー戦略


作成日: 2023-10-24 16:39:40 最終変更日: 2023-10-24 16:39:40
コピー: 0 クリック数: 671
1
フォロー
1617
フォロワー

移動平均クロスオーバー戦略

概要

この戦略は,移動平均の交差原理に基づいており,短期平均線が下から長期平均線を横切るときに多し,短期平均線が上から下から長期平均線を横切るときに空し,典型的なトレンド追跡戦略である.

戦略原則

この戦略は,主に短期と長期の2つの単純な移動平均を計算し,それらの交差状況に基づいてトレンドの方向を判断する.

具体的には,戦略はまず,短期平均線xMAと長期平均線を計算し,短期平均線は Len で,長期平均線は 2 で計算します.*Len。

戦略は,短期平均線が長期平均線を横切ったかどうかを判断し,横切った場合は多信号を生成する.短期平均線が長期平均線を横切ったかどうかを判断し,横切った場合は空白信号を生成する.

多行シグナルを受信した後に,当前持仓がない場合は,市場価格で多行を開きます. 短行シグナルを受信した後に,当前持仓がない場合は,市場価格で短行を開きます.

さらに,ストップ・ストップ・ポイントを設定します. 追加した後に,入場価格としてストップ・ストップ・パーセントを設定します.*入場価格と止場価格が入場価格と止場価格の割合です.*入場価格; 空白後に入場価格 + ストップ・パーセンテージにストップ・プローストを設定する*入場価格,入場価格のストップ価格 - ストップ価格のパーセント*入場料

最後に,戦略は,傾向を判断するのに役立つ均線の可視化曲線を出力します.

戦略的優位性

  • シンプルで明快で,理解しやすく,初心者向けに

  • 移動平均によってトレンドの方向を判断し,市場動向を効果的に追跡できます.

  • 危険を制御する Stop Loss Stop ポイントを設定します.

  • 均線曲線を視覚的に表示し,トレンドの変化を直感的に反映する.

戦略リスク

  • 平均線が遅れているため,最適な入場時間を逃すリスクがあります.

  • 不合理なストップポイント設定は,ストップを過度に緩やかまたは過度に厳格にすることがあります.

  • 株価が急激に波動すると,平均線が偽信号を生じさせる可能性.

  • 均線周期パラメータのみを基にパラメータ最適化を行うと,過適合を引き起こす可能性がある.

適切な緩やかなストップ損失,均線周期パラメータの組み合わせの最適化,その他の指標のフィルタリングの追加により,これらのリスクを軽減することができます.

戦略最適化の方向性

  • MACD,KDJなどの他の指標をフィルタリングするために追加し,均線誤位が誤信号を生じないようにする.

  • 短期平均線と長期平均線の長さを複数の組み合わせで最適化して,最適なパラメータの組み合わせを見つける.

  • 単語の停止,移動の停止など,様々なストップ・ストップ戦略をテストする.

  • ポジション管理モジュールを追加し,資金利用効率を最適化する.

要約する

この戦略の全体的な考え方は明確で簡潔で,均線交差に基づいてトレンドの方向を判断し,トレンドを効果的に追跡し,リスクが制御可能で,初心者の学習参考に適しています.ただし,均線のみに依存して誤信号が発生する可能性があります.最適化余地はまだ十分で,多方面から最適化改善を行い,戦略をより安定して信頼性のあるものにすることができます.

ストラテジーソースコード
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.alert_message}} 
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 19/09/2023
// MA Crossover Bot for OKX Exchange
////////////////////////////////////////////////////////////
var ALERTGRP_CRED = "entry"
signalToken = input("", "Signal Token", inline = "11", group = ALERTGRP_CRED)
OrderType = input.string("market", "Order Type", options = ["market", "limit"], inline = "21", group = ALERTGRP_CRED)
OrderPriceOffset = input.float(0, "Order Price Offset", minval = 0, maxval = 100, step = 0.01, inline = "21", group = ALERTGRP_CRED)
InvestmentType = input.string("percentage_balance", "Investment Type", options = ["margin", "contract", "percentage_balance", "percentage_investment"], inline = "31", group = ALERTGRP_CRED)
Amount = input.float(100, "Amount", minval = 0.01, inline = "31", group = ALERTGRP_CRED)

getAlertMsg(action, instrument, signalToken, orderType, orderPriceOffset, investmentType, amount) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    //str := str + '"timestamp": "' + str.format_time(timenow, "yyyy-MM-dd'T'HH:mm:ssZ", "UTC+0") + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '"orderType": "' + orderType + '", '
    str := str + '"orderPriceOffset": "' + str.tostring(orderPriceOffset) + '", '
    str := str + '"investmentType": "' + investmentType + '", '
    str := str + '"amount": "' + str.tostring(amount) + '"'
    str := str + '}'
    str

getOrderAlertMsgExit(action, instrument, signalToken) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '}'
    str

strategy(title='OKX: MA Crossover', overlay=true)
Len = input(13)
Profit = input.float(7, title='Take Profit %', minval=0.01) / 100
Stop =  input.float(7, title='Stop Loss %', minval=0.01) / 100
xMA = ta.sma(close, Len)
//Robot State
isLong = strategy.position_size > 0 
isShort = strategy.position_size < 0 
isFlat = strategy.position_size == 0 
//Current Signal
doLong = low < xMA[1] ? true : false
doShort =   high > xMA[1] ? true:  false
//Backtest Start Date
tm =  timestamp(2022, 01, 01, 09, 30)
//Entry and exit orders
if  doLong[2] == false and isLong == false and doLong and time > tm
    strategy.cancel_all()
    buyAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_LONG', instrument = syminfo.ticker, signalToken = signalToken)
    buyAlertMsg = getAlertMsg(action = 'ENTER_LONG', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Long', strategy.long, limit = close, comment='Long', alert_message =buyAlertMsg)
    strategy.exit("ExitLong", 'Long', stop=close - close * Stop  , limit = close + close * Profit , qty_percent = 100, alert_message = buyAlertMsgExit)  
if doShort[2] == false and isShort == false and doShort and time > tm
    strategy.cancel_all()
    sellAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_SHORT', instrument = syminfo.ticker, signalToken = signalToken)
    sellAlertMsg = getAlertMsg(action = 'ENTER_SHORT', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Short', strategy.short, limit=close, comment='Short', alert_message = sellAlertMsg)
    strategy.exit("ExitShort", 'Short', stop=close + close * Stop  , limit = close - close * Profit  , qty_percent = 100, alert_message = sellAlertMsgExit)  
//Visual
barcolor(isShort  ? color.red : isLong ? color.green : color.blue)
plot(xMA, color=color.new(color.red, 0), title='MA')