Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1555

 
MrBrooklin #:

Всем доброго утра!

Наверное, что-то упустил в самообучении ООП. Беру функцию для модификации отложенного ордера:

и указываю только значения ticket, price, sl и tp. Компилятор выдаёт ошибку, что неправильно указано количество параметров. Насколько помню, если другие параметры для модификации отложенного ордера не нужны, то их можно было не указывать. Или с чем-то путаю?

А вот когда не нужные мне параметры type_time и expiration заполняю нулями, то тогда ошибки нет. 

С уважением, Владимир.

Привет Владимир. Структуру надо перед заполнением обнулить. В этих полях застрял мусор и компилятор считает это введёнными значениями.

 
Alexey Viktorov #:

Привет Владимир. Структуру надо перед заполнением обнулить. В этих полях застрял мусор и компилятор считает это введёнными значениями.

у него в компиляции ошибка, а не отправке приказа

а с нолями согласен
 
lynxntech #:

ООП тут не причем, соблюдать синтаксис при вызове функции надо

В процедурном программировании на языке MQL5 для модификации отложенного ордера применение

   ENUM_ORDER_TYPE_TIME  type_time,      // тип по истечению 
   datetime              expiration,     // истечение

не требуется от слова совсем. Возможно отсюда и возникло недопонимание того, как работает функция OrderModify() в ООП.

С уважением, Владимир.

 
Alexey Viktorov #:

Привет Владимир. Структуру надо перед заполнением обнулить. В этих полях застрял мусор и компилятор считает это введёнными значениями.

Привет, Алексей! Спасибо за подсказку.

С уважением, Владимир.

 
MrBrooklin #:

В процедурном программировании на языке MQL5 для модификации отложенного ордера применение

не требуется от слова совсем. Возможно отсюда и возникло недопонимание того, как работает функция OrderModify() в ООП.

С уважением, Владимир.

можете вставить функцию с процедурного варианта?

 
lynxntech #:

можете вставить функцию с процедурного варианта?

Могу. Взято из Справочника MetaEditor 5

Пример торговой операции TRADE_ACTION_MODIFY для модификации уровней цен отложенного ордера:



#define EXPERT_MAGIC 123456  // MagicNumber эксперта
//+------------------------------------------------------------------+
//| Модификация отложенных ордеров                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- объявление и инициализация запроса и результата
   MqlTradeRequest request={};
   MqlTradeResult  result={};
   int total=OrdersTotal(); // количество установленных отложенных ордеров
//--- перебор всех установленных отложенных ордеров
   for(int i=0; i<total; i++)
     {
      //--- параметры ордера
      ulong  order_ticket=OrderGetTicket(i);                             // тикет ордера
      string order_symbol=Symbol();                                      // символ
      int    digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS);  // количество знаков после запятой
      ulong  magic=OrderGetInteger(ORDER_MAGIC);                         // MagicNumber ордера
      double volume=OrderGetDouble(ORDER_VOLUME_CURRENT);                // текущий объем ордера
      double sl=OrderGetDouble(ORDER_SL);                                // текущий Stop Loss ордера
      double tp=OrderGetDouble(ORDER_TP);                                // текущий Take Profit ордера
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // тип ордера
      int offset = 50;                                                   // отступ от текущей цены для установки ордера, в пунктах
      double price;                                                      // цена срабатывания ордера
      double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT);          // размер пункта
      //--- вывод информации об ордере
      PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                  order_ticket,
                  order_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  DoubleToString(sl,digits),
                  DoubleToString(tp,digits),
                  magic);
      //--- если MagicNumber совпадает, Stop Loss и Take Profit не заданы
      if(magic==EXPERT_MAGIC && sl==0 && tp==0)
        {
         request.action=TRADE_ACTION_MODIFY;                           // тип торговой операции
         request.order = OrderGetTicket(i);                            // тикет ордера
         request.symbol   =Symbol();                                   // символ
         request.deviation=5;                                          // допустимое отклонение от цены
        //--- установка уровня цены, тейк-профит и стоп-лосс ордера в зависимости от его типа
         if(type==ORDER_TYPE_BUY_LIMIT)
           {
            price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; 
            request.tp = NormalizeDouble(price+offset*point,digits);
            request.sl = NormalizeDouble(price-offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                // нормализованная цена открытия
           }
         else if(type==ORDER_TYPE_SELL_LIMIT)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point; 
            request.tp = NormalizeDouble(price-offset*point,digits);
            request.sl = NormalizeDouble(price+offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // нормализованная цена открытия
           }
         else if(type==ORDER_TYPE_BUY_STOP)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; 
            request.tp = NormalizeDouble(price+offset*point,digits);
            request.sl = NormalizeDouble(price-offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // нормализованная цена открытия
           }
         else if(type==ORDER_TYPE_SELL_STOP)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point; 
            request.tp = NormalizeDouble(price-offset*point,digits);
            request.sl = NormalizeDouble(price+offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // нормализованная цена открытия
           }
         //--- отправка запроса
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError());  // если отправить запрос не удалось, вывести код ошибки
         //--- информация об операции   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
         //--- обнуление значений запроса и результата
         ZeroMemory(request);
         ZeroMemory(result);
        }
     }
  }
//+------------------------------------------------------------------+

С уважением, Владимир.

 
MrBrooklin #:

Могу. Взято из Справочника MetaEditor 5

С уважением, Владимир.

так тут вообще этих полей нет, а в библиотеке вам дали готовый добавочный "сверху" функционал

и если там в функции указано 9 входных параметров, то и вызывать ее надо с 9 параметрами. Если конечно нет варианта с "перегрузкой" с меньшим кол-вом входных вариантов