Стратегия переносит советники MetaTrader alligator candle cross up/down на высокоуровневый API StockSharp. Она отслеживает индикатор Bill Williams Alligator, построенный из сглаженных скользящих средних медианной цены, и реагирует, когда тело завершившейся свечи переходит с одной стороны «пасти» Аллигатора на другую. Через параметр можно ограничить сделки только длинным, только коротким или обоими направлениями, а риск управляется фиксированными стопами и целями в пунктах.
Логика торговли
Подготовка индикаторов
Рассчитываются линии Jaw, Teeth и Lips Аллигатора с классическими периодами 13/8/5.
Применяются стандартные смещения вперёд (8/5/3 бара по умолчанию), чтобы сравнивать значения линий со свечой, которая формируется перед ними.
Цены берутся из медианы свечи (High + Low) / 2, что повторяет реализацию в MetaTrader.
Условия для покупок («candle cross up»)
Закрытие предыдущей завершённой свечи находится на уровне или ниже минимальной линии Аллигатора (с учётом смещения).
Текущее тело свечи открывается на уровне или ниже максимального смещённого значения Аллигатора и закрывается выше него, то есть пересекает «пасть» вверх.
Открытых позиций нет, торговля разрешена.
При выполнении условий отправляется рыночная заявка Buy с заданным объёмом.
Условия для продаж («candle cross down»)
Закрытие предыдущей свечи находится на уровне или выше максимальной смещённой линии Аллигатора.
Текущее тело свечи открывается на уровне или выше минимального смещённого значения и закрывается ниже него, подтверждая пересечение вниз.
Позиция отсутствует, торговля разрешена.
Отправляется рыночная заявка Sell на заданный объём.
Управление позицией
После открытия позиции стоп-лосс и тейк-профит переводятся из пунктов в абсолютные цены через шаг цены инструмента.
Длинная позиция закрывается при достижении стоп-лосса, тейк-профита или при закрытии свечи ниже минимума смещённых линий Teeth и Lips.
Короткая позиция закрывается при срабатывании стоп-лосса, тейк-профита или при закрытии выше максимума смещённых линий Teeth и Lips.
В начале работы вызывается StartProtection, чтобы защитить счёт от нештатных исполнений.
Параметры
Имя
Тип
Значение по умолчанию
Описание
OrderVolume
decimal
0.1
Объём сделки в лотах или контрактах.
StopLossPips
int
50
Расстояние до защитного стопа в пунктах. Ноль отключает стоп.
TakeProfitPips
int
50
Расстояние до фиксированного тейк-профита в пунктах. Ноль отключает цель.
JawPeriod
int
13
Период сглаженной средней линии челюсти Аллигатора.
JawShift
int
8
Смещение линии челюсти вперёд перед оценкой сигналов.
TeethPeriod
int
8
Период сглаженной средней линии зубов Аллигатора.
TeethShift
int
5
Смещение линии зубов.
LipsPeriod
int
5
Период сглаженной средней линии губ Аллигатора.
LipsShift
int
3
Смещение линии губ.
CandleType
DataType
TimeSpan.FromHours(1).TimeFrame()
Таймфрейм свечей для расчётов.
EntryMode
AlligatorCrossMode
Both
Выбор направления торговли: только покупки, только продажи или оба варианта.
Примечания по использованию
Стратегия подходит для любого инструмента StockSharp; установите CandleType в соответствии с таймфреймом оригинального шаблона MetaTrader.
Пункты вычисляются из шага цены: для котировок с 3 или 5 знаками (например, EURUSD) один пункт равен десяти шагам цены.
Логика работает только с завершёнными свечами и не использует тиковые данные, что облегчает сопоставление с тестами MetaTrader.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Alligator Candle Cross strategy: DEMA trend crossover.
/// Buys when close crosses above DEMA, sells when close crosses below.
/// </summary>
public class AlligatorCandleCrossStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _period;
private decimal _prevClose;
private decimal _prevDema;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int Period { get => _period.Value; set => _period.Value = value; }
public AlligatorCandleCrossStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_period = Param(nameof(Period), 50)
.SetGreaterThanZero()
.SetDisplay("Period", "DEMA period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevClose = 0;
_prevDema = 0;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevClose = 0;
_prevDema = 0;
_hasPrev = false;
var dema = new ExponentialMovingAverage { Length = Period };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(dema, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal demaValue)
{
if (candle.State != CandleStates.Finished) return;
if (_hasPrev)
{
if (_prevClose <= _prevDema && candle.ClosePrice > demaValue && Position <= 0)
BuyMarket();
else if (_prevClose >= _prevDema && candle.ClosePrice < demaValue && Position >= 0)
SellMarket();
}
_prevClose = candle.ClosePrice;
_prevDema = demaValue;
_hasPrev = true;
}
}
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 ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class alligator_candle_cross_strategy(Strategy):
def __init__(self):
super(alligator_candle_cross_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(60)))
self._period = self.Param("Period", 50)
self._prev_close = 0.0
self._prev_dema = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def Period(self):
return self._period.Value
@Period.setter
def Period(self, value):
self._period.Value = value
def OnReseted(self):
super(alligator_candle_cross_strategy, self).OnReseted()
self._prev_close = 0.0
self._prev_dema = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(alligator_candle_cross_strategy, self).OnStarted2(time)
self._prev_close = 0.0
self._prev_dema = 0.0
self._has_prev = False
dema = ExponentialMovingAverage()
dema.Length = self.Period
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(dema, self._process_candle).Start()
def _process_candle(self, candle, dema_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
dema_val = float(dema_value)
if self._has_prev:
if self._prev_close <= self._prev_dema and close > dema_val and self.Position <= 0:
self.BuyMarket()
elif self._prev_close >= self._prev_dema and close < dema_val and self.Position >= 0:
self.SellMarket()
self._prev_close = close
self._prev_dema = dema_val
self._has_prev = True
def CreateClone(self):
return alligator_candle_cross_strategy()