Обновление платформы MetaTrader 4 билд 625: Журналы в MetaTrader Market и новый MetaViewer - страница 51

 
OrderModify(OrderTicket(), NormalizeDouble(open, Digits), 
            OrderStopLoss(), OrderTakeProfit(), OrderExpiration()
            );
// return value of 'OrderModify' should be checked      4_Fibo.mqh
Наверное скоро, предупреждения будут о лишних пробелах. Не хочу я здесь проверять успешность, сюда передаются как отоложки, так и открытые ордера.
 
Pavlick:
Наверное скоро, предупреждения будут о лишних пробелах. Не хочу я здесь проверять успешность, сюда передаются как отоложки, так и открытые ордера.

В смысле, - неважно, произошла модификация ордера или нет?

Так, может, тогда и вовсе не вызывать эту функцию, - ведь, неважно же?

Предупреждения об отсутствии контроля ошибок имеют очень высокую ценность.

 
simpleton:

В смысле, - неважно, произошла модификация ордера или нет?

Так, может, тогда и вовсе не вызывать эту функцию, - ведь, неважно же?

Предупреждения об отсутствии контроля ошибок имеют очень высокую ценность.

Предупреждение на этапе компиляции о том, что я не проверил возврат от функции OrderModify. Функция выглядит так:

void Fibo::move_pending(double new_price)const
{
    for(int cur_ord = OrdersTotal() - 1;  cur_ord >= 0;  -- cur_ord)
        if( OrderSelect(cur_ord, SELECT_BY_POS) )
            if( (unsigned int)OrderMagicNumber() == this.magic )
            {
                double open = new_price;
                if(this.direction == Trend_direction::up)
                    open += Ask - Bid;
                OrderModify(OrderTicket(), NormalizeDouble(open, Digits), 
                            OrderStopLoss(), OrderTakeProfit(), OrderExpiration()
                           );
                return;
            }
}

Под этим магиком могут быть и отложки и открытые ордера. Зачем мне проверять возврат, если я понимаю что не всегда модификация будет происходить (если magic указывает на открытый ордер), логика программы это допускает?

 
Zhunko:


Кстати, таких строк в том файле нет, кроме последней.

Не тот почему-то. Старый. Прикрепил исправленный под 625.

Сергеев смотрел неисправленный код.

Сергеев теперь может смотреть новый код?

Сергеев помогать однако.

 

Глюк с отображением значков на графике. С линиями и другими графическими элементами не пробовал.

Вот простая программа. Индикатор, который рисует значок "стрелка вверх" красного цвета в координатах нулевой бар и цена хай нулевого бара.

#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    ObjectCreate(ChartID(),"ArrowUp",OBJ_ARROW_UP,0,time[0],high[0]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
     ObjectDelete(ChartID(),"ArrowUp");
}

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

 
agvozdezkiy:

Глюк с отображением значков на графике. С линиями и другими графическими элементами не пробовал.

Вот простая программа. Индикатор, который рисует значок "стрелка вверх" красного цвета в координатах нулевой бар и цена хай нулевого бара.

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


Когда сохраняешь шаблон deinit не выполняется и объект остаётся на графике. При применении шаблона этот объект отображается на "старом" месте, а создание нового не происходит потому, что объект с таким именем уже существует.
Потом, когда меняешь ТФ и выполняется deinit, то объект удаляется и рисуется на новом месте...
 
AlexeyVik:
Когда сохраняешь шаблон deinit не выполняется и объект остаётся на графике. При применении шаблона этот объект отображается на "старом" месте, а создание нового не происходит потому, что объект с таким именем уже существует.
Потом, когда меняешь ТФ и выполняется deinit, то объект удаляется и рисуется на новом месте...

Вот оно что! То есть перед тем как сохранять шаблон нужно почистить список объектов? Или можно как то объяснить МТ, что не все "рисовалки" нужно сохранять?(((((
 
Pavlick:

Предупреждение на этапе компиляции о том, что я не проверил возврат от функции OrderModify. Функция выглядит так:

Под этим магиком могут быть и отложки и открытые ордера. Зачем мне проверять возврат, если я понимаю что не всегда модификация будет происходить (если magic указывает на открытый ордер), логика программы это допускает?


Чтобы узнать, успешно отработала функция или нет. Если это - неважно, то, наверное, и неважно, была вообще вызвана функция или нет. То есть, можно выкинуть весь код и не вызывать его, - ведь, не важно же, есть результат от его работы или нет?

Дело в том, что все случаи должны быть запрограммированы, а не оставлены на "как получится". Это - важно для качества кода.

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

Во "взрослых" языках для избавления от подобных вещей обычно достаточно выполнить приведение к типу void, но компилятор MQL4 упорно сопротивляется таким попыткам.

Но, если очень хочется, чтобы проверять не надо было, можно свои функции-обёртки создать на основе "системных", например:

void MyOrderModify(int ticket, double price, double stop, double take, datetime expiration, color arrow) {
  if (OrderModify(ticket, price, stop, take, expiration, arrow)) return;
}

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

 
Вопрос к разработчикам. Когда ожидать релиз нового билда с исправлениями?
 
Бета выйдет сегодня вечером, 23 апреля.
Причина обращения: