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

 
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 встроена...
 

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

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


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

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

 

Спасибо Ренат!

Я в Вас не ошибся!

Предлагаю для получения права загружать ME и общаться с Вами по существу предоставлять через ЛК диплом о высшем образовании по специальности "Программист".

 
Alexey Viktorov:

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

 

Зачем Вы фантазируете? Я понял Вашу идею, и подтвердил, что она рабочая, и даст эффект, если запрос будет происходить один раз и если известно, сколько понадобиться баров для работы советника.

Или Вы как то по другому предлагали использовать структуру? Тогда прошу пояснить, а не обижаться!

[Удален]  
Aleksey Vyazmikin:

Предлагаю для получения права загружать ME и общаться с Вами по существу предоставлять через ЛК диплом о высшем образовании по специальности "Программист".

Хе.. Диплом о высшем образовании - не гарант ничего. 

По существу, могу предложить Вам такой вариант (правильность кода не проверял, исключительно для тестера, текущий символ, текущий период):

double iClose(int index)
  {
   double arr[ 1 ];
   return( ( CopyClose(_Symbol,_Period,index,1,arr) == 1 )? arr[ 0 ] : WRONG_VALUE );
  }

По аналогии можете сделать и остальные функции. 

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


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

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

Давайте, может, заведем ветку по лучшим (наиболее эффективным) практикам программирования непосредственно под MT5? Была, например, ветка по реализации iBarShift. Другие нюансы тоже можно сообща улучшить. Люди, в общем-то, не программировать учиться здесь хотят, а быстро и удобно сварганить эксперт - извините, но это так. И эксперт, разумеется не должен тормозить или падать. Если бы можно было, как готовые кирпичи, собрать вместе все "как надо", было бы здорово. Потому что "как не надо" везде много всяких разных. Причем, не всегда ведь очевидно, что это "как не надо". А может "как надо"?

Документация довольно минималистская по многим аспектам.

Кодебаза - это большая куча, которую надо со смыслом и расстановкой перелопачивать днями, чтобы может быть найти правильный код.

Статьи - как правило, авторские и узкоспециализированные, более в торговлю, чем программирование (все-таки направление ресурса нужно учитывать), а те, что про программирование - в основном про рюшечки.

Форум - это здесь. Здесь задают вопрос как надо, и мы посылаем... сюда же.

Фриланс - не гарантия лучших практик и не обучает.

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