Выбор ордера для модификации (изменения) ч. 2

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Выбор ордера для модификации (изменения) ч. 2

Сообщение Haos » 08 мар 2021, 10:15

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

Первый блок осуществлял поиск необходимого для модификации ордера по заданным условиям, в которые входили:
- наименование торгового инструмента;
- тип ордера;
- привязка к эксперту через параметр MagicNumber, т.е. "магический номер эксперта".

Также одновременно передавались в первый блок параметры, для дальнейшей возможной модификации, а именно:
- цена установки ордера;
- цена установки СЛ;
- цена установки ТП;

Далее, собственно, и был приведен код функции (первого блока) под названием: f_ModifyOrder() (после f один символ подчеркивания).
Как видно из кода функции (см. скрин ниже), в этом коде и содержался вызов функции, ответственной за второй блок:

01-Мод-ордера-ч2.png

Функция второго блока имеет имя: f__ModifyOrder(). В ней, в отличие, от функции первого блока, два знака подчеркивания после f. Конечно, можно название дать другое, но так уж получилось.

Код функции второго блока:
Код: выделить все
bool f__ModifyOrder(int ti, double pr, double sl, double tp)
{
/*
   13-12-2020
   Описание: модификация предварительно выбранного ордера
   Используется функция: f__ProcessError()
   Параметры:                                                               
   ti - OrderTicket()
   pr - новая цена установки ордера (-1 - не менять)
   sl - новый СЛ ордера (-1 - не менять)
   tp - новый ТП ордера (-1 - не менять)             
*/
   int int_Try = 5; // количество попыток
   if(OrderSelect(ti, SELECT_BY_TICKET) == true)
   {
      int i = 0;
      double dbl_Pr = pr; if(pr == -1) dbl_Pr = OrderOpenPrice();
      double dbl_SL = sl; if(sl == -1) dbl_SL = OrderStopLoss();
      double dbl_TP = tp; if(tp == -1) dbl_TP = OrderTakeProfit();
      if((OrderOpenPrice() == dbl_Pr) && (OrderStopLoss()== dbl_SL) && (OrderTakeProfit() == dbl_TP)) return(true);
      GetLastError();
      while(i < int_Try)
      {
         if(OrderModify(OrderTicket(), dbl_Pr, dbl_SL, dbl_TP, 0)) return(true);
         else
         {
            i++;
            if(!f__ProcessError(GetLastError())) return(false);
         }
      }
   }

return(false);
}

Параметрами функции второго блока являются:
- номер тикета ордера;
- цена установки ордера (новая);
- СЛ ордера (новый);
- ТП ордера (новый).
В комментарии перед кодом функции видно, что если разработчику не нужно менять любой из трех параметров исключая, само-собой, номер тикета, то нужно ввести "-1". Т.е. если нам нужно поменять, к примеру, цену установки ордера, то мы вводим её в параметр "pr" (немного коряво фраза построена, но, думаю, понятно), а для параметров СЛ и ТП вводим "-1".

Данная функция второго блока использует в своей работе внешнюю функцию f__ProcessError(), которую мы уже рассматривали (см. к примеру, здесь). Это функция для обработки ошибок.
В функции второго блока, в её коде задано 5 попыток для осуществления необходимой модификации ордердера, найденного нами в первом блоке. Этот параметр, можно, конечно, поменять внутри тела функции второго блока.
Далее идет выбор ордера по его тикету, процедура установки новых необходимых нам свойств ордера (цена установки, СЛ, ТП).

Как видно, функция второго блока именно логическая. Если за заданное количество попыток это удается, то функция второго блока возвращает значение "ИСТИНА". Если же за заданное количество попыток не удалось модифицировать ордер, то функция второго блока вернет значение "ЛОЖЬ". Вернет куда? Очевидно, что в функцию первого блока, а та уж, в свою очередь, создаст комментарий об успешности выполнения процедуры модификации ордера.

Итак, еще раз: в первом блоке процедуры модификации ордера выполняется его поиск по заданным критериям, а во втором блоке осуществляется собственно модификация выбранного ордера. Ничего в этом страшного нет. Создавая программный код, разработчик в отдельных файлах хранит уже имеющиеся у него функции и по мере необходимости просто копирует их в код эксперта. Можно, конечно, просто подключать эти файлы со всеми наработанными функциями, но "Лёлик, это же не эстетично!". :-): Зачем подключать весь файл с десятками функций, если нужна из них лишь парочка? Впрочем, дело вкуса. На производительность это не влияет. Просто размер кода советника будет чуть больше, а программист всегда стремится к минимальности, оптимальности.

Некоторые разработчики вообще создают классы. Это имеет свои плюсы, но в контексте разработки программ на MQL4, скорее больше минусов. Т.к. классы сложны, наворочены, сильно увеличивают код экспертов. я предпочитаю проще, да эффективнее. Бросил в код эксперта нужных несколько функций, написал, сердцевину кода в виде идеи заказчика и готово. Быстро и эффективно.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 19954
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 983.05 Доллар
Группа: Главные модераторы
Благодарил (а): 2805 раз.
Поблагодарили: 7389 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения