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

 
Aleksey Vyazmikin:

 

Пока не готов показать код по причине

Но готов показать результаты профилирования из MT5 - как я понимаю о торговых функциях речи нет.



Для окружения OHLC использую такие функции

Может я что-то делаю не так?

 

К сожалению, вы все делаете не так.

Вместо того, чтобы написать родной и эффективный MQL5 код, вы используете страшно неэффективный эмулятор MQL4 кода, который тормозит работу в десятки раз.

Плохо то, что вы даже не понимаете, что делаете, раз заявляете вопросы про скорость.
 
Aleksey Vyazmikin:

в итоге код такой

https://www.mql5.com/ru/code/18305

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • голосов: 19
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

 

Спасибо - я видел эту библиотеку - в описании смутило


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

У меня советник работает только по открытию бара - думаете есть смысл опробывать?
 
Renat Fatkhullin:

К сожалению, вы все делаете не так.

Вместо того, чтобы написать родной и эффективный MQL5 код, вы используете страшно неэффективный эмулятор MQL4 кода, который тормозит работу в десятки раз.

Плохо то, что вы даже не понимаете, что делаете, раз заявляете вопросы про скорость.

 Я конечно искал решение - как заменить функции MQL4 на MQL5, в частности обращение к тайм сериям, и увидел, что это одна из проблем с которой сталкивается большинство людей, переходящих на MQL5.

Соответственно, решение я нашел на этом же сайте, где в одной из статей рекомендовался примененный мной метод.

Лично я, не понимаю, какой смысл изымать хорошие и удобные функции из языка.

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

 
Aleksey Vyazmikin:

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

Использовать родные, более производительные функции MQL5 языка и не цепляться за MQL4 код. Любой конвертор/упрощатель MQL4 -> MQL5 несет в себе замедление в десятки раз, так как он пытается микрофункции прямого доступа из MQL4 сэмулировать через массовые операции MQL5. Причем эмуляция абсолютно без оптимизации и кеширования.

В корне использования той или иной функции(куска кода, включая чужой код) должно лежать понимание, что конкретно делается. Иначе получается "я просто использовал чужой код, смотрите - скорость упала!". Без понимания инструмента и того, что ты с ним делаешь, хорошего результата не получить.


В дополнение к "как правильно", уточню, что задача "научить(ся) программированию" экстремально сложная, как только ты поднимаешься выше самого базового уровня оперирования(даже не понимания, а именно оперирования) языком. Поэтому я не вижу другого способа обучения, кроме как прочтения массы статей, документации, готового кода в библиотеке и обязательной практики в течение нескольких лет.
 
Renat Fatkhullin:

Использовать родные, более производительные функции MQL5 языка и не цепляться за MQL4 код.

В корне использования той или иной функции(куска кода, включая чужой код) должно лежать понимание, что конкретно делается. Иначе получается "я просто использовал чужой код, смотрите - скорость упала!". Без понимания инструмента и того, что ты с ним делаешь, хорошего результата не получить.


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

 

Ренат, а Вы смотрели код базу? Там что-то мне попадается код с именно адаптированными функциями с языка MQL4.

Прошу Вас конкретно написать, как получать правильно информацию об окружении - отсылать к абстрактным книжкам не продуктивно и лишь укрепляет мое (вероятно не верное) представление о том, что этот отсыл лишь отмазка, которую нельзя проверить.

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

 
Aleksey Vyazmikin:

 Я конечно искал решение - как заменить функции MQL4 на MQL5, в частности обращение к тайм сериям, и увидел, что это одна из проблем с которой сталкивается большинство людей, переходящих на MQL5.

Соответственно, решение я нашел на этом же сайте, где в одной из статей рекомендовался примененный мной метод.

Лично я, не понимаю, какой смысл изымать хорошие и удобные функции из языка.

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

Может плохо искал? Вот тут, за одно копирование получаем всё что нужно вместо всего этого кода

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

Ошибки, баги, вопросы

Aleksey Vyazmikin, 2017.07.21 01:20

 Спасибо - исправил.

в итоге код такой

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

Время в тесторе выросло - устал уже ждать :)

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

struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };


Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Может плохо искал? Вот тут, за одно копирование получаем всё что нужно вместо всего этого кода

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



Мы получаем одно и то же - фактически...

Предложенный Вами вариант подходит, есле:

- Расчет происходит только при открытии бара

- Предварительно известно, сколько баров потребуется

У меня в коде есть циклы, объем вычислений предварительно может быть неизвестен.

И, какой смысл при каждом открытии бара копировать по, допустим, 300 барам информацию, если логичней было бы просто добавлять информацию о новом баре - почему таким путем не пошел разработчик?

 
Извините, но у меня совершенно нет времени заниматься обучением программированию каждого конкретного новичка. Особенно, когда видно, что человек даже азов понимания программирования не прошел и он спрашивает банальные вещи.


Но направление я покажу:

  1. Документация по MQL5
  2. Кодобаза
  3. Статьи
  4. Форум (не в режиме "напишите за меня, почему вы меня не учите и не делаете мою работу?")
  5. Фриланс (тут могут написать правильно)
  6. Самостоятельная работа с вдумчивым анализом "почему эта обертка должна тормозить и тратить ресурсы, может переписать оптимально?"
  7. Использование профайлера, который показывает реальное потребление ресурсов в каждой строке кода
Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы, таких как время выполнения отдельных ее фрагментов (функций, строк). В MetaEditor встроена...
 

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

Причина обращения: