ダブルMA時間制限取引戦略


作成日: 2023-11-14 16:45:03 最終変更日: 2023-11-14 16:45:03
コピー: 0 クリック数: 654
1
フォロー
1617
フォロワー

ダブルMA時間制限取引戦略

概要

この戦略は,元の双均線取引戦略に基づいて,戦略の開始時間を制御するための時間制限モジュールを追加した.このモジュールは,戦略の実行時間を効果的に管理し,非理想的な市場条件下での取引リスクを低減する.

原則

戦略は,急速MAと遅いMAを使って取引信号を構築する. 急速MAのパラメータは14日,遅いMAのパラメータは21日である. 急速MA上を通過すると買い信号が生成され,急速MA下を通過すると売り信号が生成される.

戦略はまた,元の取引信号の方向を逆転させる取引反転オプションを導入した.

時間制限モジュールは,現在の時間と設定された起動時間をタイムで比較し,実値を返し,戦略が起動するかどうかを制御する.このモジュールは,起動の年,月,日,時間,分を設定する必要があります.現在の時間が設定時間を超えるとのみ,戦略が起動します.

利点

  • 双MAの取引シグナルの利用により,中短期のトレンドを効果的に捉える
  • 時間制限モジュールを追加し,戦略の実行時間をより正確に制御し,理想的な市場条件下での不必要な取引を避ける
  • 取引の逆転オプションにより,戦略の柔軟性が向上します.

リスクと解決

  • 双MA戦略は,取引頻度や取引コストを高め,複数の取引シグナルを生成する可能性があります.
  • タイム制限モジュールの設定を間違えた場合,取引の機会を逃す可能性があります.
  • 取引逆転の不適切な選択は,取引信号の誤りを引き起こす可能性がある

適切なMA周期パラメータを最適化して取引頻度を低下させることができる.同時に,合理的な時間設定でモジュールの開始時間を制限し,機会を逃さないようにする.最後に,異なる市場条件に応じて,取引信号の方向を逆転させる必要があるかどうかを慎重に選択する.

最適化の方向

  • 単一取引のリスクをより良く制御するためのストップ・ローズモジュール
  • モバイルストップトラッキングを追加し,トレンドに応じてストップポイントを徐々に移動させ,利益の追跡抽出を実現します.
  • 複数の標識の操作信号を組み合わせて,信号の質を向上させ,偽信号を減らす
  • パラメータ最適化モジュールを開発し,最適なパラメータの組み合わせを自動的に探す

要約する

この戦略は,二重MAによって取引シグナルを形成し,時間制限モジュール制御戦略の実行時間を加え,トレンドを効果的に捕捉し,非理想的な市場条件のリスクを回避することができます. この戦略は,最適化パラメータ設定,ストップダストモジュール,およびクロススタンダード操作などの手段によってさらに向上させることができ,取引頻度を下げながら,各取引の安定性と収益性を高めることができます.

ストラテジーソースコード
/*backtest
start: 2023-11-06 00:00:00
end: 2023-11-13 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY TIME LIMITING ***
//
//  This is a follow up to my previous strategy example for risk management, extended to include a time limiting factor.

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// Risk management
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)
// *** FOCUS OF EXAMPLE ***
// Time limiting
// a toggle for enabling/disabling
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2016, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// *** FOCUS OF EXAMPLE ***
// === TIME LIMITER CHECKING FUNCTION ===
// using a multi line function to return true or false depending on our input selection
// multi line function logic must be indented.
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// *** FOCUS OF EXAMPLE ***
// wrap our strategy execution in an if statement which calls the time checking function to validate entry
// like the function logic, content to be included in the if statement must be indented.
if( startTimeOk() )
    // === STRATEGY - LONG POSITION EXECUTION ===
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    strategy.close( id = "Long", when = exitLong )
    
    // === STRATEGY - SHORT POSITION EXECUTION ===
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    strategy.close( id = "Short", when = exitShort )
    
    // === STRATEGY RISK MANAGEMENT EXECUTION ===
    strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
    strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)