Здравствуйте! В описании написано: "Соответственно, OrderSelect в режиме SELECT_BY_TICKET в MT5 в редких случаях (в тестере) может выбрать не то, что задумывалось в MT4. " Можете подробно написать в каких именно случаях?
Чем лучше написан MT4-советник, тем проще его сконвертировать в MT5. И размер/сложность оригинального советника не имеет никакого значения при конвертации.
Если появляется Алерт, посмотрите, а не запущен ли на счете (по невнимательности) один и тот же советник дважды. Например, один на локальной машине, а другой - VPS.
Как видим, разница между Equity и Balance отличается на размер комиссии. И может показаться, что классическое для MT4 выражение
ProfitWithCommission += OrderProfit() + OrderSwap() + OrderCommission(); // Вычисляем текущий профит с учетом комиссии
теряет смысл в MT5. Но это не так. На самом деле когда Вы закроете позицию, то Balance изменится именно на эту величину, а не станет тем, что показывало перед этим Equity. Грубо говоря, значение Equity в MT5 врет, с точки зрения этого понятия в MT4.
Учитывайте эту особенность MT5. Библиотека в данном случае точнее. И рассчитать тот же безубыток не составит труда.
// Список изменений:// 13.02.2018// Add: Добавлено логирование ошибочного выполнения MT5-OrderSend.// Fix: Теперь "невидимы" только закрывающие MT5-ордера (SL/TP/SO, partial/full close).// Fix: Механизм определения SL/TP закрытых позиций после OrderClose скорректирован - работает, если позволяет StopLevel.
в MT5 все совсем не в порядке. Пример, показывающий проблему
// Пример неправильного считывания торгового окружения на каждом тике// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.#include <Trade/Trade.mqh>
// Возвращает количество позиций по символуint GetAmountPositions( conststring Symb )
{
int Res = 0;
// Этот MQL5-код с ошибкойfor (int i = PositionsTotal() - 1; i >= 0; i--)
if (PositionGetSymbol(i) == Symb)
Res++;
/*
// В MT4 такой код выполняется без ошибки
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
Res++;
*/return(Res);
}
// Пример OnTickvoid ExampleOnTick()
{
static CTrade Trade;
// Если нет позиции, открываемif (!GetAmountPositions(_Symbol))
Trade.Buy(1);
}
// Эмуляция прихода двух Tick-событийvoidOnStart()
{
ExampleOnTick();
Sleep(10); // Между двумя тиками ~10 мс.
ExampleOnTick();
}
Как думаете, если запустить этот скрипт на символе без позиций, что будет в итоге?
Правильный ответ: будет открыта одна или две позиции.
Эта проблема обходится, если писать в MQL4-style хотя бы частично. Чтобы в этом убедиться, достаточно GetAmountPositions сделать в MQL4-style (закомментирован в исходнике), убрав MQL5-style.
Здравствуйте! В описании написано: "Соответственно, OrderSelect в режиме SELECT_BY_TICKET в MT5 в редких случаях (в тестере) может выбрать не то, что задумывалось в MT4. " Можете подробно написать в каких именно случаях?
Когда тикеты позиции/сделки/ордера совпадают.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Советники: eaBreakeven
fxsaber, 2018.01.11 08:13
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Как изменить объем отложенного ордера?
fxsaber, 2018.01.19 16:34
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Советники: Three Point Arbitrage
fxsaber, 2018.01.20 09:58
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2018.02.06 07:41
OnTradeTransaction позволяет написать неторговый советник (Сервис), отслеживающий наличие запущенного на счете торгового "клона"-советника.Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2018.02.08 08:16
В MT5 у позиций нет комиссии (в отличие от MT4). Из-за этого есть свои особенности
MT4Orders все же имеет комиссию для позиций. По этой причине получается такая ситуация
Результат
Как видим, разница между Equity и Balance отличается на размер комиссии. И может показаться, что классическое для MT4 выражение
теряет смысл в MT5. Но это не так. На самом деле когда Вы закроете позицию, то Balance изменится именно на эту величину, а не станет тем, что показывало перед этим Equity. Грубо говоря, значение Equity в MT5 врет, с точки зрения этого понятия в MT4.
Учитывайте эту особенность MT5. Библиотека в данном случае точнее. И рассчитать тот же безубыток не составит труда.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2018.02.08 10:06
На неттинге элементарно потерять комментарий открытой позиции. Для этого достаточно совершить любую сделку без комментария по символу позиции.Библиотека не потеряет комментарий в описанном случае - OrderComment() будет выдавать комментарий, который был при открытии позиции.
Здесь подробно описана некоторая особенность работы MT5. Библиотека отрабатывала эту ситуацию правильно уже давно. Но ругалась (Алерт), что ситуация нестандартная.
Теперь ругаться не будет
В качестве проверки можно запустить этот скрипт на непростом демо-счете FXOpen-MT5
Результат
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Организация цикла перебора ордеров
fxsaber, 2018.02.16 09:40
в MT5 все совсем не в порядке. Пример, показывающий проблему
Как думаете, если запустить этот скрипт на символе без позиций, что будет в итоге?
Правильный ответ: будет открыта одна или две позиции.
Эта проблема обходится, если писать в MQL4-style хотя бы частично. Чтобы в этом убедиться, достаточно GetAmountPositions сделать в MQL4-style (закомментирован в исходнике), убрав MQL5-style.
Будьте особенно бдительны с MQL5-style.