GitHub で見る

東京セッション戦略

概要

東京セッション戦略は、StockSharp の MetaTrader エキスパートアドバイザー TokyoSessionEA_v2.8 のロジックを複製します。の この戦略は、アジア (東京) セッション前後の日中ブレイクアウトまたは平均回帰取引向けに設計されています。それは、 設定可能な時間にローソクを参照し、そのローソクから価格チャネルを構築し、ブレイクアウトまたはリバウンドを評価します。 別の目標時間の状態。選択したシグナル モードに応じて、戦略は、 レベルブレイクアウト(基準範囲を超えて広がるフェードムーブ)、またはブレイクアウト方向に沿って。

StockSharp ポートは、高レベルの API の使用に重点を置いています。すべてのシグナル計算はキャンドルサブスクリプション内で実行されます。 ハンドラー、停止は StartProtection を通じて管理され、動作を維持するためにすべてのアクションは LogInfo を通じて記録されます。 バックテストやライブ取引中は透明性が保たれます。

取引ロジック

  1. 参照ローソク足TimeSetLevels (ブローカー時間) に、ストラテジーはローソク足の高値、安値、終値を記録します。これら 値はセッション チャネルを定義し、内部検証フラグをリセットします。
  2. チャネル検証 – 基準時間とエントリー時間の間に終了したすべてのローソク足が無効になる可能性があります。 構成に応じて保留中の信号:
    • CheckAllBars: 有効にした場合、終値はキャプチャされた高値と安値の間にとどまる必要があります。
    • ReCheckPrices: TimeRecheckPrices で、ローソク足の終値が移動平均と比較され、勢いが確認されます。
  3. エントリーの評価TimeCheckLevels の前のローソク足が終了すると、戦略はその終値と比較します チャンネルの境界線と一緒に。終値が設定された距離範囲内にある場合、対応するポジションがオープンされます。
  4. 出口 – ポジションは 3 つのメカニズムで決済できます。
    • CloseInSignal は、価格がチャネル内に戻ると取引を終了します (ロジックは元の EA を反映しています)。
    • CloseOrdersOnTime は、次のセッションにリスクが持ち込まれることを避けるために、TimeCloseOrders でフラットになります。
    • 保護ストップ、トレーリング ストップ、損益分岐点処理は、StockSharp 保護サブシステムに委任されます。

パラメーター

一般

パラメータ 説明
CandleType 分析に使用されるローソク足シリーズ (デフォルトは H1)。
BrokerOffset ブローカー時間とGMTの差(時間単位)。

信号

パラメータ 説明
TypeOfSignals ContraryTrend はブレイクアウトのフェードアウトを再現します。 AccordingTrend はブレイクアウトの方向に従います。
TimeSetLevels 基準ローソクが捕捉されたときの時間 (0 ~ 23)。
TimeCheckLevels ブレークアウト条件が評価される時間。
TimeRecheckPrices 追加の勢いチェックアワー。
MinDistanceOfLevel 取引が許可されるまでの終値とチャネル間の最小距離 (ピップ単位)。
MaxDistanceOfLevel レベルからの最大距離 (pips 単位)。ゼロを指定すると制限が無効になります。
ReCheckPrices 追加の運動量フィルターを有効または無効にします。
CheckAllBars すべての中間クローズがチャネル内に留まる必要があります。

リスク管理

パラメータ 説明
CloseInSignal 価格がチャネル境界を通過したら終了します。
CloseOrdersOnTime TimeCloseOrders 以降のポジションをフラット化します。
TimeCloseOrders 時間ベースの出口で使用される時間。
UseTakeProfit, TakeProfit 固定テイクプロフィット (pips) を有効にして設定します。
UseStopLoss, StopLoss 保護ストップロス (pips) を有効にして設定します。
UseTrailingStop, TrailingStop, TrailingStep StockSharp トレーリング ストップ管理 (pips) を有効にします。
UseBreakEven, BreakEven, BreakEvenAfter 利益がトリガー距離に達したら、ストップロスを損益分岐点に移動します。

取引

パラメータ 説明
Volume 基本注文量。方向を反転すると、反対側の位置が自動的に閉じられます。
MaxOrders 一方向に許可される Volume ブロックの最大数。制限なしの場合は 0 に設定します。

ワークフロー

  1. 有効な価格ステップ (Security.PriceStep) を持つ商品に戦略をデプロイします。
  2. 希望の時間枠を選択し、毎日のスケジュールを取引所に合わせてブローカーの時間オフセットを構成します。
  3. 距離フィルターと検証フィルターを調整して、元の EA の動作に一致させるか、さまざまな市場に適応させます。
  4. リスクパラメータを設定します。 StockSharp ポートは、StartProtection を通じてストップとトレーリング ロジックをネイティブに管理します。
  5. 戦略を開始します。ログメッセージは、キャプチャされたレベル、開かれた取引、および終了の決定を報告します。

MetaTrader バージョンとの違い

  • UseFloatingPoint および PipsFloatingPoint に基づく浮動小数点エントリは、StockSharp のため実装されていません シグナルが生成された時点で成行注文を実行します。
  • 高レベルのローソク足サブスクリプションではティックレベルの買い/売りデータが提供されないため、スプレッドおよびスリッページ フィルターは省略されます。
  • 自動資金管理(AutoLotSizeRiskFactor、回収ロット、プリセットシンボルの切り替え)は、 より単純な Volume パラメータと MaxOrders パラメータ。ポジションのサイジングは戦略設定で直接調整する必要があります。
  • サウンド通知と印刷通知は、LogInfo メッセージに置き換えられます。

他のすべての信号条件、検証ゲート、時間ベースの終了は、元の EA の動作を反映します。

注意事項

  • デフォルトの構成は、元のエキスパートアドバイザーが推奨する下半期の時間枠に合わせて調整されています。他の時間枠 を使用することもできますが、時間ベースのロジックでは、ローソク足の期間が 1 時間を均等に分割することを前提としています。
  • データ フィードが、選択した時間枠で継続的なローソク足を配信していることを確認します。キャンドルが足りないと無効になる可能性があります 平均とチャンネルのチェック。
  • この戦略は成行注文を送信することでポジションをクローズするため、指値注文または最低保有額を必要とするブローカーは 場合によっては追加の調整が必要になる場合があります。
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Tokyo Session strategy: breakout from session range.
/// Tracks high/low during first hours, then buys breakout above high, sells below low.
/// </summary>
public class TokyoSessionStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _atrPeriod;

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

	public int AtrPeriod
	{
		get => _atrPeriod.Value;
		set => _atrPeriod.Value = value;
	}

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

		_atrPeriod = Param(nameof(AtrPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("ATR Period", "ATR period for volatility filter", "Indicators");
	}

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

		var atr = new AverageTrueRange { Length = AtrPeriod };

		var sessionHigh = decimal.MinValue;
		var sessionLow = decimal.MaxValue;
		var candleCount = 0;
		var rangeSet = false;
		decimal? prevClose = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(atr, (candle, atrVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				candleCount++;

				// Build range from first 4 candles (2 hours of 30min candles)
				if (candleCount <= 4)
				{
					if (candle.HighPrice > sessionHigh)
						sessionHigh = candle.HighPrice;
					if (candle.LowPrice < sessionLow)
						sessionLow = candle.LowPrice;

					if (candleCount == 4)
						rangeSet = true;

					prevClose = candle.ClosePrice;
					return;
				}

				if (!rangeSet)
				{
					prevClose = candle.ClosePrice;
					return;
				}

				// Reset range every 48 candles (24 hours of 30min candles)
				if (candleCount % 48 == 0)
				{
					sessionHigh = candle.HighPrice;
					sessionLow = candle.LowPrice;
					rangeSet = false;
					candleCount = 0;
					prevClose = candle.ClosePrice;
					return;
				}

				var close = candle.ClosePrice;

				if (prevClose.HasValue)
				{
					var crossAboveHigh = prevClose.Value <= sessionHigh && close > sessionHigh;
					var crossBelowLow = prevClose.Value >= sessionLow && close < sessionLow;

					if (crossAboveHigh && Position <= 0)
						BuyMarket();
					else if (crossBelowLow && Position >= 0)
						SellMarket();
				}

				prevClose = close;
			})
			.Start();

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