GitHub で見る

Donchian ダフ屋

概要

Donchian スカルパーは、MetaTrader 4 エキスパート アドバイザー DonchianScalperEA の StockSharp 移植版です。この戦略は、Donchian チャネル境界と同じ長さの指数移動平均 (EMA) を監視します。未決のストップ注文は、価格が EMA を抜けて引き戻された後にのみ準備され、潜在的なブレイクアウトの前に勢いがリセットされたことを示します。エントリーは、現在の Donchian の極値で配置され、反対側のバンドによって保護された逆指値注文で約定されます。利益は、固定のテイクプロフィットディスタンス、または選択した市場構造を追跡する適応型トレーリングストップのいずれかによって管理されます。

戦略ロジック

エントリー準備

  • プルバック検証 – この戦略は、以前に閉じた 2 つのローソク足のいずれかが EMA (ロングの場合) を下回るか、EMA (ショートの場合) を上回るまで待機します。横断レベルは、プルバックが意味のあるものであることを保証するために、設定可能な クロス アンカー 距離によってオフセットされます。
  • ブレイクアウト アーミング – プルバック条件が満たされ、クールダウン タイマーが期限切れになると、直近の Donchian 境界 (ロングの場合は上部バンド、ショートの場合は下部バンド) で逆指値注文が送信されます。反対側のバンドは、最初の保護停止を定義します。既存の未決注文は、Donchian レベルが少なくとも 2 つのローソク足で平坦になると、自動的に再調整されます。

貿易管理

  • 初期プロテクション – ブレイクアウト注文が約定すると、戦略は事前に計算されたストップ価格を使用してプロテクションストップ注文を発注します。ストップレベルは反対側の Donchian バンドに等しく、ストップロス (ポイント) 設定によって内側にシフトできます。
  • 利益管理 – 2 つの管理モードが利用可能です。
    • 利益確定 – 平均エントリー価格からの純移動量が設定された利益確定距離を超えるとポジションを決済します。
    • トレーリング – 取引をオープンに保ち、定期的に保護ストップを強化します。トレーリング エンジンは、Donchian 境界、EMA、または ATR ベースのボラティリティ バンドに従うことができます。
  • クールダウン – すべてのポジションがクローズされた後、ストラテジーは、新しいブレイクアウト注文を準備する前に、指定された数の完了したローソク足を待ちます。これは、取引間に少なくとも 3 つのバーを必要とする MetaTrader ロジックを再現します。

パラメーター

  • 出来高 – ストップエントリーとマーケットエグジットに使用される注文の量。
  • チャンネル期間 – Donchian チャンネルの長さ。EMA フィルターにも使用されます。
  • クロスアンカー – ブレイクアウト注文が準備される前にプルバックが超える必要がある追加距離 (ポイント単位)。
  • ストップロス (ポイント) – 最初の保護ストップのために反対側の Donchian バンドに追加される距離。 0 に設定すると、ストップがバンド上に直接配置されます。
  • 利益確定 (ポイント)利益で終了 モードで使用される利益目標。トレーリングモードがアクティブな場合は無視されます。
  • キャンドルタイプ – 時間枠の駆動インジケーターの計算。
  • プロフィットモード – 固定テイクプロフィットエグジットと適応トレーリングストップの間で選択します。
  • トレーリング モードトレーリング 利益モードで使用されるトレーリング エンジン。選択肢は、Donchian 境界、EMA、または ATR ベースの末尾です。
  • クールダウンバー – ポジションがフラットになった後、新しい注文が発注される前に通過する必要がある完成したキャンドルの最小数。
  • ATR 期間 / ATR 乗数 – ATR トレーリング エンジンのパラメータ。乗数は、トレーリング ストップを計算するために減算 (ロング) または追加 (ショート) される ATR の数を定義します。

追加の注意事項

  • この戦略は、取引所のコンプライアンスを確保するために、すべてのストップ価格とエントリー価格を商品の価格ステップに合わせます。
  • ロングストップ注文とショートストップ注文の両方がアクティブな場合、片側を約定すると、ヘッジを避けるために反対側の未決注文が自動的にキャンセルされます。
  • 利益モードが 利益でクローズ のままで テイクプロフィット (ポイント) がゼロに設定されている場合、この戦略は保護ストップに達するまでポジションをオープンしたままにします。
  • 変換は、高レベルの StockSharp API: インジケーター バインディング、ローソク足サブスクリプション、ヘルパー メソッド (BuyStopSellStopSellMarket など) に焦点を当てます。 Python 実装はこのパッケージには含まれていません。
using System;

using Ecng.Common;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Donchian Channel scalper with EMA filter.
/// Buys on upper channel breakout above EMA, sells on lower breakout below EMA.
/// Exits at middle band.
/// </summary>
public class DonchianScalperStrategy : Strategy
{
	private readonly StrategyParam<int> _channelPeriod;
	private readonly StrategyParam<DataType> _candleType;

	public int ChannelPeriod
	{
		get => _channelPeriod.Value;
		set => _channelPeriod.Value = value;
	}

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public DonchianScalperStrategy()
	{
		_channelPeriod = Param(nameof(ChannelPeriod), 50)
			.SetGreaterThanZero()
			.SetDisplay("Channel Period", "Donchian channel lookback", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var donchian = new DonchianChannels { Length = ChannelPeriod };
		var ema = new ExponentialMovingAverage { Length = ChannelPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.BindEx(donchian, ema, (candle, donchianVal, emaVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (donchianVal is not DonchianChannelsValue dcValue)
					return;

				if (dcValue.UpperBand is not decimal upper ||
					dcValue.LowerBand is not decimal lower ||
					dcValue.Middle is not decimal middle)
					return;

				if (emaVal.IsEmpty)
					return;

				var emaValue = emaVal.GetValue<decimal>();
				var close = candle.ClosePrice;

				// Long: close breaks above upper Donchian and is above EMA
				if (Position == 0 && close >= upper && close > emaValue)
					BuyMarket();
				// Short: close breaks below lower Donchian and is below EMA
				else if (Position == 0 && close <= lower && close < emaValue)
					SellMarket();
			})
			.Start();

		StartProtection(
			takeProfit: new Unit(2, UnitTypes.Percent),
			stopLoss: new Unit(1, UnitTypes.Percent)
		);

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, donchian);
			DrawIndicator(area, ema);
			DrawOwnTrades(area);
		}
	}
}