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

 
MrBrooklin #:

Удачи в торговле!

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

Спасибо! Взаимно.

 

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

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

OrderModify

Изменяет параметры отложенного ордера.

bool  OrderModify( 
   ulong                 ticket,         // тикет ордера 
   double                price,          // цена исполнения 
   double                sl,             // цена stop loss  
   double                tp,             // цена take profit 
   ENUM_ORDER_TYPE_TIME  type_time,      // тип по истечению 
   datetime              expiration,     // истечение 
   double                stoplimit       // цена Limit ордера  
   )
 
Параметры
ticket
[in]  Тикет ордера.
price
[in]  Новая цена, по которой ордер должен быть исполнен (либо предыдущее значение, если изменение не нужно).
sl
[in]  Новая цена, по которой сработает Stop Loss (либо предыдущее значение, если изменение не нужно).
tp
[in]  Новая цена, по которой сработает Take Profit (либо предыдущее значение, если изменение не нужно).
type_time
[in]  Новый тип ордера по истечению из перечисления ENUM_ORDER_TYPE_TIME (либо предыдущее значение, если изменение не нужно).
expiration
[in]  Новый срок истечения отложенного ордера (либо предыдущее значение, если изменение не нужно).
stoplimit
[in]  Новая цена, по которой будет выставлен Limit ордер при достижении ценой значения price. Указывается только для StopLimit ордеров.

Возвращаемое значение
true - в случае успешной базовой проверки структур, иначе false.

Примечание
Успешное окончание работы метода OrderModify(...) не всегда означает успешное совершение торговой операции. 
Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode().

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

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

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

 
MrBrooklin #:

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

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

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

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

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

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

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
OrderModify(0,0,0,0,0,0,0);
  
  }
//+------------------------------------------------------------------+
bool  OrderModify( 
   ulong                 ticket,         // тикет ордера 
   double                price,          // цена исполнения 
   double                sl,             // цена stop loss  
   double                tp,             // цена take profit 
   ENUM_ORDER_TYPE_TIME  type_time,      // тип по истечению 
   datetime              expiration,     // истечение 
   double                stoplimit       // цена Limit ордера  
   )
{
//тело функции
return(true);
}
 
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 параметрами. Если конечно нет варианта с "перегрузкой" с меньшим кол-вом входных вариантов