マーチンゲール付き移動平均
概要
SmaStrategyMartingaleStrategy は、2 つの単純移動平均(SimpleMovingAverage)のクロスオーバーに基づき、マーチンゲール要素を含む取引戦略です。この戦略は、長期 SMA と短期 SMA を使用してエントリーおよびエグジットシグナルを判定し、新しい取引ごとにポジションサイズを増やします。
主要コンポーネント
public class SmaStrategyMartingaleStrategy : Strategy
{
private readonly StrategyParam<int> _longSmaLength;
private readonly StrategyParam<int> _shortSmaLength;
private readonly StrategyParam<DataType> _candleType;
// 前回のインジケーター値を保存する変数
private decimal _prevLongValue;
private decimal _prevShortValue;
private bool _isFirstValue = true;
}
戦略パラメーター
この戦略では、次のパラメーターをカスタマイズできます。
- LongSmaLength - 長期移動平均期間(既定値は 80)
- ShortSmaLength - 短期移動平均期間(既定値は 30)
- CandleType - 使用するローソク足タイプ(既定値は 5 分)
すべてのパラメーターは、指定された値範囲で最適化に使用できます。
戦略の初期化
OnStarted2 メソッドで、SMA インジケーターが作成され、ローソク足購読が設定され、可視化が準備されます。
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// インジケーターを作成
var longSma = new SimpleMovingAverage { Length = LongSmaLength };
var shortSma = new SimpleMovingAverage { Length = ShortSmaLength };
// IsFormed の自動追跡のために、インジケーターを戦略コレクションに追加
Indicators.Add(longSma);
Indicators.Add(shortSma);
// 購読を作成し、インジケーターをバインド
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(longSma, shortSma, ProcessCandle)
.Start();
// チャート上の可視化を設定
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, longSma, System.Drawing.Color.Blue);
DrawIndicator(area, shortSma, System.Drawing.Color.Red);
DrawOwnTrades(area);
}
}
ローソク足の処理
ProcessCandle メソッドは、確定済みローソク足ごとに呼び出され、取引ロジックを実装します。
private void ProcessCandle(ICandleMessage candle, decimal longValue, decimal shortValue)
{
// 未確定ローソク足をスキップ
if (candle.State != CandleStates.Finished)
return;
// 戦略が取引可能な状態か確認
if (!IsFormedAndOnlineAndAllowTrading())
return;
// 最初の値では、シグナルを生成せずデータのみ保存
if (_isFirstValue)
{
_prevLongValue = longValue;
_prevShortValue = shortValue;
_isFirstValue = false;
return;
}
// インジケーター値の現在と前回の比較を取得
var isShortLessThenLongCurrent = shortValue < longValue;
var isShortLessThenLongPrevious = _prevShortValue < _prevLongValue;
// 次のローソク足のために現在値を前回値として保存
_prevLongValue = longValue;
_prevShortValue = shortValue;
// クロスオーバー(シグナル)を確認
if (isShortLessThenLongPrevious == isShortLessThenLongCurrent)
return;
// 新しい注文を出す前にアクティブ注文をキャンセル
CancelActiveOrders();
// 取引方向を判定
var direction = isShortLessThenLongCurrent ? Sides.Sell : Sides.Buy;
// ポジションサイズを計算(取引ごとにポジションを増やす - マーチンゲール方式)
var volume = Volume + Math.Abs(Position);
// 適切な価格で注文を作成して登録
var price = Security.ShrinkPrice(shortValue);
RegisterOrder(CreateOrder(direction, price, volume));
}
取引ロジック
- 買いシグナル: 短期 SMA が長期 SMA を下から上へクロスする場合
- 売りシグナル: 短期 SMA が長期 SMA を上から下へクロスする場合
- ポジションサイズは、新しい取引ごとに現在のポジション量だけ増加します(マーチンゲール要素)
- 注文価格は現在の短期 SMA 値に設定され、銘柄のティックサイズに丸められます
機能
- 戦略は
GetWorkingSecurities()メソッドによって、使用する銘柄を自動的に判定します - 戦略は確定済みローソク足でのみ動作します
- 戦略は SMA 間の現在および前回の関係を比較することで、インジケーターのクロスオーバーを追跡します
- 新しい注文を発注する前に、すべてのアクティブ注文がキャンセルされます
- マーチンゲール原則が実装されています。新しい取引ごとにポジションサイズを増やします
- グラフィック領域が利用可能な場合、インジケーターと約定がチャート上に可視化されます
- 最適な戦略設定を見つけるためのパラメーター最適化がサポートされています