Возможна-ли ошибка? mql5

 

Ситуация такая на Hadge счёте:

Без использования класса CTrade заполняется структура MqlTradeRequest, открывается ордер Market и сразу-же SL & TP Modification. Но перед заполнением структуры

MqlTradeRequest для Modification не делается обнуление структуры.


В тестере и дебагере всё проходит, всё работает. А на реале получил ошибку 10013 "Неправильный запрос"

Естественно сразу-же поставил обнуление структуры перед заполнением, но всё-же вопрос: Возможна-ли ошибка из-за не обнулённой структуры или это ещё какая-то ошибка.

код заполнения структуры

      trade.SL_TP_Modification(mqlTradeRequest               // структура типа MqlTradeRequest она-же использовалась при открытии ордера
                             , mqlTradeCheckResult           // структура типа MqlTradeCheckResult
                             , mqlTradeRequest.symbol        // символ позиции
                             , 0
                             , NormalizeDouble(mqlTradeResult.price-tacke*point, _Digits)// tacke - внешняя переменная; point = 0.0001 или 0.01
                             , mqlTradeResult.deal           // тикет позиции
                             );


 
Alexey Viktorov:

Ситуация такая на Hadge счёте:

Без использования класса CTrade заполняется структура MqlTradeRequest, открывается ордер Market и сразу-же SL & TP Modification. Но перед заполнением структуры

MqlTradeRequest для Modification не делается обнуление структуры.


В тестере и дебагере всё проходит, всё работает. А на реале получил ошибку 10013 "Неправильный запрос"

Естественно сразу-же поставил обнуление структуры перед заполнением, но всё-же вопрос: Возможна-ли ошибка из-за не обнулённой структуры или это ещё какая-то ошибка.

код заполнения структуры


Да, все Вы правильно расписали. Конечно же, возможно. Ведь отсутствие явной инициализации перед использованием значения переменной является одной из основных ошибок при разработке программ. На эту тему даже анекдот есть:

Решите задачу: Буратино дали 5 яблок, 2 яблока он отдал Мальвине, одно съел. Сколько яблок осталось у Буратино? Думаете, что 2? Неверно! Ведь неизвестно, сколько  яблок было у Буратино до того, как ему дали 5 яблок. Мораль: проводите начальную инициализацию переменных.

 
Ihor Herasko:

Да, все Вы правильно расписали. Конечно же, возможно. Ведь отсутствие явной инициализации перед использованием значения переменной является одной из основных ошибок при разработке программ. На эту тему даже анекдот есть:

Решите задачу: Буратино дали 5 яблок, 2 яблока он отдал Мальвине, одно съел. Сколько яблок осталось у Буратино? Думаете, что 2? Неверно! Ведь неизвестно, сколько  яблок было у Буратино до того, как ему дали 5 яблок. Мораль: проводите начальную инициализацию переменных.

Но, с другой стороны этот анекдот не совсем корректен в данном случае, так мне кажется.

Тут ведь не инициализация при объявлении. Переменная объявлена, структура обнулена заполнена для открытия ордера и только потом использована вторично без обнуления на том-же самом символе и даже применительно к той-же самой позиции.

Если как в том анекдоте про Чапаева и логическое мышление рассуждать, то получается что ничего страшного не должно произойти, ведь при модификации ордера используются только те поля структуры которые нужны. Или я не прав??? Используются все поля не зависимо от применения этой структуры?

 
Alexey Viktorov:

Но, с другой стороны этот анекдот не совсем корректен в данном случае, так мне кажется.

Тут ведь не инициализация при объявлении. Переменная объявлена, структура обнулена заполнена для открытия ордера и только потом использована вторично без обнуления на том-же самом символе и даже применительно к той-же самой позиции.

Если как в том анекдоте про Чапаева и логическое мышление рассуждать, то получается что ничего страшного не должно произойти, ведь при модификации ордера используются только те поля структуры которые нужны. Или я не прав??? Используются все поля не зависимо от применения этой структуры?

Заметьте, что используемые поля структуры при открытии позиции и при модификации позиции пересекаются. А потому при модификации будут использованы некоторые данные, оставшиеся после открытия позиции.

Подходите к модификации как к совершенно новому событию. Вы не знаете, что именно в структуре есть на данный момент. Это сродни инициализации при объявлении.

Кстати, зачем передавать в функцию модификации как всю структуру, так и ее части? На мой взгляд, это избыточно. Если структура нужна только для осуществления торгового запроса, то не передавайте ее, а попросту объявите новую, но уже локальную, в функции модификации. 

 
Ihor Herasko:

Заметьте, что используемые поля структуры при открытии позиции и при модификации позиции пересекаются. А потому при модификации будут использованы некоторые данные, оставшиеся после открытия позиции.

Подходите к модификации как к совершенно новому событию. Вы не знаете, что именно в структуре есть на данный момент. Это сродни инициализации при объявлении.

Кстати, зачем передавать в функцию модификации как всю структуру, так и ее части? На мой взгляд, это избыточно. Если структура нужна только для осуществления торгового запроса, то не передавайте ее, а попросту объявите новую, но уже локальную, в функции модификации. 

А ещё лучше пользоваться стандартной библиотекой и классом CTrade.
 
Ihor Herasko:

Заметьте, что используемые поля структуры при открытии позиции и при модификации позиции пересекаются. А потому при модификации будут использованы некоторые данные, оставшиеся после открытия позиции.

Подходите к модификации как к совершенно новому событию. Вы не знаете, что именно в структуре есть на данный момент. Это сродни инициализации при объявлении.

Кстати, зачем передавать в функцию модификации как всю структуру, так и ее части? На мой взгляд, это избыточно.

Игорь, но ведь в данном примере для модификации заполняются все необходимые поля. И только "не используемые" остаются не обнулёнными.

Я не пытаюсь спорить, я пытаюсь только понять происходящее.

Что-то я совсем не понял вопрос

Ihor Herasko:

Кстати, зачем передавать в функцию модификации как всю структуру, так и ее части? На мой взгляд, это избыточно.

а как иначе? Ведь в функцию OrderSend передаётся 2 структуры. 1 типа MqlTradeRequest и 2 типа MqlTradeCheckResult

 
Karputov Vladimir:
А ещё лучше пользоваться стандартной библиотекой и классом CTrade.

Владимир, у меня задача не написать грааль используя чужие коды, а понять происходящее. Не надо мне навязывать своё мнение.

ПРОСТО ХОЧУ РАЗОБРАТЬСЯ И ПОНЯТЬ. И ВСЁ.

 
Alexey Viktorov:

Владимир, у меня задача не написать грааль используя чужие коды, а понять происходящее. Не надо мне навязывать своё мнение.

ПРОСТО ХОЧУ РАЗОБРАТЬСЯ И ПОНЯТЬ. И ВСЁ.

Я думал Вы заглянули в библиотеку - там есть такая функция (перед отправкой ордера):

//+------------------------------------------------------------------+
//| Clear structures m_request,m_result and m_check_result           |
//+------------------------------------------------------------------+
void CTrade::ClearStructures(void)
  {
   ZeroMemory(m_request);
   ZeroMemory(m_result);
   ZeroMemory(m_check_result);
  }

то есть принудительное обнуление, потом заполнение, потом отправка.

 

Этим я хотел сказать, что обнулят нужно. Здесь без вариантов. 

 
Karputov Vladimir:

Я думал Вы заглянули в библиотеку - там есть такая функция (перед отправкой ордера):

то есть принудительное обнуление, потом заполнение, потом отправка.

 

Этим я хотел сказать, что обнулят нужно. Здесь без вариантов. 

То что нужно обнулять я понимаю, я не понимаю и не вижу Вашего конкретного ответа на конкретный вопрос "При модификации используются только необходимые поля структуры или вся структура целиком?".

Хотя теперь я могу предугадать Ваш ответ... "А сколько Вам надо?". Только вот уверенности это не прибавит.


добавлено:

Что касается библиотеки, так там так всё запутано, что заяц так свои следы не путает.

 
Alexey Viktorov:

То что нужно обнулять я понимаю, я не понимаю и не вижу Вашего конкретного ответа на конкретный вопрос "При модификации используются только необходимые поля структуры или вся структура целиком?".

Хотя теперь я могу предугадать Ваш ответ... "А сколько Вам надо?". Только вот уверенности это не прибавит.


добавлено:

Что касается библиотеки, так там так всё запутано, что заяц так свои следы не путает.

В справке написано, что только 7 полей достаточно для модификации,

Modify Pending Order

Торговый приказ на модификацию уровней цен отложенного ордера. Требуется указание 7 полей:

·action

·order

·price

·sl

·tp

·type_time

·expiration

 

но обнулять нужно всю структуру. 

Но, скорее всего, Вы не правильно указываете поля type_time и   expiration,

как при модификации, так и при установке ордера. 

Приведите код как Вы заполняете структуру, при установке ордера. 

 
prostotrader:

В справке написано, что только 7 полей достаточно для модификации,

 

но обнулять нужно всю структуру. 

Но, скорее всего, Вы не правильно указываете поля type_time и   expiration,

как при модификации, так и при установке ордера. 

Приведите код как Вы заполняете структуру, при установке ордера. 

А при каких делах тут пендинг ордер???