Ver no GitHub

Estratégia de média VR Smart Grid Lite

Visão geral

A estratégia VR Smart Grid Lite Averaging é um sistema de média de grade que segue o consultor especialista MetaTrader 5 original. O algoritmo abre ordens de mercado na direção da vela de alta ou baixa mais recente e constrói uma escada estilo martingale sempre que o preço se move contra a posição. Distâncias, volumes e lógica de saída podem ser ajustados para corresponder à implementação original do MQL.

Lógica de negociação

  • A cada vela concluída, a estratégia verifica sua direção.
    • Uma vela de alta permite uma nova ordem de compra se o preço atual estiver pelo menos Order Step (pips) abaixo da entrada de compra mais baixa existente.
    • Uma vela de baixa permite uma nova ordem de venda se o preço atual estiver pelo menos Order Step (pips) acima da entrada de venda mais alta existente.
  • A primeira ordem para cada lado usa Start Volume. Cada pedido adicional duplica o volume do pedido mais distante daquele lado, enquanto Max Volume limita o tamanho absoluto.
  • Quando existe apenas uma posição em um lado, a negociação é fechada quando o preço atinge a distância Take Profit (pips).
  • Com duas ou mais posições a lógica de fechamento depende do Close Mode selecionado:
    • Média – fecha os pedidos mais altos e mais baixos quando o preço atinge a média ponderada mais Minimal Profit (pips).
    • PartialClose – fecha totalmente o pedido mais baixo e reduz o pedido mais alto em Start Volume quando o preço atinge a meta combinada.

Gestão de risco

  • Os volumes são ajustados ao MinVolume, MaxVolume e StepVolume da corretora para evitar rejeição.
  • A chamada StartProtection() integrada garante que a proteção da conta StockSharp seja ativada antes da negociação.

Parâmetros

Nome Descrição
Take Profit (pips) Distância alvo para posições abertas únicas.
Start Volume Volume para o pedido inicial em cada direção.
Max Volume Volume máximo permitido por pedido (0 desativa o limite).
Close Mode Escolha entre saídas médias ou fechamentos parciais.
Order Step (pips) Movimento adverso mínimo antes de adicionar uma nova ordem.
Minimal Profit (pips) Buffer de lucro extra adicionado à saída média.
Candle Type Série de velas usada para geração de sinal.

Notas

  • A estratégia utiliza apenas ordens de mercado; ordens pendentes do EA original são emuladas avaliando as condições de cada vela.
  • A implementação mantém o estado por pedido para imitar o gerenciamento baseado em tickets do MetaTrader, incluindo fechamentos parciais e saídas seletivas.
  • Configure o tipo de vela e o tamanho do pip do símbolo para corresponder ao período de tempo usado no script MQL para um comportamento consistente.
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// VR Smart Grid Lite Averaging: grid with averaging approach using Bollinger Bands.
/// Buys near lower band, sells near upper band.
/// </summary>
public class VrSmartGridLiteAveragingStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _bbPeriod;

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

	public int BbPeriod
	{
		get => _bbPeriod.Value;
		set => _bbPeriod.Value = value;
	}

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

		_bbPeriod = Param(nameof(BbPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("BB Period", "Bollinger Bands period", "Indicators");
	}

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

		var bb = new BollingerBands { Length = BbPeriod };

		decimal? prevClose = null;
		decimal? prevMid = null;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.BindEx(bb, (candle, bbVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var bbv = (BollingerBandsValue)bbVal;
				if (bbv.UpBand is not decimal upper || bbv.LowBand is not decimal lower)
					return;

				var close = candle.ClosePrice;
				var mid = (upper + lower) / 2m;

				if (prevClose.HasValue && prevMid.HasValue)
				{
					var crossBelow = prevClose.Value >= prevMid.Value && close < mid;
					var crossAbove = prevClose.Value <= prevMid.Value && close > mid;

					if (crossBelow && Position <= 0)
						BuyMarket();
					else if (crossAbove && Position >= 0)
						SellMarket();
				}

				prevClose = close;
				prevMid = mid;
			})
			.Start();

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