GitHub で見る
Trading Boxing 注文管理戦略
概要
Trading Boxing 注文管理戦略は、オリジナルの TradingBoxing EA の手動注文管理パネルを再現します。チャート上のボタンの代わりに、StockSharp バージョンは戦略の UI または自動化からトグルできるパラメーターを提供します。各トグルはリクエストされたアクションをすぐに実行してからリセットし、成行エントリー、保留注文の配置、既存ポジションのクリーンアップのための便利なコントロールサーフェスを提供します。
この戦略はインジケーターロジックや市場データイベントに依存しません。戦略インスタンスに割り当てられたセキュリティとポートフォリオの注文送信とキャンセルを調整するだけです。
パラメーター
ボリューム設定
BuyVolume – Open Buy Market アクションがトリガーされたときに使用する数量。正でなければなりません。
SellVolume – Open Sell Market アクションがトリガーされたときに使用する数量。正でなければなりません。
BuyStopVolume – 新しいバイストップ注文の数量。
BuyLimitVolume – 新しいバイリミット注文の数量。
SellStopVolume – 新しいセルストップ注文の数量。
SellLimitVolume – 新しいセルリミット注文の数量。
価格設定
BuyStopPrice – バイストップ注文の起動価格。
BuyLimitPrice – バイリミット注文の価格。
SellStopPrice – セルストップ注文の起動価格。
SellLimitPrice – セルリミット注文の価格。
アクショントグル
すべてのアクションパラメーターはブールスイッチです。スイッチを true に設定すると対応するタスクが実行され、戦略は同じ処理サイクルで false に戻します。
CloseBuyPositions – 現在のロングエクスポージャーを閉じます(Position > 0 の場合)。
CloseSellPositions – 現在のショートエクスポージャーを閉じます(Position < 0 の場合)。
DeleteBuyStops – 追跡されたバイストップ注文をキャンセルします。
DeleteBuyLimits – 追跡されたバイリミット注文をキャンセルします。
DeleteSellStops – 追跡されたセルストップ注文をキャンセルします。
DeleteSellLimits – 追跡されたセルリミット注文をキャンセルします。
OpenBuyMarket – BuyVolume を使用して成行買い注文を送信します。
OpenSellMarket – SellVolume を使用して成行売り注文を送信します。
PlaceBuyStop – BuyStopPrice に BuyStopVolume で新しいバイストップ注文を登録し、後のキャンセルのために保存します。
PlaceBuyLimit – BuyLimitPrice に BuyLimitVolume で新しいバイリミット注文を登録し、後のキャンセルのために保存します。
PlaceSellStop – SellStopPrice に SellStopVolume で新しいセルストップ注文を登録し、後のキャンセルのために保存します。
PlaceSellLimit – SellLimitPrice に SellLimitVolume で新しいセルリミット注文を登録し、後のキャンセルのために保存します。
動作の詳細
- 保留注文アクションを通じて作成された注文は内部で追跡され、削除アクションが後でキャンセルできるようにします。この戦略によって配置されなかった外部注文は影響を受けません。
- 戦略は、リクエストを実行する前に実行中であり、
Security と Portfolio の両方が割り当てられているかを確認します。要件が欠けている場合は警告をログに記録し、トグルを無視します。
- ボリュームと価格の検証はオリジナルパネルの保護機能を再現します:正でない量は警告をトリガーし、注文は送信されません。
- 決済アクションは戦略が維持するネットポジションで動作します。ショートをカバーする必要がある場合、戦略は
Math.Abs(Position) に等しい成行買い注文を送信します;ロングポジションの場合は現在の Position 値の成行売り注文を送信します。
使用上の注意
- 有効なポートフォリオとセキュリティで戦略を開始する。
- 取引する商品に合わせてボリュームと価格のパラメーターを調整する。
- 必要なブールパラメーターを
true に設定して手動アクションをトリガーする。プロパティはアクション完了後に自動的に false に戻るため、次のトリガーはすぐに準備完了です。
- 取引計画が変わったときは削除トグルを使って以前に配置した保留注文をクリアする。
戦略はユーザー入力によって純粋にイベント駆動されるため、ローソク足やクォートへのサブスクリプションは不要です。StockSharp 環境内でオリジナルの TradingBoxing インターフェースの柔軟性を反映した、シンプルな実行アシスタントとして機能します。
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Trading Boxing strategy (simplified). Uses CCI momentum for entries.
/// </summary>
public class TradingBoxingStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _cciLength;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int CciLength
{
get => _cciLength.Value;
set => _cciLength.Value = value;
}
public TradingBoxingStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_cciLength = Param(nameof(CciLength), 20)
.SetGreaterThanZero()
.SetDisplay("CCI Length", "CCI period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var cci = new CommodityChannelIndex { Length = CciLength };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(cci, (ICandleMessage candle, decimal cciValue) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (cciValue < -100 && Position <= 0)
{
BuyMarket();
}
else if (cciValue > 100 && Position >= 0)
{
SellMarket();
}
})
.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 CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
from datatype_extensions import *
from indicator_extensions import *
class trading_boxing_strategy(Strategy):
"""CCI momentum: buy below -100, sell above 100."""
def __init__(self):
super(trading_boxing_strategy, self).__init__()
self._cci_length = self.Param("CciLength", 20).SetGreaterThanZero().SetDisplay("CCI Length", "CCI period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5))).SetDisplay("Candle Type", "Candles", "General")
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, value): self._candle_type.Value = value
def OnStarted2(self, time):
super(trading_boxing_strategy, self).OnStarted2(time)
cci = CommodityChannelIndex()
cci.Length = self._cci_length.Value
sub = self.SubscribeCandles(self.CandleType)
sub.Bind(cci, self.OnProcess).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, sub)
self.DrawOwnTrades(area)
def OnProcess(self, candle, cci_val):
if candle.State != CandleStates.Finished:
return
if cci_val < -100 and self.Position <= 0:
self.BuyMarket()
elif cci_val > 100 and self.Position >= 0:
self.SellMarket()
def CreateClone(self):
return trading_boxing_strategy()