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

Ed Privy  

Всем привет!

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

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

Evgeniy Zhdan  
Ed Privy:

Всем привет!

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

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

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

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

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

Evgeniy Zhdan  
Ed Privy:

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

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

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

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

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

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

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

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

Ed Privy  
Evgeniy Zhdan:

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

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

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

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

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

Alexey Viktorov  
Evgeniy Zhdan:

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

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

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

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

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

Evgeniy Zhdan  
Alexey Viktorov:

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

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

Alexey Viktorov  
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 она ещё фальшивее не станет.

Evgeniy Zhdan  
Alexey Viktorov:

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

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

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

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

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

Renat Akhtyamov  

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

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