Тестер: позиции - диверсанты :)

 
Всем привет! :)

Тестирую ТС. Наблюдаю появление двух одинаковых позиций. По логике алгоритма должна быть одна.

Диверсант

Делаю проверки.
      query=OrderSend(mrequest,mresult);
      
      if(query==true)
        {
         Print("--- ! Buy " + Buy);
        }

2018.10.30 11:04:26.568 2018.02.16 12:05:59   instant buy 0.10 EURUSD at 1.24783 (1.24773 / 1.24783 / 1.24773)
2018.10.30 11:04:26.568 2018.02.16 12:05:59   deal #87 buy 0.10 EURUSD at 1.24783 done (based on order #85)
2018.10.30 11:04:26.568 2018.02.16 12:05:59   deal performed [#87 buy 0.10 EURUSD at 1.24783]
2018.10.30 11:04:26.568 2018.02.16 12:05:59   order performed buy 0.10 at 1.24783 [#85 buy 0.10 EURUSD at 1.24783]

2018.10.30 11:04:26.568 2018.02.16 12:05:59   --- ! Buy 0

2018.10.30 11:04:26.568 2018.02.16 12:05:59   instant buy 0.10 EURUSD at 1.24783 (1.24773 / 1.24783 / 1.24773)
2018.10.30 11:04:26.568 2018.02.16 12:05:59   deal #88 buy 0.10 EURUSD at 1.24783 done (based on order #86)
2018.10.30 11:04:26.568 2018.02.16 12:05:59   deal performed [#88 buy 0.10 EURUSD at 1.24783]
2018.10.30 11:04:26.568 2018.02.16 12:05:59   order performed buy 0.10 at 1.24783 [#86 buy 0.10 EURUSD at 1.24783]
Как видно, вторая позиция появляется без выполнения условия if(query==true). Поэтому мне не понятно, в силу каких причин и обстоятельств она появилась в тестере :).

Строка

2018.10.30 11:04:26.568 2018.02.16 12:05:59   --- ! Buy 0

где Buy = 0, свидетельствует, что до момента выполнения запроса позиций Buy в рынке не было.

Может быть тут необходимо ПАУЗУ для запросов делать? Или кто - нибудь может подсказать в чём может быть ошибка в алгоритме?

 
Vjacheslav Lapaev:
Всем привет! :)

Тестирую ТС. Наблюдаю появление двух одинаковых позиций. По логике алгоритма должна быть одна.



Делаю проверки.
Как видно, вторая позиция появляется без выполнения условия if(query==true). Поэтому мне не понятно, в силу каких причин и обстоятельств она появилась в тестере :).

Строка


где Buy = 0, свидетельствует, что до момента выполнения запроса позиций Buy в рынке не было.

Может быть тут необходимо ПАУЗУ для запросов делать? Или кто - нибудь может подсказать в чём может быть ошибка в алгоритме?

Может проблема имеет схожие корни?

Типичные ошибки и способы их устранения при работе с торговым окружением
Типичные ошибки и способы их устранения при работе с торговым окружением
  • 2018.02.19
  • www.mql5.com
В данной теме будем обсуждать часто встречающиеся ошибки при работе с торговым окружением терминала в тех или иных алгоритмах, методы их устранения...
 
Vjacheslav Lapaev:
Всем привет! :)

Тестирую ТС. Наблюдаю появление двух одинаковых позиций. По логике алгоритма должна быть одна.



Делаю проверки.
Как видно, вторая позиция появляется без выполнения условия if(query==true). Поэтому мне не понятно, в силу каких причин и обстоятельств она появилась в тестере :).

Строка


где Buy = 0, свидетельствует, что до момента выполнения запроса позиций Buy в рынке не было.

Может быть тут необходимо ПАУЗУ для запросов делать? Или кто - нибудь может подсказать в чём может быть ошибка в алгоритме?

Нужен код в котором происходит подсчёт позиций. Без кода ничего не сказать.

 
Vjacheslav Lapaev:
Всем привет! :)

Тестирую ТС. Наблюдаю появление двух одинаковых позиций. По логике алгоритма должна быть одна.



Делаю проверки.
Как видно, вторая позиция появляется без выполнения условия if(query==true). Поэтому мне не понятно, в силу каких причин и обстоятельств она появилась в тестере :).

Строка


где Buy = 0, свидетельствует, что до момента выполнения запроса позиций Buy в рынке не было.

Может быть тут необходимо ПАУЗУ для запросов делать? Или кто - нибудь может подсказать в чём может быть ошибка в алгоритме?

Из логов же видно, что все события произошли практически в одно и тоже время. На сервер был отправлен ордер, но позиция еще не открылась (ордер не был исполнен на сервере) по этому, если в переменной Buy хранится кол-во открытых позиций ее значение равно нулю. И вполне естественно, что на следующем тике, который произошел практически через несколько милисекунд был отправлен еще один ордер.

 
Artyom Trishkin:

Может проблема имеет схожие корни?

Лог из Тестера.

 
Artyom Trishkin:

Может проблема имеет схожие корни?

Вполне может быть. По "аналогии", можно сказать , вставил  ZeroMemory(mrequest); ZeroMemory(mresult); - вроде бы помогло. Проверю и предложенное решение.

 
Vladimir Karputov:

Нужен код в котором происходит подсчёт позиций. Без кода ничего не сказать.

Дело в том, что до пересчёта позиций дело так и не доходило. Позиция в терминале тестера появлялась сразу после отправки запроса.

 
Vitalii Ananev:

Из логов же видно, что все события произошли практически в одно и тоже время. На сервер был отправлен ордер, но позиция еще не открылась (ордер не был исполнен на сервере) по этому, если в переменной Buy хранится кол-во открытых позиций ее значение равно нулю. И вполне естественно, что на следующем тике, который произошел практически через несколько милисекунд был отправлен еще один ордер.

Подумаю. Но не совсем понятно. В терминале тестера позиция присутствует ведь реально. Следовательно, влияет на результат в реальном времени. Поэтому не понятно, почему на сервере ордер не был отработан, если в терминале тестера он явно существует. 

 
Vjacheslav Lapaev:

Дело в том, что до пересчёта позиций дело так и не доходило. Позиция в терминале тестера появлялась сразу после отправки запроса.

Это Вы так думаете. Отсылка торгового приказа != появилась позиция. Более того между отсылкой торгового приказа и появлением позиции проходит некоторое время - и в это время придут несколько тиков и в эти несколько тиков Вы всё ещё будете думать, что позиции нет и слать дальше торговые приказы.

В общем как всегда - нет кода и ветка превращается в филиал гадалки на кофейной гуще :)

 
Vladimir Karputov:

Это Вы так думаете. Отсылка торгового приказа != появилась позиция. Более того между отсылкой торгового приказа и появлением позиции проходит некоторое время - и в это время придут несколько тиков и в эти несколько тиков Вы всё ещё будете думать, что позиции нет и слать дальше торговые приказы.

В общем как всегда - нет кода и ветка превращается в филиал гадалки на кофейной гуще :)

Ответ, для меня, в отношении допущенной ошибки, уже давно получен в сообщениях выше. В вашем посте, в котором сказано о сервере, всё понятно и из документации. Не понятно ваше высказывание в отношении того, что в терминале тестера - две позиции. Я не понимаю :). Согласен, так же как и 15 лет назад и десять, с вашими утверждениями в отношении исполнения приказов. Тем не менее, в терминале тестера имеется ДВЕ ПОЗИЦИИ, при чём, если наличие одной из них подтверждается условием if(query==true) print(), то вторая вообще появляется из "воздуха". Вот это я не могу понять или просто не хватает опыта, возможно, знаний. Пусть, согласен, да, по сути, оно так и есть, всё происходит так как вы и утверждаете, но позиция может быть открыта на основании алгоритма и этот алгоритм проверяется выше приведённым условием ... но! query не равно ни true, ни false. то есть нет подтверждения исполнения приказа, нет и отказа в исполнении. И вот это мне не понятно. Мне кажется, что привёл более чем достаточную инфу для подтверждения этого события. И подтверждение этого события осуществляется в логах, копия части этой распечатки приведена мною выше. 

Суть. После очищения памяти в структуре запроса - эта "ошибка" исчезла. Но мне все равно не понятно, почему в терминале появлялась вторая позиция :).

Если бы запрос отправлялся на сервер "два" раза, то if(query==true) давала два print() в логах, а по факту он всего один.

 
Vjacheslav Lapaev:

Тем не менее, в терминале тестера имеется ДВЕ ПОЗИЦИИ, при чём, если наличие одной из них подтверждается условием if(query==true) print(), то вторая вообще появляется из "воздуха". Вот это я не могу понять или просто не хватает опыта, возможно, знаний.,,

Не ну точно, похоже вам уже пора >>>. Без кода говорить не о чем.

Причина обращения: