Ошибки, баги, вопросы - страница 3163

 
Roman #:

На форексе нет цены Last.
Это такой треш наверно ))

А решение такое.
Настроить все свойства отображения графика так как душе угодно, и сохранить его в шаблон как default.tpl 

это как сделать?

Вообще не понимаю зачем эта линия последней цены была добавлена, в практическом смысле толка нет. 

 
user4321 #:

это как сделать?

ПКМ на графике -> Шаблоны -> Сохранить шаблон
Имя файла: default.tpl

 
 В некоторых случаях (так и не выявил закономерности) при компиляции кода с неиспользуемой объявленной переменной MetaEditor5 не предупреждает о неиспользовании.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

MrBrooklin, 2022.02.25 07:15

Доброе утро, уважаемые эксперты!

Сегодня столкнулся ещё с двумя непонятными для меня моментами, но уже в коде взятом целиком и полностью из справочника MQL5. В этот раз сам ничего не писал, а только взял готовый пример.

Открываю Справочник MQL5 / Константы, перечисления и структуры / Структуры данных / Структура торгового запроса. Там нахожу:

Структура торгового запроса
Modify Pending Order
Торговый приказ на модификацию уровней цен отложенного ордера. Требуется указание 7 полей:
    action
    order
    price
    sl
    tp
    type_time
    expiration
 Пример торговой операции 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);
        }
     }
  }
//+------------------------------------------------------------------+

Пытаюсь понять строчку, которая выделена желтым цветом. Сразу возник вопрос - причём здесь PositionGetDouble(POSITION_PRICE_OPEN), если пример связан с отложенными ордерами? Может здесь должна быть вот такая строчка:

DoubleToString(OrderGetDouble(ORDER_PRICE_OPEN),digits)
Это первый момент. Второй момент появился, когда попытался запустить этот скрипт на графике с установленным мною отложенным ордером BUY_STOP (хотя всё тоже самое происходит и с другими типами отложенных ордеров). И что же происходит? А ничего не происходит! Никакой модификации отложенного ордера не наблюдаю. Может чего-то не понимаю?

Во вкладке эксперты нахожу только вот это:
2022.02.25 08:41:38.491 4 (EURUSD,M1)   #4727791 EURUSD  ORDER_TYPE_BUY_STOP  0.10  0.00000  sl: 0.00000  tp: 0.00000  [0]
Уважаемые эксперты помогите разобраться с данным примером, почему он находится в справочнике, но при этом его код не работает?

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

 
Добрый день. Подскажите как вывести депозит на карту?
 
801765632 #:
Добрый день. Подскажите как вывести депозит на карту?

Это сайт разработчика торговой платформы. Это не брокер, не ДЦ, нет реальных торговых счетов.

Внизу страницы об этом явно написано:


Задавайте, пожалуйста, такие вопросы у Вашего брокера - кому Вы деньги перечисляли на свой торговый счёт.

 
801765632 #:
Добрый день. Подскажите как вывести депозит на карту?
Обратитесь к брокеру у которого Вы открывали реальный торговый счёт.
 

Уважаемые разработчики! Почему во втором и третьем вызове выполняется перегрузка (T* const Ptr) , а не (T* & Ptr)?

Это баг или фича?  b3213.


template <typename T>
void f1(T* const Ptr) {Print(__FUNCSIG__);}

template <typename T>
void f1(T* & Ptr) {Print(__FUNCSIG__);}


class X {};

void OnStart()
  {
   const X* Ptr = new X;

   f1(Ptr);                                //void f1<const X>(const X*&)
   f1((X*)Ptr);                            //void f1<X>(X*const)
   f1((const X*) Ptr);                     //void func_902::f1<const X>(const X*const)

   delete Ptr;
  }
 
Roman #:

ПКМ на графике -> Шаблоны -> Сохранить шаблон
Имя файла: default.tpl

Такой шаблон есть по умолчанию. Я его заменил. Не помогло, увы. Всё так же осталось при переключении на него или с него. 

А как разработчиками написать, не знаете? Наверняка им уже несколько сотен раз об этом сообщали, ну ещё раз напишу. 

 

При скролинге едет шапка в сигналах