Обновление платформы 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 апреля.