GitHub で見る
東京セッション戦略
概要
東京セッション戦略は、StockSharp の MetaTrader エキスパートアドバイザー TokyoSessionEA_v2.8 のロジックを複製します。の
この戦略は、アジア (東京) セッション前後の日中ブレイクアウトまたは平均回帰取引向けに設計されています。それは、
設定可能な時間にローソクを参照し、そのローソクから価格チャネルを構築し、ブレイクアウトまたはリバウンドを評価します。
別の目標時間の状態。選択したシグナル モードに応じて、戦略は、
レベルブレイクアウト(基準範囲を超えて広がるフェードムーブ)、またはブレイクアウト方向に沿って。
StockSharp ポートは、高レベルの API の使用に重点を置いています。すべてのシグナル計算はキャンドルサブスクリプション内で実行されます。
ハンドラー、停止は StartProtection を通じて管理され、動作を維持するためにすべてのアクションは LogInfo を通じて記録されます。
バックテストやライブ取引中は透明性が保たれます。
取引ロジック
- 参照ローソク足 –
TimeSetLevels (ブローカー時間) に、ストラテジーはローソク足の高値、安値、終値を記録します。これら
値はセッション チャネルを定義し、内部検証フラグをリセットします。
- チャネル検証 – 基準時間とエントリー時間の間に終了したすべてのローソク足が無効になる可能性があります。
構成に応じて保留中の信号:
CheckAllBars: 有効にした場合、終値はキャプチャされた高値と安値の間にとどまる必要があります。
ReCheckPrices: TimeRecheckPrices で、ローソク足の終値が移動平均と比較され、勢いが確認されます。
- エントリーの評価 –
TimeCheckLevels の前のローソク足が終了すると、戦略はその終値と比較します
チャンネルの境界線と一緒に。終値が設定された距離範囲内にある場合、対応するポジションがオープンされます。
- 出口 – ポジションは 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 に設定します。 |
ワークフロー
- 有効な価格ステップ (
Security.PriceStep) を持つ商品に戦略をデプロイします。
- 希望の時間枠を選択し、毎日のスケジュールを取引所に合わせてブローカーの時間オフセットを構成します。
- 距離フィルターと検証フィルターを調整して、元の EA の動作に一致させるか、さまざまな市場に適応させます。
- リスクパラメータを設定します。 StockSharp ポートは、
StartProtection を通じてストップとトレーリング ロジックをネイティブに管理します。
- 戦略を開始します。ログメッセージは、キャプチャされたレベル、開かれた取引、および終了の決定を報告します。
UseFloatingPoint および PipsFloatingPoint に基づく浮動小数点エントリは、StockSharp のため実装されていません
シグナルが生成された時点で成行注文を実行します。
- 高レベルのローソク足サブスクリプションではティックレベルの買い/売りデータが提供されないため、スプレッドおよびスリッページ フィルターは省略されます。
- 自動資金管理(
AutoLotSize、RiskFactor、回収ロット、プリセットシンボルの切り替え)は、
より単純な 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);
}
}
}
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 AverageTrueRange
from StockSharp.Algo.Strategies import Strategy
class tokyo_session_strategy(Strategy):
def __init__(self):
super(tokyo_session_strategy, self).__init__()
self._atr_period = self.Param("AtrPeriod", 14) \
.SetDisplay("ATR Period", "ATR period for volatility filter", "Indicators")
self._atr = None
self._session_high = None
self._session_low = None
self._candle_count = 0
self._range_set = False
self._prev_close = None
@property
def atr_period(self):
return self._atr_period.Value
def OnReseted(self):
super(tokyo_session_strategy, self).OnReseted()
self._atr = None
self._session_high = None
self._session_low = None
self._candle_count = 0
self._range_set = False
self._prev_close = None
def OnStarted2(self, time):
super(tokyo_session_strategy, self).OnStarted2(time)
self._atr = AverageTrueRange()
self._atr.Length = self.atr_period
self._session_high = -999999999.0
self._session_low = 999999999.0
self._candle_count = 0
self._range_set = False
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(30)))
subscription.Bind(self._atr, self._process_candle)
subscription.Start()
def _process_candle(self, candle, atr_value):
if candle.State != CandleStates.Finished:
return
if not self._atr.IsFormed:
return
self._candle_count += 1
high = float(candle.HighPrice)
low = float(candle.LowPrice)
close = float(candle.ClosePrice)
if self._candle_count <= 4:
if high > self._session_high:
self._session_high = high
if low < self._session_low:
self._session_low = low
if self._candle_count == 4:
self._range_set = True
self._prev_close = close
return
if not self._range_set:
self._prev_close = close
return
if self._candle_count % 48 == 0:
self._session_high = high
self._session_low = low
self._range_set = False
self._candle_count = 0
self._prev_close = close
return
if self._prev_close is not None:
cross_above = self._prev_close <= self._session_high and close > self._session_high
cross_below = self._prev_close >= self._session_low and close < self._session_low
if cross_above and self.Position <= 0:
self.BuyMarket()
elif cross_below and self.Position >= 0:
self.SellMarket()
self._prev_close = close
def CreateClone(self):
return tokyo_session_strategy()