Открыть на GitHub

Стратегия Trading Boxing

Обзор

Стратегия Trading Boxing воспроизводит ручную панель управления ордерами из исходного советника TradingBoxing. Вместо кнопок на графике версия для StockSharp предоставляет набор параметров-переключателей. Как только переключатель установлен в значение true, действие выполняется и параметр автоматически возвращается в false, что позволяет удобно управлять рыночными входами, отложенными заявками и закрытием текущих позиций.

Стратегия не использует индикаторы и не требует потока рыночных данных. Она просто отправляет и отменяет заявки для того инструмента и портфеля, которые привязаны к экземпляру стратегии.

Параметры

Настройка объёмов

  • BuyVolume – объём, используемый при выполнении действия Open Buy Market. Должен быть больше нуля.
  • SellVolume – объём, используемый при выполнении действия Open Sell Market. Должен быть больше нуля.
  • BuyStopVolume – объём для новых заявок buy stop.
  • BuyLimitVolume – объём для новых заявок buy limit.
  • SellStopVolume – объём для новых заявок sell stop.
  • SellLimitVolume – объём для новых заявок sell limit.

Настройка цен

  • BuyStopPrice – цена срабатывания заявок buy stop.
  • BuyLimitPrice – цена исполнения заявок buy limit.
  • SellStopPrice – цена срабатывания заявок sell stop.
  • SellLimitPrice – цена исполнения заявок sell limit.

Переключатели действий

Все перечисленные ниже параметры являются булевыми. Установка значения true запускает соответствующую операцию, после чего параметр автоматически возвращается в false.

  • CloseBuyPositions – закрывает текущую длинную позицию (если Position > 0).
  • CloseSellPositions – закрывает текущую короткую позицию (если Position < 0).
  • DeleteBuyStops – отменяет отслеживаемые заявки buy stop.
  • DeleteBuyLimits – отменяет отслеживаемые заявки buy limit.
  • DeleteSellStops – отменяет отслеживаемые заявки sell stop.
  • DeleteSellLimits – отменяет отслеживаемые заявки sell limit.
  • OpenBuyMarket – отправляет рыночную заявку на покупку с объёмом BuyVolume.
  • OpenSellMarket – отправляет рыночную заявку на продажу с объёмом SellVolume.
  • PlaceBuyStop – выставляет новую заявку buy stop с параметрами BuyStopPrice и BuyStopVolume, сохраняя ссылку на неё для последующей отмены.
  • PlaceBuyLimit – выставляет новую заявку buy limit с параметрами BuyLimitPrice и BuyLimitVolume, сохраняя ссылку для отмены.
  • PlaceSellStop – выставляет новую заявку sell stop с параметрами SellStopPrice и SellStopVolume, сохраняя ссылку для отмены.
  • PlaceSellLimit – выставляет новую заявку sell limit с параметрами SellLimitPrice и SellLimitVolume, сохраняя ссылку для отмены.

Особенности работы

  • Заявки, созданные действиями выставления отложенных ордеров, сохраняются внутри стратегии. Благодаря этому соответствующие действия удаления могут отменить именно эти заявки. Внешние ордера, размещённые другими инструментами, не затрагиваются.
  • Перед выполнением любого запроса стратегия проверяет, что она запущена и что указаны Security и Portfolio. Если чего-то не хватает, в журнал выводится предупреждение, а запрос игнорируется.
  • Проверка положительных объёмов и цен повторяет защиту оригинальной панели: при некорректных значениях выводится предупреждение и ордер не отправляется.
  • Действия по закрытию работают с чистой позицией стратегии. При наличии короткой позиции отправляется рыночная покупка на Math.Abs(Position), при длинной – рыночная продажа на величину Position.

Рекомендации по использованию

  1. Запустите стратегию, указав корректный портфель и инструмент.
  2. Настройте объёмы и цены в соответствии с требованиями инструмента.
  3. Для выполнения операции установите соответствующий булевый параметр в true. После выполнения параметр автоматически сбрасывается в false, и операция готова к повторному запуску.
  4. При изменении торгового плана используйте переключатели удаления, чтобы отменить ранее размещённые отложенные заявки.

Стратегия полностью управляется действиями трейдера, поэтому ей не нужны подписки на свечи или стакан. Она служит удобным помощником по исполнению, передавая функциональность TradingBoxing в среду StockSharp.

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);
		}
	}
}