GitHub で見る

ダブルチャネル EA 戦略

概要

ダブル チャネル EA は、MetaTrader 4 エキスパート アドバイザー「DoubleChannelEA_v1.2」の取引ロジックを複製します。 StockSharp p ort はカスタム iDoubleChannel_v1.5 インジケーターを適応させ、インジケーターが矢印を出力したときにブレイクアウト トレードを実行します。戦略 y は、構成可能なリスク管理とスケジュール フィルターを備えた任意のテスト用に設計されています。

主な特徴:

  • カスタム DoubleChannelIndicator は、上位、下位、中央のチャネル バッファーと買い/売りの矢印シグナルを再構築します。
  • キャンドル サブスクリプション、レベル 1 のスプレッド検証、ネイティブ注文ヘルパーによる高レベルの API の使用法。
  • オプションの資金管理ツール: スタックポジション、損益分岐点、トレーリングストップ、テイクプロフィット、ストップロスロジック。
  • 時刻フィルターとスプレッドフィルターは、ユーザー定義の動作条件外のエントリをブロックします。

取引ロジック

  1. 選択した CandleType を購読し、完成した各キャンドルを DoubleChannelIndicator に送ります。
  2. このインジケーターは、ChannelPeriod ローソク足の移動ウィンドウを保存し、以下を計算します。
    • 中央の線: 終値の算術平均。
    • 上の線: 中間値に、高値と安値から得られる 2 つの価格エンベロープの差を加えたもの。
    • 下の線: 中央値に、始値と安値から得られる相補的なエンベロープの差を加えたもの。
    • 矢印シグナル: 前の 2 つのチャネル位置が反転し、前のローソク足がブレの方向に閉じる必要があります。 コウト。ルールはMT4のバッファ条件と一致します。
  3. シグナルを IndicatorShift バー分遅らせて、インジケーターシフトパラメーターを再現できます。
  4. 買いシグナルはロングポジションをオープンします (OpenEverySignal = true の場合にスタッキングが可能)。売りシグナルによりショートポジションがオープンします。オペ ポサイト ポジションは、CloseInSignal = true のときにすぐにクローズできます。
  5. 保護出口は、完成したすべてのキャンドルのアクティブな位置を管理します。
    • 絶対価格単位で表される静的なストップロス/テイクプロフィット距離。
    • 価格が BreakEvenPoints + BreakEvenAfterPoints 上昇すると損益分岐点が有効になります。
    • 更新する前に TrailingStepPoints の改善が必要なトレーリング ストップ。
  6. 次の場合、エントリは拒否されます。
    • このストラテジーは取引時間外 (UseTimeFilter) です。
    • ライブ スプレッドは MaxSpreadPoints を超えています。
    • MaxOrders 個のスタック ポジションが現在の方向に対してすでにオープンしています。

資金管理

注文量は次のように計算されます。

「」 volume = ManualLotSize * (AutoLotSize ? max(RiskFactor, 0.1) : 1) 「」

反転する場合、戦略には自動的に絶対反対のポジションが含まれ、1 つのマーチで新しい方向に反転します。 ケット注文。

パラメーター

パラメータ デフォルト 説明
CandleType 15分の時間枠 キャンドルのプライマリーサブスクリプション。
ChannelPeriod 14 カスタム チャネルをルックバックします。
IndicatorShift 0 インジケーター値に基づいて動作する前の遅延。
OpenEverySignal 本当の 連続する信号で位置を積み重ねることができます。
CloseInSignal 反対の矢印が表示されたら、現在位置を閉じます。
UseTakeProfit TakeProfitPoints を有効にします。
TakeProfitPoints 10 ターゲットの絶対価格距離。
UseStopLoss StopLossPoints を有効にします。
StopLossPoints 10 保護ストップの絶対価格距離。
UseTrailingStop TrailingStopPointsTrailingStepPoints を使用して後続ロジックを有効にします。
TrailingStopPoints 5 現在の価格からトレーリングストップまでの距離。
TrailingStepPoints 1 トレーリングストップを更新する前に、最小限の改善が必要です。
UseBreakEven 損益分岐点調整が可能になります。
BreakEvenPoints 4 損益分岐点がアクティブになった場合の目標ストップレベル。
BreakEvenAfterPoints 2 損益分岐点を有効にする前に追加利益が必要です。
AutoLotSize 本当の 手動ロットに RiskFactor を掛けます。
RiskFactor 1 自動サイジング時に適用されるリスク乗数。
ManualLotSize 0.01 自動サイズ調整が無効になっている場合のベース ボリューム。
UseTimeFilter スケジュールフィルターを有効にします。
TimeStartTrade 0 取引開始時間(含む)。
TimeEndTrade 0 取引終了時間(限定)。開始と終了が等しいということは、制限がないことを意味します。
MaxOrders 0 方向ごとの最大スタック位置 (0 = 無制限)。
MaxSpreadPoints 0 価格単位での最大許容ビッドアスクスプレッド。

変換時の注意点

  • 元のインジケーターは、値を 1 バー前にシフトすることによって矢印をレンダリングしました。 StockSharp バージョンには以前のスナップショットが保存され、 現在のローソク足でシグナルを発する前に、同じクロスオーバー基準をチェックします。
  • スプレッド フィルタリングはレベル 1 データに依存します。見積もりが利用できない場合、この戦略は新しい注文をブロックし、MQL のエクスペーションを模倣します。 拡散情報無しで取引拒否したrt。
  • MT4 の資金管理では、アカウントベースの計算が使用されていました。移植性を考慮して、ボリュームの計算式はリスク乗算に簡略化されました。 手動ロットサイズに適用されます。
  • ストップロス、テイクプロフィット、トレーリングストップ、損益分岐点距離は、絶対価格単位で解釈されます(同じ規則です)。 他の StockSharp コンバージョン)。楽器のティックサイズに応じて調整してください。
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Double Channel EA strategy: BB + EMA trend.
/// Buys when close touches lower BB. Sells when close touches upper BB.
/// </summary>
public class DoubleChannelEaStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _bbPeriod;
	private readonly StrategyParam<int> _emaPeriod;

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

	public int BbPeriod
	{
		get => _bbPeriod.Value;
		set => _bbPeriod.Value = value;
	}

	public int EmaPeriod
	{
		get => _emaPeriod.Value;
		set => _emaPeriod.Value = value;
	}

	public DoubleChannelEaStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

		_bbPeriod = Param(nameof(BbPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("BB Period", "Bollinger Bands period", "Indicators");

		_emaPeriod = Param(nameof(EmaPeriod), 50)
			.SetGreaterThanZero()
			.SetDisplay("EMA Period", "EMA period for trend", "Indicators");
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var bb = new BollingerBands { Length = BbPeriod };
		var ema = new ExponentialMovingAverage { Length = EmaPeriod };

		decimal? prevClose = null;
		decimal? prevEma = null;

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

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var bbv = (BollingerBandsValue)bbVal;
				if (bbv.UpBand is not decimal upper || bbv.LowBand is not decimal lower)
					return;

				if (emaVal.IsEmpty)
					return;

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

				if (prevClose.HasValue && prevEma.HasValue)
				{
					var crossAboveEma = prevClose.Value <= prevEma.Value && close > emaDecimal;
					var crossBelowEma = prevClose.Value >= prevEma.Value && close < emaDecimal;

					if (crossAboveEma && Position <= 0)
						BuyMarket();
					else if (crossBelowEma && Position >= 0)
						SellMarket();
				}

				prevClose = close;
				prevEma = emaDecimal;
			})
			.Start();

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