Поиск экстремумов индикатора ZigZag - страница 2

 
Vladimir Karputov:

Вы зачем животину мучаете? Зачем на каждом обращении в функцию GetExtremumZigZagBar создаёте ОДИН хендл индикатора? 

Существует жесткое правило: хендл создаётся ОДИН раз в OnInit. И это ещё не всё, но для начала хотя бы это устраните.

Дак я на MQL5 совсем недавно начал писать. Щас устраню..

 
Vladimir Karputov:

Вы зачем животину мучаете? Зачем на каждом обращении в функцию GetExtremumZigZagBar создаёте ОДИН хендл индикатора? 

Существует жесткое правило: хендл создаётся ОДИН раз в OnInit. И это ещё не всё, но для начала хотя бы это устраните.

Короче я сделал так. Создал хэндл в ОнИнит

Хендл

Функцию переделал, и добавил в параметры функции int handle:

double GetExtremumZigZagPrice(string symbol="", ENUM_TIMEFRAMES timeframe=0, int handle=0, int extremum_number=0, int depth=12, int deviation=5, int backstep=3) 
{
  if (symbol=="")  //Если symbol = "" , то..
  symbol=Symbol(); //Присвоить переменной symbol значение текущего символа на графике.
  
  //Объявить необходимые переменные:
  double price[];                                //Цена экстремума выбранная из массива таймсерии.
  int    count;                                  //Счетчик цикла.
  int bars_quantity=iBars(symbol, timeframe);    //Количество баров на графике. 
  int extremum_count=0;                          //Счетчик экстремумов.
  
  ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
  CopyBuffer(handle,0,0,bars_quantity,price);     //Скопировать в динамический массив price[] цены указанного количества баров. 
 
  for (count=1; count < bars_quantity; count++)   //Запустить цикл, который будет бежать по каждому бару.
   {
    if (price[count]!=0)       //Если Цена Зигзага есть, то есть не равна нулю, то..
    {
      extremum_count++;        //Увеличить счетчик экстремумов на одну единицу.
      
      if (extremum_count > extremum_number) //Если счетчик экстремумов превысил значение указанного номера экстремума, то..
      return(price[count]);                 //Вернуть эту цену.
    }
   }
  Print("GetExtremumZigZagPrice(): Экстремум ЗигЗага ",extremum_number," не найден"); //А до тех пор, пока ЗигЗаг не показывает цену,
  return(0);                                                                          //Печатать Print, и возвращать ноль.
}

и теперь тестер стал работать чуть чуть быстрее но недостаточно.. Плюс к тому, добавленный индикатор ZigZag мигает на графике!

P.S. Вот этот han Я вставляю в параметрах индикатора,  вместо handle, при вызове функции, вместо handle.

 
Yuriy Vins:

Короче я сделал так. Создал хэндл в ОнИнит

Функцию переделал, и добавил в параметры функции int handle:

и теперь тестер стал работать чуть чуть быстрее но недостаточно.. Плюс к тому, добавленный индикатор ZigZag мигает на графике!

Как бы помягче выразится :)

int bars_quantity=iBars(symbol, timeframe);    //Количество баров на графике. 

Вот Вы зачем копируете столько баров? От момента сотворения динозавров и до сего дня? Сколько нужно баров Вам?

 
Vladimir Karputov:

Как бы помягче выразится :)

Вот Вы зачем копируете столько баров? От момента сотворения динозавров и до сего дня? Сколько нужно баров Вам?

Дак я думал, что она будет копировать только те бары что имеются на графике.. Щас надо почитать в справочнике. Я ж недавно с MQL5 начал работать..

 
Yuriy Vins:

Короче я сделал так. Создал хэндл в ОнИнит

Функцию переделал, и добавил в параметры функции int handle:

и теперь тестер стал работать чуть чуть быстрее но недостаточно.. Плюс к тому, добавленный индикатор ZigZag мигает на графике!

P.S. Вот этот han Я вставляю в параметрах индикатора,  вместо handle, при вызове функции, вместо handle.

Можно сделать инициализацию внутри функции как-то так:

 int handle;  //Хэндл индикатора.
 static bool flag;                            
  if(!flag) {
   handle=iCustom(symbol, timeframe, "Examples\\ZigZag", depth, deviation, backstep);    //Получить хэндл Зигзага, если он есть.
   ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
   if(handle != INVALID_HANDLE)
     flag=true;
  }
 
Vladimir Karputov:

Как бы помягче выразится :)

Вот Вы зачем копируете столько баров? От момента сотворения динозавров и до сего дня? Сколько нужно баров Вам?

Ааа, точно. Я тогда штук 100 баров укажу. наверное хватит..

 
Vitaly Muzichenko:

Можно сделать инициализацию внутри функции как-то так:

Спасибо , я обязательно попробую! ))

 
Vladimir Karputov:

Как бы помягче выразится :)

Вот Вы зачем копируете столько баров? От момента сотворения динозавров и до сего дня? Сколько нужно баров Вам?

Всеоооо, я 200 баров указал. Вообще забегал на скорости мой тестер стратегий! Это я невнимательно справку про iBars читал.. Ваши советы очень помогли, Спасибо большое!

Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии (советники) перед началом использования их в реальной торговле. При тестировании советника происходит его однократная прогонка с начальными параметрами на исторических данных. При оптимизации торговая стратегия прогоняется несколько раз с различным набором параметров...
 
Yuriy Vins:

Всеоооо, я 200 баров указал. Вообще забегал на скорости мой тестер стратегий, и ZigZag перестал мигать! Это я невнимательно справку про iBars читал.. Ваши советы очень помогли, Спасибо большое!

Трям :)

 
Vitaly Muzichenko:

Можно сделать инициализацию внутри функции как-то так

Vitaly Muzichenko:

Можно сделать инициализацию внутри функции как-то так:

По Вашей рекомендации я сделал вот-так:

double GetExtremumZigZagPrice(string symbol="", ENUM_TIMEFRAMES timeframe=0, int extremum_number=0, int depth=12, int deviation=5, int backstep=3) 
{
  if (symbol=="")  //Если symbol = "" , то..
  symbol=Symbol(); //Присвоить переменной symbol значение текущего символа на графике.
  
  //Объявить необходимые переменные:
  double price[];                                //Цена экстремума выбранная из массива таймсерии.
  int    count;                                  //Счетчик цикла.
  int bars_quantity=500;                         //Количество баров на графике. 
  int extremum_count=0;                          //Счетчик экстремумов.
  int handle=0;                                    //Хэндл индикатора.
  static bool flag; 
  
  if(!flag)
   {
   handle=iCustom(symbol, timeframe, "Examples\\ZigZag", depth, deviation, backstep);    //Получить хэндл Зигзага, если он есть.
   ArraySetAsSeries(price,true);                   //Устанавить флаг, чтобы индексация массива производилась как в таймсериях.
   
   if(handle != INVALID_HANDLE)
     flag=true;
   }
  
  CopyBuffer(handle,0,0,bars_quantity,price);     //Скопировать в динамический массив price[] цены указанного количества баров. 
 
  for (count=1; count < bars_quantity; count++)  //Запустить цикл, который будет бежать по каждому бару.
   {
    if (price[count]!=0)       //Если Цена Зигзага есть, то есть не равна нулю, то..
    {
      extremum_count++;        //Увеличить счетчик экстремумов на одну единицу.
      
      if (extremum_count > extremum_number) //Если счетчик экстремумов превысил значение указанного номера экстремума, то..
      return(price[count]);                 //Вернуть эту цену.
    }
   }
  Print("GetExtremumZigZagPrice(): Экстремум ЗигЗага ",extremum_number," не найден"); //А до тех пор, пока ЗигЗаг не показывает цену,
  return(0);                                                                          //Печатать Print, и возвращать ноль.
}

нули..

Но что-то не работает. Индикатор при вызове данной функции в Comment не отображает цены, а просто нули показывает. Хотя, я прошелся по коду, и теоретически все должно работать. Может чего-то упустили?

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