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

 
Nikolai Semko:

можно ее доработать, если есть необходимость.

Наверное, все же правомерно говорить о корректности сравнения скоростных характеристик двух функций, когда их результаты совпадают. Допилите, пожалуйста.

 
Vladimir Pastushak:
Ребят, надоело в андроиде в мт5 постоянно вводить логин и пароль от www.mql5.com
Почему они постоянно слетают ???

Напишите в сервисдеск. Приложите логи. Спасибо.

 
Nikolai Semko:

А еще я заметил странную особенность ChartXYToTimePrice. Время ее выполнения  прямо пропорциональна количеству бар на графике.

Это говорит о "странности" алгоритма её вычисления. А именно о циклическом суммировании, что весьма странно для оптимального решения подобной задачи.

Скорость же функции XYToTimePrice одинакова вне зависимости от количества бар.

И, по правде сказать,  скорость выполнения функций ChartGetInteger и ChartGetDouble тоже явно невероятно завышена и имеет очень странные особенности. Например функция 

выполняется в 20-100 раз быстрее функции:

если МAX стоит после MIN:

но если поменять их местами, ситуация будет обратной.


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

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

Тормознутось функций запроса данных о чарте заключается в способе отправки и получения информации, а не в самой реализации. Сама реализация этих функций примитивна и не зависит от количества баров на графике.

Но так как график - это объект, информация от которого раздаётся по многим источникам, то всё управление построено на очередях сообщений. Пока предыдущий запрос не обработан, следующий ждёт.

Но если у вас идут подряд несколько запросов к одному и тому же графику, то вот эти последующие запросы исполняются очень быстро. Потому что между ними и первым запросом никто не успел вклиниться.

 
Slava:

Тормознутось функций запроса данных о чарте заключается в способе отправки и получения информации, а не в самой реализации. Сама реализация этих функций примитивна и не зависит от количества баров на графике.

Но так как график - это объект, информация от которого раздаётся по многим источникам, то всё управление построено на очередях сообщений. Пока предыдущий запрос не обработан, следующий ждёт.

Но если у вас идут подряд несколько запросов к одному и тому же графику, то вот эти последующие запросы исполняются очень быстро. Потому что между ними и первым запросом никто не успел вклиниться.


Пусть так. Но от осознания этого легче не становится. Слава, ну поймите простого программиста правильно. Мой пример тестового индикатор из предыдущих сообщений четко показывает что среднее время выполнения запроса ChartXYToTimePrice() это 5000 - 10000 микросекунд ( при толщине свечи 1 пиксель и стандартном окне в MT на FullHD экране). Что можно сделать за такое время?

Ну вот, например, за это время можно сформировать изображение в том же экране из 500 закрашенных окружностей и вывести их на экран:

Пусть даже существует очередь, но почему так долго в очереди стоит?
На одной чаше весов попиксельное формирование 500 окружностей с выводом их на экран, а на другой простой запрос о двух цифрах. И весит это одинаково.
Вот сидит простой программист, чешет репу и пазлы сложить не может.

 
Nikolai Semko:

Пусть так. Но от осознания этого легче не становится. Слава, ну поймите простого программиста правильно. Мой пример тестового индикатор из предыдущих сообщений четко показывает что среднее время выполнения запроса ChartXYToTimePrice() это 5000 - 10000 микросекунд ( при толщине свечи 1 пиксель и стандартном окне в MT на FullHD экране). Что можно сделать за такое время?

Ну вот, например, за это время можно сформировать изображение в том же экране из 500 закрашенных окружностей и вывести их на экран:

Пусть даже существует очередь, но почему так долго в очереди стоит?
На одной чаше весов попиксельное формирование 500 окружностей с выводом их на экран, а на другой простой запрос о двух цифрах. И весит это одинаково.
Вот сидит простой программист, чешет репу и пазлы сложить не может.

Вы почувствовали разницу между синхронной командой и асинхронной.

 
Slava:

Вы почувствовали разницу между синхронной командой и асинхронной.

Могли бы Вы привести список асинхронных функций.

Если правильно понимаю, то Object и Chart-функции (какие еще?) все асинхронные. Тогда не совсем понятно, почему ChartGet выполняется быстрее ChartXY?

 
Slava:

Вы почувствовали разницу между синхронной командой и асинхронной.

Да уж... 
Но наблюдения показывают что эти функции весьма синхронны в своей асинхронности. :) 
Хорошо,  сформулирую вопрос разработчикам по другому: А есть ли возможность (или желание) переделать эти ассинхронные  функции в синхронные?
 
fxsaber:

Могли бы Вы привести список асинхронных функций.

Если правильно понимаю, то Object и Chart-функции (какие еще?) все асинхронные. Тогда не совсем понятно, почему ChartGet выполняется быстрее ChartXY?

Они тоже жутко тормозят, просто суть моего "быстрого" алгоритма сводится в тому, чтоб вычислять возможность не обращаться к функциям chart и обходиться без них. И как только "схватить" мышкой график в  моем примере и начать двигать его влево - вправо, вся скорость пропадает из за того, что начинают применяться chart функции из-за наступления события 
CHARTEVENT_CHART_CHANGE
 

Здравствуйте! Начал изучать MQL5 с https://www.mql5.com/ru/articles/100. Запустил код, получил ошибку 4756, посмотрел в документации - легче не стало. Ладно, подумал, что начну с простого (Alert/Print...). Одна из важнейших функций это OrderSend. Начал искать по форуму\документации как использовать OrderSend. Наткнулся на эту статью https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions, там увидел код на открытие позиции Buy. Получил ошибку 4756 и retcode 10030. 10030 - понял, что это свойство OrderSend, но не понял как нужно использовать это свойство (смотрел чужой код), а самое главное для чего нужно. Тогда открыл https://www.mql5.com/ru/docs/trading/ordersend, скопировал код, запустил, все отлично, заработало.
Но так и не понял, почему появляется ошибка 4756 и как от нее нужно избавляться, а также 10030. 

Посмотрел код между 

void OnTick(){
      //--- объявление и инициализация запроса и результата
      MqlTradeRequest request={0};
      MqlTradeResult  result={0};
      //--- параметры запроса
      request.action   =TRADE_ACTION_DEAL;                     // тип торговой операции
      request.symbol   =Symbol();                              // символ
      request.volume   =0.1;                                   // объем в 0.1 лот
      request.type     =ORDER_TYPE_BUY;                        // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=5;                                     // допустимое отклонение от цены
      request.magic    =EXPERT_MAGIC;                          // MagicNumber ордера
      //--- отправка запроса
      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
         Alert(GetLastError());
      //--- информация об операции
      PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
   }

и этим

uint SendRandomPendingOrder(long const magic_number) 
  { 
//--- готовим запрос 
   MqlTradeRequest request={0}; 
   request.action=TRADE_ACTION_PENDING;         // установка отложенного ордера 
   request.magic=magic_number;                  // ORDER_MAGIC 
   request.symbol=_Symbol;                      // инструмент 
   request.volume=0.1;                          // объем в 0.1 лот 
   request.sl=0;                                // Stop Loss не указан 
   request.tp=0;                                // Take Profit не указан    
//--- сформируем тип ордера 
   request.type=GetRandomType();                // тип ордера 
//---сформируем цену для отложенного ордера 
   request.price=GetRandomPrice(request.type);  // цена для открытия 
//--- отправим торговый приказ 
   MqlTradeResult result={0}; 
   OrderSend(request,result); 
//--- выведем в лог ответ сервера   
   Print(__FUNCTION__,":",result.comment); 
   if(result.retcode==10016) Print(result.bid,result.ask,result.price); 
//--- вернем код ответа торгового сервера 
   return result.retcode; 
  } 

Они по-моему практически идентичны, не вижу тех мест, в которых появляются эти ошибки (4756 и 10030). Ткните пальцем и объясните пожалуйста