Воспроизведение еще одного бага. Выставляем лимитный ордер по текущей цене и смотрим постепенную его заливку. Проверяем на каждом шаге общий лот всех позиций и ордеров. Он должен быть неизменным - равным тому, что был отправлен в OrderSend.
// Демонстрация потери данных во время торговли.template <typename T>
T MyPrint( const T Value, conststring Str )
{
Print(Str + " = " + (string)Value);
return(Value);
}
#define _P(A) MyPrint(A, ": " + #A)
sinputdouble inLots = 100;
intOnInit()
{
MqlTradeResult Result = {0};
MqlTradeRequest Request = {0};
Request.action = TRADE_ACTION_PENDING;
Request.symbol = _Symbol;
Request.volume = inLots;
Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
Request.type = ORDER_TYPE_BUY_LIMIT;
return(OrdersTotal() || PositionsTotal() || !OrderSend(Request, Result)); // Работаем, когда ничего не открыто.
}
// Возвращает сумму лотов всех позиций и ордеров.double GetSumLots()
{
double Lots = 0;
for (int i = _P(OrdersTotal()) - 1; i >= 0; i--)
if (_P(OrderGetTicket(_P(i))))
Lots += _P(OrderGetDouble(ORDER_VOLUME_CURRENT));
for (int i = _P(PositionsTotal()) - 1; i >= 0; i--)
if (_P(PositionGetTicket(_P(i))))
Lots += _P(PositionGetDouble(POSITION_VOLUME));
return(Lots);
}
voidOnTradeTransaction(constMqlTradeTransaction& trans,
constMqlTradeRequest& request,
constMqlTradeResult& result)
{
Print("---------");
// Проверяем, что сумма лотов всех позиций и ордеров совпадает с заданной.if (NormalizeDouble(_P(GetSumLots()) - inLots, _Digits))
Alert("BUG!");
}
У меня даже сложного решения нет. Как в каком-нибудь запущенном скрипте убедиться, что имеет место быть рассинхрон - не ясно совсем.
если суммарный лот изменился, гоняете подсчет пока лоты для ордеров и позиций не будут одинаковыми два раза. когда будут - это синхронизированное состояние.
вероятность рассинхрона доли или единицы процентов, так что на производительности почти не скажется.
__________
посмотрел ваши принты, может и баг, если дело в рассинхроне, ошибочная сумма не должна повторяться одинаково в нескольких подсчетах
если суммарный лот изменился, гоняете подсчет пока лоты для ордеров и позиций не будут одинаковыми два раза. когда будут - это синхронизированное состояние.
вероятность рассинхрона доли или единицы процентов, так что на производительности почти не скажется.
В логе выше три подряд расчета показывают неправильный результат. Нужен Sleep, но это чревато задержками, когда можно не успеть среагировать на выставление торгового приказа.
Зря вы обижаетесь. Самая большая вероятность, это ошибка в коде. На втором месте заоблачный спред. Но кто кроме вас может отбросить первый вариант и начнёт рассматривать второй не видя кода. Да и не ту тему вы выбрали, надеюсь модераторы перенесут.
Спасибо за адекватный ответ. Я не обижаюсь, я огорчаюсь))). Я написал для того чтобы попробовать найти быстрое решение, которое возможно у кого-то, кто с этим сталкивался уже есть. Код абсолютно стандартный, суммирование циклом тоталпрофита и сравнение с заданной величиной, тем более код работает уже пару месяцев на двух разных счетах без сбоев. Хорошего дня.
Спасибо за адекватный ответ. Я не обижаюсь, я огорчаюсь))). Я написал для того чтобы попробовать найти быстрое решение, которое возможно у кого-то, кто с этим сталкивался уже есть. Код абсолютно стандартный, суммирование циклом тоталпрофита и сравнение с заданной величиной, тем более код работает уже пару месяцев на двух разных счетах без сбоев. Хорошего дня.
Результат.
Выставили 100 лотов, но в какой-то момент лотов стало 72.8. Очевидно, что в такой ситуации торговый алгоритм может быть дезориентирован.
Строка для поиска: Oshibka 011.fxsaber:
Он должен быть неизменным - равным тому, что был отправлен в OrderSend.
вообще-то нет, есть вероятность попасть на рассинхрон, что и происходит, обойти можно, совсем простого решения нет
вообще-то нет, есть вероятность попасть на рассинхрон, что и происходит, обойти можно, совсем простого решения нет
У меня даже сложного решения нет. Как в каком-нибудь запущенном скрипте убедиться, что имеет место быть рассинхрон - не ясно совсем.
У меня даже сложного решения нет. Как в каком-нибудь запущенном скрипте убедиться, что имеет место быть рассинхрон - не ясно совсем.
если суммарный лот изменился, гоняете подсчет пока лоты для ордеров и позиций не будут одинаковыми два раза. когда будут - это синхронизированное состояние.
вероятность рассинхрона доли или единицы процентов, так что на производительности почти не скажется.
__________
посмотрел ваши принты, может и баг, если дело в рассинхроне, ошибочная сумма не должна повторяться одинаково в нескольких подсчетах
если суммарный лот изменился, гоняете подсчет пока лоты для ордеров и позиций не будут одинаковыми два раза. когда будут - это синхронизированное состояние.
вероятность рассинхрона доли или единицы процентов, так что на производительности почти не скажется.
В логе выше три подряд расчета показывают неправильный результат. Нужен Sleep, но это чревато задержками, когда можно не успеть среагировать на выставление торгового приказа.
Неприятная ситуация.
В логе выше три подряд расчета показывают неправильный результат.
да, увидел, добавил сверху
Зря вы обижаетесь. Самая большая вероятность, это ошибка в коде. На втором месте заоблачный спред. Но кто кроме вас может отбросить первый вариант и начнёт рассматривать второй не видя кода. Да и не ту тему вы выбрали, надеюсь модераторы перенесут.
Спасибо за адекватный ответ. Я не обижаюсь, я огорчаюсь))). Я написал для того чтобы попробовать найти быстрое решение, которое возможно у кого-то, кто с этим сталкивался уже есть. Код абсолютно стандартный, суммирование циклом тоталпрофита и сравнение с заданной величиной, тем более код работает уже пару месяцев на двух разных счетах без сбоев. Хорошего дня.
Спасибо за адекватный ответ. Я не обижаюсь, я огорчаюсь))). Я написал для того чтобы попробовать найти быстрое решение, которое возможно у кого-то, кто с этим сталкивался уже есть. Код абсолютно стандартный, суммирование циклом тоталпрофита и сравнение с заданной величиной, тем более код работает уже пару месяцев на двух разных счетах без сбоев. Хорошего дня.
Это не по теме особенностей.
Согласен.