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

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

Описанная концепция, на мой взгляд, обладает следующими серьезными преимуществами:
сокращение исходного кода, без потери функциональности, и как следствие, сокращение временных затрат на разработку и отладку торговых систем;
уменьшение числа потенциальных ошибок;
увеличение вероятности обнаружения существующих ошибок;
упрощение дальнейшей модификации торгового эксперта (изменения автоматически распространяются как на длинные, так и на короткие сигналы и позиции).


Автор: Roman Kramar
 
Прокомментируйте пожалуйста этот кусочек, это должно работать?
double closePrice = iif( orderDirection() > 0, Bid, Ask );
 
bool modified = OrderModify( OrderTicket(), OrderOpenPrice(), closePrice -
    orderDirection() * Point * TrailingStop, OrderTakeProfit(),
    OrderExpiration() );
 
int error = GetLastError();
if( !modified && error != ERR_NO_RESULT )
{
    Print( "Failed to modify order " + OrderTicket() + ", error code: " +
        error );
}
Вроде обсуждалось на форуме , что факт модификации  так отследить нельзя.
 
Если на форуме нет желающих ответить, прошу прокоментировать этот код разработчика MQL.
 
Извиняюсь за непонятливость, а в чем собственно вопрос? 
Вроде все согласно документации, как написано так и будет работать.  
 
timbo:
Извиняюсь за непонятливость, а в чем собственно вопрос?
Вроде все согласно документации, как написано так и будет работать.
Вопрос вот в чем. Когда мы открываем ордер - смотрим тикет, если больше нуля , значит ордер открылся. Если производим модификацию, как определить, что модификация состоялась? Понятно, что можно сравнить модифицируемый параметр с сохраненным предыдущим. А вот идентификация факта модификации посредстсвом булевой функции - это что-то непонятное.
 
А что непонятного-то? Не понимаю... Какие могут быть альтернативы - либо модифицировал, либо нет... Все.

bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
Изменяет параметры ранее открытых позиций или отложенных ордеров. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функциюGetLastError().
 
 
timbo:
А что непонятного-то? Не понимаю... Какие могут быть альтернативы - либо модифицировал, либо нет... Все.

bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
Изменяет параметры ранее открытых позиций или отложенных ордеров. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функциюGetLastError().
ОК.
ОК.
 
FION писал (а):
Вроде обсуждалось на форуме , что факт модификации так отследить нельзя.
Ткните, плизз, где это обсуждалось. Мне, типа, интересно...
 
FION писал (а):
А вот идентификация факта модификации посредстсвом булевой функции - это что-то непонятное.
Не согласен. Как раз всё понятно. Да или нет. И никаких гвоздей. ..
 
KimIV:
FION писал (а):
Вроде обсуждалось на форуме , что факт модификации так отследить нельзя.
Ткните, плизз, где это обсуждалось. Мне, типа, интересно...
'Движение стопа'
 
FION писал (а):
'Движение стопа'

FION, не знаю, поняли Вы уже или нет, но скажу на всякий случай. Вы ошибочно смешали в кучу две разные вещи:

  1. Исполнение функции OrderModify()
  2. Модификация ордера

Факт исполнения функции OrderModify() проверяется возвращаемым ею значением логического типа. True - функция исполнилась, False - функция не исполнилась.

Факт модификации ордера проверяется сравнением значений функций:

  • OrderPriceOpen()
  • OrderStopLoss()
  • OrderTakeProfit()
  • OrderExpiration()

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

В кусочке кода, который Вы привели в своём первом посте этой темы, автор кода отслеживает факт исполнения функции OrderModify(), а не факт модификации ордера.

Причина обращения: