
Логика ТС следующая: переворачивается вовнутрь, когда цена с запасом пересекает EMA-шку от цены.
// Пример математически правильной ТС с возможностью ее проверки в MT5-Тестере.
// https://www.mql5.com/ru/forum/333746
input group "EA"
input int inPeriod = 100; // Период EMA-шки
input double inFilter = 0.0005; // Фильтр сделок
// Торговая система
void EA()
{
static const double Filter = MathLog(1 + inFilter); // С таким запасом нужно будет пересечь EMA для переворота.
static EMA Ema(inPeriod); // Инициализировали EMA с соответствующим периодом.
MqlTick Tick;
if (!SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
return;
const MqlTick LogTick = LogTick(Tick); // Логарифмировали его.
const double Price = Ema.Get((LogTick.bid + LogTick.ask) / 2); // Применили EMA к средней цене.
const int Type = OrderSelect(0, SELECT_BY_POS) ? OrderType() : -1; // Направление текущей открытой позиции.
if (LogTick.bid > Price + Filter) // Если bid выше EMA-шки с запасом, переворачиваемся в SELL.
{
if (Type != OP_SELL) // Если SELL не открыта.
{
if (Type == OP_BUY) // Если BUY открыта,
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); // закроем ее.
OrderSend(_Symbol, OP_SELL, 1, Tick.bid, 0, 0, 0); // Откроем SELL-позицию.
}
}
else if ((LogTick.ask < Price - Filter) && (Type != OP_BUY)) // Если ask ниже EMA-шки с запасом, переворачиваемся в BUY.
{
if (Type == OP_SELL) // Если SELL открыта,
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); // закроем ее.
OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0); // Откроем BUY-позицию.
}
}
Вся система — это лаконичная EA-функция. Остальной функционал — проверка правильности ТС. Специально привел полный листинг, чтобы было понятно, о чем речь. Код простой.
Запускается советник в MT5-Тестере, но совершает он сделки в виртуальном торговом окружении, т.к. MT5-Тестер не умеет работать с произвольными ценами.
Отчет торговли автоматически появляется в браузере в виде HTML (нужно разрешить использование DLL — WinAPI).
Итак, запускаем на EURUSD по реальным тикам с такими настройками.


Собственно, именно это значение и должно быть инвариантом для всех изменений исходного символа. Т.е. как бы я его не менял (согласно ранее озвученным правилам), это значение должно оставаться постоянным.


По коду видно, что в торговле нигде не используются размеры пунктов, лотов, маржинальных требований и т.д. Имеем просто голый ненормализованный ценовой ряд и торгуем на нем, соблюдая инвариантность к некоторым изменениям этого ряда. Удовлетворение логики ТС таким простым правилам позволяет с помощью нее легко делать масштабные исследования различных синтетических символов. Избавляет от математической ущербности в построении торговых сигналов. А значит уменьшает вероятность самообмана
Чтобы проверить любую ТС, замените просто EA-функцию на другую.
В мт5 есть встроенный функционал создания синтетических инструментов. Я не пробовал в тестере, но в архиве этот инструмент точно появляется, значит он должен быть и в меню тестера.