Ошибка #1 при модификации ордеров

 

 Как убрать эту долбаную ошибку? Она меня уже достала. Проверяю каждый вводный параметр функции. У меня, в данный момент, это так:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))
   New_OOP = ND (fd_MurreyLevelsValue[11]);
else New_OOP = OrderOpenPrice();
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Т.е. если параметр не изменён, то изменять его ненужно. Раньше я так не делал, но решил уж...

Дальше у меня параметры передаются в метода модификации ордера так:

 if (!fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
{
   if (_LastError != 0)
     WriteLog (StringConcatenate (__FUNCTION__, ". В строке ", __LINE__, " ", CErrs.ErrorToString (_LastError)),
                     CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
}

Нв выходе в журнале:

modify #2 sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1

Получается, журнал уведомил, типа модификация: ОК, а дальше... ошибка. Ни один параметр при этом не изменился.

Ордер отложенный. Так что менять можно цену открытия, стоп и тейк. И это, как я понимаю, не противоречил документации. 

Кто сталкивался с подобным? Как решать?

 
hoz:

 Как убрать эту долбаную ошибку? Она меня уже достала. Проверяю каждый вводный параметр функции. У меня, в данный момент, это так:

Т.е. если параметр не изменён, то изменять его ненужно. Раньше я так не делал, но решил уж...

Дальше у меня параметры передаются в метода модификации ордера так:

Нв выходе в журнале:

Получается, журнал уведомил, типа модификация: ОК, а дальше... ошибка. Ни один параметр при этом не изменился.

Ордер отложенный. Так что менять можно цену открытия, стоп и тейк. И это, как я понимаю, не противоречил документации. 

Кто сталкивался с подобным? Как решать?

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

Поэтому при возникновении ошибки ее код надо сохранить в локальную переменную и уже потом оттуда, после массы ваших последующих вызовов, распечатать.

 
Renat:

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

Поэтому при возникновении ошибки ее код надо сохранить в локальную переменную и уже потом оттуда, после массы ваших последующих вызовов, распечатать.

А может ещё и массив ошибок завести? Ведь в документации чёрным по белому написано, что переменная _LastError хранит номер последней ошибки. А сброс её производится функцией ResetLastError(). Если между вызовами  _LastError не было ошибок больше, то  _LastError хранит значение последней ошибки. У меня по ходу кода больше не было ошибок. А значится, вопрос не в этом.

 Тем более, заводит переменные для ошибок в каждом методе и потом принтовать эти переменные в экспертах не очень то и логично.

 Ведь если есть переменная для сбора ошибок, то зачем их плодить? 

 

evillive, как это нет проверок? Я же написал выше:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

 Для первого даже коммент дал. Хотя там всё элементарно.

Как ещё можно тут проверить? 

 
Я делаю двойную проверку, что не равен и направлен куда ожидаешь!
 
evillive:
осознал, потому и убрался )))
Грубить изволите(с)! ;)
 
borilunad:
Я делаю двойную проверку, что не равен и направлен куда ожидаешь!

Борис, что же Вы имеет ввиду? Ведь у меня чётко написано, что если цена не такая.. то так... иначе... текущая... К чему тут ещё? Можно и 20 раз проверять... :) Ведь это не разумно. Я уже второй день бьюсь над этим кодом. Раньше как-то не сталкивался с подобным косяком. Теперь столкнулся. У меня эти все методы уже написаны и протестированы много раз. Тут столкнулся с проблемой.

Дело в том, что я больше любитель чутка других тактик. Но писав последний сов, наткнулся на этот глюк. Вот уже сам не знаю куда какпать, т.к. распринтовав весь код в доль и поперёк больше у меня нет мыслей. Потому функция OrderModify() встроенная. И реализацию её я не знаю..

 
hoz:

evillive, как это нет проверок? Я же написал выше:

 Для первого даже коммент дал. Хотя там всё элементарно.

Как ещё можно тут проверить? 

Виктор, так у тебя-же после проверки присваивается новое значение или нет... А надо проверить

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11])  // Если текущая цена не равна новой.. из массива
 || OrderStopLoss() != ND (fd_MurreyLevelsValue[12])   // или 
 || OrderTakeProfit() != ND (fd_MurreyLevelsValue[2])) // или
  // если одно из условий выполнено пойдём в модифай... 
 
AlexeyVik:

Виктор, так у тебя-же после проверки присваивается новое значение или нет... А надо проверить

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

 
hoz:

Борис, что же Вы имеет ввиду? Ведь у меня чётко написано, что если цена не такая.. то так... иначе... текущая... К чему тут ещё? Можно и 20 раз проверять... :) Ведь это не разумно. Я уже второй день бьюсь над этим кодом. Раньше как-то не сталкивался с подобным косяком. Теперь столкнулся. У меня эти все методы уже написаны и протестированы много раз. Тут столкнулся с проблемой.

Дело в том, что я больше любитель чутка других тактик. Но писав последний сов, наткнулся на этот глюк. Вот уже сам не знаю куда какпать, т.к. распринтовав весь код в доль и поперёк больше у меня нет мыслей. Потому функция OrderModify() встроенная. И реализацию её я не знаю..

Виктор, тебе Ренат, в общем, правильно заметил, Алексей показал необходимую последнюю проверку, а ранее проведи все необходимые проверки на каждый параметр со всеми нюансами, чтобы избегнуть двоякости смысла и без упущения какого-нибудь условия!
 
hoz:

evillive, как это нет проверок? Я же написал выше:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Для первого даже коммент дал. Хотя там всё элементарно.

Как ещё можно тут проверить? 

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