ホーム
/
戦略のサンプル
GitHub で見る
深度ドローダウン MA 戦略
概要
深度ドローダウン MA 戦略は、MetaTrader 5 のエキスパートアドバイザー「Deep Drawdown MA (barabashkakvn's edition)」を StockSharp の高レベル API に直接変換したものです。この戦略は移動平均クロスオーバーを取引しながら、ドローダウンに陥ったトレードを保護するために設計されたブレークイーブンメカニズムを適用します。StockSharp バージョンは設定可能な移動平均パラメーター、集約エントリー数の制限機能、シグナル反転時の損失トレードを即座に清算するオプションを保持しています。
取引ロジック
インジケーター : 個別の期間、価格ソース、過去シフトを持つ 2 つの移動平均。両平均は同じ平滑化メソッドを共有します(SMA、EMA、SMMA、または LWMA)。
エントリー条件 :
ロング : シフトされた高速平均がシフトされた低速平均を上回ります。最後のエントリーがロングでなく、最大ポジション上限を超えない場合、戦略は設定された注文ボリュームを追加します(および任意のショートエクスポージャーをカバーします)。
ショート : シフトされた高速平均がシフトされた低速平均を下回ります。前のエントリーがショートでなく、最大ポジション上限が許す場合、戦略は設定されたボリュームを売ります(および任意のロングエクスポージャーをカバーします)。
エグジット条件 :
ロング : 高速平均が低速平均を下回るクロスが発生したとき、ポジションは即座に閉じられます(CloseLosses = true)または、ブレークイーブンエグジットのためにマークされます。ブレークイーブンエグジット中、戦略はローソク足の終値が平均エントリー価格に戻るまで待機してからフラット化します。
ショート : 鏡像動作 — 強気クロスでポジションは即座に閉じられるか、価格が平均エントリーに戻ったときにトリガーされるブレークイーブン目標で武装されます。
ポジション追跡 : 平均エントリー価格と最後に開いた方向は、高レベル API が MQL 動作を再現できるように独自のトレードから再構築されます。
パラメーター
名前
説明
デフォルト
OrderVolume
各市場操作の注文サイズ。
0.1
MaxPositions
方向ごとの集約ロットの最大数(ネットエクスポージャー)。
5
CloseLosses
反転時にブレークイーブンを待つのではなく損失トレードを即座に閉じる。
false
FastMaPeriod / SlowMaPeriod
高速および低速移動平均の長さ。
10 / 30
FastMaShift / SlowMaShift
各移動平均に適用される過去シフト(MT5 のシフト引数をエミュレート)。
3 / 0
FastPriceType / SlowPriceType
各移動平均が使用する価格ソース(Close、Open、High、Low、Median、Typical、Weighted)。
Close
MaMethod
両方の移動平均が共有する平滑化メソッド(SMA、EMA、SMMA、LWMA)。
SMA
CandleType
計算に使用するローソク足シリーズ。
15 分ローソク足
変換メモ
オリジナルの MetaTrader ロボットはヘッジされたロングとショートのポジションを同時に保持できました。StockSharp 戦略はネットポジションで動作します;したがって、変換されたバージョンは最大ポジション数を尊重しながら集約エクスポージャーを適用します。
ブレークイーブン保護は MT5 の注文変更ではなく内部フラグで実装されています。戦略はローソク足のクローズを監視し、再構築された平均エントリー価格でエグジットします。
移動平均の「シフト」パラメーターは最近のインジケーター値の短いキューを維持することで再現され、低レベルのインジケーターバッファを呼び出さずに MT5 の shift 引数を反映します。
使用方法
戦略を目的のセキュリティに添付し、OrderVolume、ローソク足タイプ、移動平均パラメーターをターゲット市場に合わせて設定する。
戦略が実行中でローソク足サブスクリプションがオンラインになったら取引を有効にする。
ログでブレークイーブンフラグを監視する:価格が平均エントリーに戻ると、トレードは自動的にフラット化されます。
リスク管理
CloseLosses = true を使用して、平均が反転したときに損失トレードの迅速な清算を強制する。
MaxPositions を調整して、連続した交互エントリー後の集約エクスポージャーを上限設定する。
追加のセーフガードとして StockSharp で利用可能なアカウントレベルのリスクコントロール(例:StartProtection)と組み合わせる。
ファイル
CS/DeepDrawdownMaStrategy.cs – StockSharp 高レベル API を使用した C# 実装。
README.md、README_ru.md、README_zh.md – 戦略の動作とパラメーターの多言語ドキュメント。
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Deep drawdown MA crossover strategy (simplified).
/// Uses fast/slow EMA crossover with position management.
/// </summary>
public class DeepDrawdownMaStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int FastPeriod
{
get => _fastPeriod.Value;
set => _fastPeriod.Value = value;
}
public int SlowPeriod
{
get => _slowPeriod.Value;
set => _slowPeriod.Value = value;
}
public DeepDrawdownMaStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_fastPeriod = Param(nameof(FastPeriod), 10)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast EMA", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 30)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow EMA", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
decimal prevFast = 0, prevSlow = 0;
bool hasPrev = false;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, (ICandleMessage candle, decimal fastValue, decimal slowValue) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!hasPrev)
{
prevFast = fastValue;
prevSlow = slowValue;
hasPrev = true;
return;
}
if (!IsFormedAndOnlineAndAllowTrading())
{
prevFast = fastValue;
prevSlow = slowValue;
return;
}
if (prevFast <= prevSlow && fastValue > slowValue && Position <= 0)
BuyMarket();
else if (prevFast >= prevSlow && fastValue < slowValue && Position >= 0)
SellMarket();
prevFast = fastValue;
prevSlow = slowValue;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, fast);
DrawIndicator(area, slow);
DrawOwnTrades(area);
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class deep_drawdown_ma_strategy(Strategy):
def __init__(self):
super(deep_drawdown_ma_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Candles", "General")
self._fast_period = self.Param("FastPeriod", 10) \
.SetDisplay("Fast Period", "Fast EMA", "Indicators")
self._slow_period = self.Param("SlowPeriod", 30) \
.SetDisplay("Slow Period", "Slow EMA", "Indicators")
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@property
def FastPeriod(self):
return self._fast_period.Value
@property
def SlowPeriod(self):
return self._slow_period.Value
def OnReseted(self):
super(deep_drawdown_ma_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(deep_drawdown_ma_strategy, self).OnStarted2(time)
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
fast = ExponentialMovingAverage()
fast.Length = self.FastPeriod
slow = ExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def _on_process(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
fv = float(fast_value)
sv = float(slow_value)
if not self._has_prev:
self._prev_fast = fv
self._prev_slow = sv
self._has_prev = True
return
if self._prev_fast <= self._prev_slow and fv > sv and self.Position <= 0:
self.BuyMarket()
elif self._prev_fast >= self._prev_slow and fv < sv and self.Position >= 0:
self.SellMarket()
self._prev_fast = fv
self._prev_slow = sv
def CreateClone(self):
return deep_drawdown_ma_strategy()