Открыть на GitHub

Стратегия Virtual Robot

Общее описание

Virtual Robot переносит сеточный алгоритм исходного эксперта MetaTrader. Стратегия ведёт две независимые виртуальные сетки (для покупок и продаж) на выбранном таймфрейме свечей. Реальные рыночные заявки отправляются только после того, как количество виртуальных уровней достигнет заданного порога. Таким образом сохраняется логика MT4, где виртуальные уровни управляют реальными позициями.

Логика торговли

  1. Формирование виртуальной сетки. После закрытия каждой свечи:
    • если свеча закрылась выше открытия, добавляется новый виртуальный уровень покупок при условии, что расстояние до предыдущего уровня превышает PipStepPips;
    • если свеча закрылась ниже открытия, аналогичное правило применяется для виртуальной сетки продаж;
    • первые VirtualStepper виртуальных ордеров открываются базовым объёмом, последующие умножаются на Multiplier.
  2. Переход к реальным ордерам. Как только на стороне накапливается не менее StartingRealOrders виртуальных уровней (или существующая корзина ушла в минус минимум на один шаг), открывается реальный рыночный ордер. Объём рассчитывается по схеме мартингейла Multiplier * (просадка / PipStepPips).
  3. Ведение корзины. Стратегия хранит:
    • цену и объём последнего выполненного ордера по каждой стороне;
    • взвешенную среднюю цену корзины (виртуальную либо реальную — зависит от RealAverageThreshold).
  4. Выход по прибыли. Корзина закрывается, когда выполняется одно из условий:
    • цена прошла MinTakeProfitPips от первого виртуального уровня;
    • цена вернулась к взвешенной виртуальной средней ± AverageTakeProfitPips для многоуровневой сетки;
    • достигнут индивидуальный или усреднённый тейк-профит, рассчитанный из TakeProfitPips / AverageTakeProfitPips.
  5. Выход по стопу. Мягкий стоп вычисляется от цены последнего реального ордера и StopLossPips. При пересечении уровня корзина закрывается.
  6. Контроль объёмов. Все объёмы нормализуются по метаданным инструмента (VolumeStep, MinVolume, MaxVolume) и ограничиваются параметром MaxVolume.

Параметры

Параметр Описание
CandleType Таймфрейм свечей, на основании которых строится виртуальная сетка (по умолчанию 60 минут).
StopLossPips Дистанция стоп-лосса в пунктах от последнего ордера.
TakeProfitPips Тейк-профит для одиночной позиции.
MinTakeProfitPips Минимальная прибыль для закрытия первой виртуальной ступени.
AverageTakeProfitPips Цель прибыли для усреднённой корзины.
BaseVolume Базовый лот для первых ордеров сетки.
MaxVolume Максимально допустимый лот.
Multiplier Множитель объёма при усреднении.
RealStepper Количество реальных ордеров до включения множителя.
VirtualStepper Число виртуальных ордеров базовым объёмом до масштабирования.
PipStepPips Минимальная просадка (в пунктах) между соседними уровнями сетки.
MaxTrades Лимит реальных ордеров на сторону.
StartingRealOrders Число виртуальных уровней, необходимое для открытия первого реального ордера.
RealAverageThreshold После скольких реальных ордеров используется фактическая средняя цена.
VisualMode Параметр сохранён для совместимости (в StockSharp не используется).

Особенности реализации

  • В StockSharp используется неттинг, поэтому одновременные независимые длинные и короткие корзины, как в хеджинговом MT4, невозможны. Если обе виртуальные сетки активируются, последняя инициатива развернёт суммарную позицию.
  • Графические объекты из оригинала не строятся — виртуальные уровни хранятся только в памяти стратегии.
  • Стоимость пункта вычисляется из Security.PriceStep с корректировкой ×10 для трёх- и пятизнаковых валютных инструментов, что повторяет логику MT4.
  • Защитные стопы и тейки реализованы программно: стратегия отслеживает цену в обработчике свечей и закрывает позицию рыночными приказами.

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

  1. Проверьте заполненность метаданных инструмента (PriceStep, VolumeStep, MinVolume, MaxVolume), иначе расчёт пунктов и объёмов может отличаться от брокерских правил.
  2. Тестируйте стратегию на исторических данных или на малых объёмах, чтобы убедиться в корректности расстояний сетки и коэффициента усреднения.
  3. Подбирайте StartingRealOrders и RealStepper в зависимости от допустимой просадки и агрессивности сетки.
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Virtual Robot strategy: RSI mean reversion.
/// Buys when RSI < 40, sells when RSI > 60.
/// </summary>
public class VirtualRobotStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;

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

	public int RsiPeriod
	{
		get => _rsiPeriod.Value;
		set => _rsiPeriod.Value = value;
	}

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

		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("RSI Period", "RSI period", "Indicators");
	}

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

		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(rsi, ProcessCandle)
			.Start();

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

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

		if (!IsFormedAndOnlineAndAllowTrading())
			return;

		if (rsi < 25m && Position <= 0)
		{
			BuyMarket();
		}
		else if (rsi > 75m && Position >= 0)
		{
			SellMarket();
		}
	}
}