Помогите исправить ошибку (проверка на сделку)

 

Всем привет!

По моей проьсбе знакомый написал "торгового робота". Всё бы ничего, но есть проблема или ошибка. Мы не знаем как это исправить.

Проблема заключается в следующем - советнику задаются параемтры на открытие сделки. Стоит проверка на MagicID, то есть если сделка уже открыта, то новую не открывать. Но бывают такие моменты (когда скачет соединение с сервером или рынок закрылся/открылся) робот посылает запрос на открытие сделки, но не получает ответ. Посылает заново - опять тишина. И вот восстанавливается соединиение и все посланные запросы на открытие сделки и не дождавшиеся ответа - открываются. Почему не срабатывает проверка на MagicID? 30-40 открытых сделок в одну сторону за 1-2 секунды - это очень, очень чревато. Может мы что то криво сделали? Люди добрые, подскажите пожалуйста, что не так и как исправить? 

 
Ed Privy:

Всем привет!

По моей проьсбе знакомый написал "торгового робота". Всё бы ничего, но есть проблема или ошибка. Мы не знаем как это исправить.

Проблема заключается в следующем - советнику задаются параемтры на открытие сделки. Стоит проверка на MagicID, то есть если сделка уже открыта, то новую не открывать. Но бывают такие моменты (когда скачет соединение с сервером или рынок закрылся/открылся) робот посылает запрос на открытие сделки, но не получает ответ. Посылает заново - опять тишина.

Ждите код ответа сервера перед посылкой очередного запроса. И на всякий случай выключите асинхронность или как там ее правильно
 
Evgeniy Zhdan:
Ждите код ответа сервера перед посылкой очередного запроса. И на всякий случай выключите асинхронность или как там ее правильно

Евгений, благодарю за ответ. А как сделать, чтобы робот ждал ответа перед посылкой очередного запроса? Не я пишу робота, мне его знакомый пишет, но он на других языках работает. Подскажите, пожалуйста, что ему надо вставить в код, чтобы избавиться от этой проблемы.

Заранее благодарю.

 
Ed Privy:

Евгений, благодарю за ответ. А как сделать, чтобы робот ждал ответа перед посылкой очередного запроса? Не я пишу робота, мне его знакомый пишет, но он на других языках работает. Подскажите, пожалуйста, что ему надо вставить в код, чтобы избавиться от этой проблемы.

Заранее благодарю.

Думаю, поможет этот вот:

В начале кода, после #property, например, обратитесь к торговому классу, если это еще не сделано Вашим уважаемым программистом:

#include<Trade\Trade.mqh>
CTrade  trade;

Потом уже в OnInit():

//--- какую функцию использовать для торговли: true - OrderSendAsync(), false - OrderSend()
   trade.SetAsyncMode(false);

Этого уже должно хватит, чтоб Ваша проблема была решена

 
Evgeniy Zhdan:

Думаю, поможет этот вот:

В начале кода, после #property, например, обратитесь к торговому классу, если это еще не сделано Вашим уважаемым программистом:

Потом уже в OnInit():

Этого уже должно хватит, чтоб Ваша проблема была решена

Огромная Вам благодарность за отклик и совет! Побежал к программмисту делать :)

 
Evgeniy Zhdan:

Думаю, поможет этот вот:

В начале кода, после #property, например, обратитесь к торговому классу, если это еще не сделано Вашим уважаемым программистом:

Потом уже в OnInit():

Этого уже должно хватит, чтоб Ваша проблема была решена

Это скорее всего не поможет. Судя по неопытности исполнителя, об этом он и не слышал. А по умолчанию асихронность отключена.

 
Alexey Viktorov:

Это скорее всего не поможет. Судя по неопытности исполнителя, об этом он и не слышал. А по умолчанию асихронность отключена.

Не отключена. Я как то сделал человеку робота, эту асинхронность вообще не указывал. И оно ему иногда открывало много ордеров. Хотя все проверки на количество и все такое были сделаны. Я внедрил trade.SetAsyncMode(false) и помогло.

 
Evgeniy Zhdan:

Не отключена. Я как то сделал человеку робота, эту асинхронность вообще не указывал. И оно ему иногда открывало много ордеров. Хотя все проверки на количество и все такое были сделаны. Я внедрил trade.SetAsyncMode(false) и помогло.

Даже сказать не знаю что...

   void              SetAsyncMode(const bool mode)               { m_async_mode=mode;                   }
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CTrade::CTrade(void) : m_async_mode(false),
                       m_magic(0),
                       m_deviation(10),
                       m_type_filling(ORDER_FILLING_FOK),
                       m_log_level(LOG_LEVEL_ERRORS)

  {
   SetMarginMode();
//--- initialize protected data
   ClearStructures();
//--- check programm mode
   if(MQL5InfoInteger(MQL5_TESTING))
      m_log_level=LOG_LEVEL_ALL;
   if(MQL5InfoInteger(MQL5_OPTIMIZATION))
      m_log_level=LOG_LEVEL_NO;
  }
//+----

В конструкторе по умолчанию асинхронность отключена.

Дальше хоть сколько назначайте переменной m_async_mod = false она ещё фальшивее не станет.

 
Alexey Viktorov:

Даже сказать не знаю что...

В конструкторе по умолчанию асинхронность отключена.

Дальше хоть сколько назначайте переменной m_async_mod = false она ещё фальшивее не станет.

Не знаю. Больше он мне не жаловался
 
Evgeniy Zhdan:
Не знаю. Больше он мне не жаловался

Может устал жаловаться))) Или убедился в несостоятельности стратегии.

 

возможно у Вас асинхронный режим открытия сделок, используйте синхронный

сделайте проверку на количество открытых сделок и запретите открывать больше чем нужно