GitHub で見る

グリッドテンプレート戦略

概要

この戦略は、MetaTrader 4 Expert Advisor Grid_Template の StockSharp 移植です。保留中の STO の対称グリッドを構築します p は現在の買値/売値を中心に注文し、トレーダーがカスタム エントリー フィルターを接続したり、純粋なブレイクアウト テンプレートとして実行したりすることができます。オンク すべてのグリッド注文が実行されるか期限切れになると、エンジンはすぐに次のグリッドを準備します。実装では t が保存されます。 オプションの資金管理方式と、設定可能な数の注文が経過した後に古い未決注文を自動的に削除する機能 何時間も。

取引ロジック

  • レベル 1 の相場を購読して、最良の買値/売値を継続的に追跡します。キャンドルやインジケーターは必要ありません。
  • 口座にオープンポジションがなく、アクティブなストラテジー注文もない場合は、アスクの上に GridOrders の買いストップ注文を出し、`G RidOrders は指値以下でストップ注文を売ります。
  • 最初のグリッド レベルは、現在の市場価格から PriceDistancePips だけオフセットされます。後続のレベルごとに GridStepPips m が追加されます 鉱石の距離。
  • すべてのエントリーは同じ固定ボリューム (またはマネー管理サイズ) と、p で表される同じストップロスとテイクプロフィットの距離を使用します。 イプス。
  • 未決注文が約定されるとすぐに、ストラテジーは対応する保護注文 (ストップロスとテイクプロフィット) を次のように登録します。 独立したストップ/リミット注文。これらは、識別しやすいように同じコメントを継承します。
  • 有効期限タイマーが経過する前に注文がトリガーされなかった場合、テンプレートは残りの保留中の注文をすべてキャンセルし、注文を再準備します。 取り除く。

お金の管理

  • UseMoneyManagement が無効になっている場合、すべての注文で固定の StaticVolume パラメータが使用されます。
  • 有効にすると、ロットサイズは元のテンプレート式 freeMargin * RiskPercent / 100000 から導出され、n に四捨五入されます。 より前の VolumeStepVolumeMinVolumeMax の間にクランプされています。ポートフォリオの現在価値はMT4の代用として使用されます。 自由マージン。
  • 計算されたボリュームは、取引所契約の設定によって正規化されます。取引可能な最小サイズを下回る場合は、次のように設定されます。 ゼロ、注文の送信を妨げます。

注文とリスクの管理

  • 買い逆指値注文は ask + PriceDistancePips + GridStepPips * level で出されます。売りストップ注文は入札siのロジックを反映します。 で。
  • 保護ストップ (SellStop/BuyStop) とターゲット (SellLimit/BuyLimit) は保留中のエントリが埋まった後にのみ登録されます 。これは、ストップロスとテイクプロフィットが同じチケットに属するMT4の動作を模倣しています。
  • PendingExpirationHours は、保留中のエントリー注文が有効な期間を定義します。値が 0 の場合は、いっぱいになるか満杯になるまで保持されます。 毎年キャンセル。
  • ネットポジションがゼロに戻ると、戦略は白紙の状態を保証するためにまだアクティブな保護注文もキャンセルします。

パラメーター

パラメータ 説明
OrderComment グリッドによって生成されたすべての注文に割り当てられたテキスト。元の EA コメントと一致します。
StaticVolume 資金管理がオフの場合に使用される固定ロットサイズ。
UseMoneyManagement バランスベースのサイジング ルーチンを有効にします。
RiskPercent 資金管理方式で使用される割合。 UseMoneyManagement が false の場合は無視されます。
TakeProfitPips すべてのグリッド エントリに適用されるテイク プロフィット ディスタンス。
StopLossPips すべてのグリッド エントリに適用されるストップロス距離。
PriceDistancePips 市場価格と最初のグリッド注文の間の初期ギャップ (ピップ単位)。
GridStepPips 連続するグリッド レベル間に追加される追加距離 (ピップ単位)。
GridOrders 価格の両側で作成された未決注文の数。
PendingExpirationHours キャンセルされるまでの保留中のグリッドの存続期間。

注意事項

  • このテンプレートはインジケーターベースのフィルターを課しません。トレーダーはクラスを拡張し、TryPlaceGrid をオーバーライドして custo を追加できます mの状態。
  • 保護ストップとターゲットは別個の注文として実装されるため、ブローカー側の約定は MT4 tik とは若干異なる場合があります。 t スタイルのストップロス/テイクプロフィット管理、特に部分約定の場合。
  • 取引所から推定されたピップサイズ (PriceStep および Decimals) が取引される商品と一致していることを常に確認してください。 ライブアカウントで戦略を実行する前に。
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Grid Template strategy: places trades at regular grid intervals.
/// Buys when price drops by grid step, sells when price rises by grid step.
/// </summary>
public class GridTemplateStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<decimal> _gridStepPercent;

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

	public decimal GridStepPercent
	{
		get => _gridStepPercent.Value;
		set => _gridStepPercent.Value = value;
	}

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

		_gridStepPercent = Param(nameof(GridStepPercent), 3.0m)
			.SetGreaterThanZero()
			.SetDisplay("Grid Step %", "Price change percentage for grid level", "Grid");
	}

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

		var sma = new SimpleMovingAverage { Length = 10 };

		decimal? lastTradePrice = null;

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

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;

				if (!lastTradePrice.HasValue)
				{
					lastTradePrice = close;
					return;
				}

				var step = lastTradePrice.Value * GridStepPercent / 100m;

				if (close <= lastTradePrice.Value - step)
				{
					BuyMarket();
					lastTradePrice = close;
				}
				else if (close >= lastTradePrice.Value + step)
				{
					SellMarket();
					lastTradePrice = close;
				}
			})
			.Start();

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