GitHub で見る

TradePad サンプル戦略

概要

TradePad サンプル戦略 は、MetaTrader「TradePad」サンプルの移植です。元の専門アドバイザーは、次のグリッドをレンダリングしました。 現在の Stochastic オシレーターで各セルを色分けすることで、複数のシンボルの短期トレンドを表示するボタン 読書。この StockSharp 実装はサンプルの分析コアを保持し、機器のリストの監視に重点を置いています。 チャート上のユーザーインターフェイスを複製する必要はありません。この戦略は、設定されたすべてのシンボルのローソク足データをサブスクライブし、 Stochastic オシレーターを使用し、各銘柄を 上昇トレンド下降トレンド、または フラット 状態に分類します。クラスが変わるたびに、 この戦略は、元の TradePad によって実行された色の変更と同様のログ メッセージを書き込みます。

この戦略は注文を出しません。その目標は、裁量トレーダーが複数の市場を一度に追跡し、特定できるように支援することです。 手動操作を必要とする勢いの変化 (チャートの切り替えや取引の準備など)。

仕組み

  1. シンボル検出SymbolList パラメータは、ティッカーのカンマ区切りリストを受け入れます。リストが指定されていない場合、 戦略はランナーで割り当てられたメインの Security にフォールバックします。
  2. キャンドル サブスクリプション – 各シンボルは、CandleType を通じて設定された同じ時間枠を使用します。
  3. インジケーター処理 – 専用の StochasticOscillator インスタンスがローソク足ストリームにバインドされます。キャンドルがあるときは、 完了したインジケーターは、トレンド分類に使用される %K 値を生成します。
  4. トレンド分類UpperLevel を上回る測定値は 上昇傾向 にマッピングされ、LowerLevel を下回る測定値は 下降傾向 にマッピングされます。 その間はすべて フラット です。最後のオシレーター値は LatestKValues に保存されます。
  5. 更新間隔 – この戦略は、元の TradePad のタイマー動作を模倣します。変更は 1 回あたり最大 1 回記録されます。 複数のローソク足が間隔内に到着した場合でも、各シンボルに対して TimerPeriodSeconds が発生します。

パラメーター

パラメータ 説明
SymbolList 監視する機器のカンマ区切りのリスト。空の文字列は「メインセキュリティを使用する」ことを意味します。
TimerPeriodSeconds シンボルごとの状態更新間の最小秒数。ローソク足が非常に短い場合のログスパムを防ぎます。
StochasticLength 生の %K 行を計算するために使用されるルックバック期間。
StochasticKPeriod %K ラインに適用される平滑化期間。
StochasticDPeriod %D 行に適用される平滑化期間 (戦略は %K のみを読み取りますが、完全を期すために保持されています)。
UpperLevel このしきい値を超えるとシンボルが上昇傾向にあると見なされます。
LowerLevel このしきい値を下回るとシンボルが下降トレンドにあると見なされます。
CandleType インジケーターの計算に使用されるローソク足の時間枠。

使用上の注意

  • 指定されたティッカーがコネクタから利用できることを確認します。欠落しているシンボルはログに報告され、スキップされます。
  • TrendStates プロパティは、外部ダッシュボードまたはデザイナー ブロックの最新の分類を公開します。
  • デザイナーまたはランナー内の戦略を使用して、AddInfoLog に反応する独自のビジュアル (ダッシュボード、グラフ) を添付します。 メッセージまたは公開辞書。
  • 注文は送信されないため、この戦略は純粋に監視目的でライブ データ プロバイダー上で安全に実行できます。

元の MQL の動作と StockSharp のバージョン

MQL5 機能 StockSharpの実装
ボタンのグラフィカルなグリッド デザイナーでカスタム UI を構築できるように、ログ エントリおよびパブリック ディクショナリとして公開されます。
手動の買い/売りボタン 未実装。戦略は意図的に受動的なままです。
チャートのドラッグロジック StockSharp には該当せず、省略されています。
トレンドカラーのアップデート シンボルごとに TimerPeriodSeconds ごとにトリガーされるトレンド状態の変化に置き換えられます。

戦略の拡張

  • TrendStates 辞書をデザイナー ウィジェットに接続し、XAML コントロールを使用してカラー パッドを再構築します。
  • シンボルが フラット から 上昇トレンド または 下降トレンド に遷移したときのアラートまたは通知を追加します。
  • 強い勢いを特定した後でエントリーを自動化したい場合は、分類と注文ロジックを組み合わせます。
namespace StockSharp.Samples.Strategies;

using System;

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

/// <summary>
/// TradePad Sample strategy.
/// Classifies market state using Stochastic oscillator and trades on state transitions.
/// Buys when stochastic crosses up from oversold, sells when it crosses down from overbought.
/// </summary>
public class TradePadSampleStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _stochasticKPeriod;
	private readonly StrategyParam<int> _stochasticDPeriod;
	private readonly StrategyParam<decimal> _upperLevel;
	private readonly StrategyParam<decimal> _lowerLevel;

	private decimal _prevK;
	private bool _hasPrev;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int StochasticKPeriod { get => _stochasticKPeriod.Value; set => _stochasticKPeriod.Value = value; }
	public int StochasticDPeriod { get => _stochasticDPeriod.Value; set => _stochasticDPeriod.Value = value; }
	public decimal UpperLevel { get => _upperLevel.Value; set => _upperLevel.Value = value; }
	public decimal LowerLevel { get => _lowerLevel.Value; set => _lowerLevel.Value = value; }

	public TradePadSampleStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe", "General");

		_stochasticKPeriod = Param(nameof(StochasticKPeriod), 10)
			.SetDisplay("Stochastic %K", "%K period", "Indicators");

		_stochasticDPeriod = Param(nameof(StochasticDPeriod), 3)
			.SetDisplay("Stochastic %D", "%D period", "Indicators");

		_upperLevel = Param(nameof(UpperLevel), 75m)
			.SetDisplay("Upper Threshold", "Overbought level", "Signals");

		_lowerLevel = Param(nameof(LowerLevel), 25m)
			.SetDisplay("Lower Threshold", "Oversold level", "Signals");
	}

	/// <inheritdoc />
	public override System.Collections.Generic.IEnumerable<(StockSharp.BusinessEntities.Security sec, DataType dt)> GetWorkingSecurities()
		=> [(Security, CandleType)];

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevK = 0;
		_hasPrev = false;
	}

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

		_hasPrev = false;

		var stochastic = new StochasticOscillator();
		stochastic.K.Length = StochasticKPeriod;
		stochastic.D.Length = StochasticDPeriod;

		var subscription = SubscribeCandles(CandleType);

		subscription
			.BindEx(stochastic, ProcessCandle)
			.Start();

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

	private void ProcessCandle(ICandleMessage candle, IIndicatorValue stochVal)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (!stochVal.IsFinal || !stochVal.IsFormed)
			return;

		var stoch = (StochasticOscillatorValue)stochVal;
		if (stoch.K is not decimal kValue)
			return;

		if (!_hasPrev)
		{
			_prevK = kValue;
			_hasPrev = true;
			return;
		}

		// Buy: stochastic crosses up through lower level (leaving oversold)
		var crossUp = _prevK <= LowerLevel && kValue > LowerLevel;
		// Sell: stochastic crosses down through upper level (leaving overbought)
		var crossDown = _prevK >= UpperLevel && kValue < UpperLevel;

		if (crossUp && Position <= 0)
		{
			BuyMarket();
		}
		else if (crossDown && Position >= 0)
		{
			SellMarket();
		}

		_prevK = kValue;
	}
}