Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Что такое социальный трейдинг? Прочти статью и узнай!
hoz
1936
hoz 2014.11.07 16:26 

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

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

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

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

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

MetaQuotes
Админ
24944
Renat Fatkhullin 2014.11.07 16:34  
hoz:

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

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

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

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

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

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

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

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

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

hoz
1936
hoz 2014.11.07 16:48  
Renat:

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

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

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

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

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

hoz
1936
hoz 2014.11.07 16:53  

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();

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

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

Boris
3902
Boris 2014.11.07 16:54  
Я делаю двойную проверку, что не равен и направлен куда ожидаешь!
Boris
3902
Boris 2014.11.07 16:58  
evillive:
осознал, потому и убрался )))
Грубить изволите(с)! ;)
hoz
1936
hoz 2014.11.07 17:04  
borilunad:
Я делаю двойную проверку, что не равен и направлен куда ожидаешь!

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

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

Alexey Viktorov
6678
Alexey Viktorov 2014.11.07 17:04  
hoz:

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

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

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

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

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

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

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

Boris
3902
Boris 2014.11.07 17:18  
hoz:

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

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

Виктор, тебе Ренат, в общем, правильно заметил, Алексей показал необходимую последнюю проверку, а ранее проведи все необходимые проверки на каждый параметр со всеми нюансами, чтобы избегнуть двоякости смысла и без упущения какого-нибудь условия!
Vitalie Postolache
12061
Vitalie Postolache 2014.11.07 17:18  
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.
/ /1234567
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий