Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1178

 
Aleksey Vyazmikin:

Так в инструкции нет упоминания веера для этой функции

Так как объект в одной координате цены может иметь несколько значений, то необходимо указать номер линии. Эта функция применима только для следующих объектов:

  • Трендовая линия (OBJ_TREND)
  • Трендовая линия по углу (OBJ_TRENDBYANGLE)
  • Линия Ганна (OBJ_GANNLINE)
  • Равноудаленный канал (OBJ_CHANNEL) - 2 линии
  • Канал на линейной регрессии (OBJ_REGRESSION) - 3 линии
  • Канал стандартного отклонения (OBJ_STDDEVCHANNEL) - 3 линии
  • Линия со стрелкой (OBJ_ARROWED_LINE)

По любому у веера две точки. К ней по точкам параллельно трендовую  добавить и рассчитать. Выход всегда можно найти.

 
Uladzimir Izerski:

Вычисленной с помощью ObjectGetValueByTime цены узнаем любой процент веера.

В тестере работает. Не проверял.

Можете показать в виде кода?

 
Aleksey Vyazmikin:

Можете показать в виде кода?

Только что проверил в коде. На каналах работает. Определяет и на веере. 

 F_Draw_Object("FAN",OBJ_FIBOFAN,Time[20],High[20],Time[5],Low[5],0,0,0,2,C'00,00,200',OBJPROP_FILL,false);
 PriseCLv=ObjectGetValueByTime(0,"FAN",Time[10],0);

Можно привязать трендовую к вееру и тоже можно определять. Но работает и так.

 
Uladzimir Izerski:

Только что проверил в коде. На каналах работает. Определяет и на веере. 

Можно привязать трендовую к вееру и тоже можно определять. Но работает и так.

Как у Вас работает?

У меня, по крайней мере в визуальном тестере не работает...

bool fiboFanCreate(string ffname, datetime tm1, double pr1, datetime tm2, double pr2)
{
   Print(__FUNCSIG__);
   
   //if(!ObjectCreate(0,ffname,OBJ_FIBOFAN,0,tm1,pr1,tm2,pr2))
   if(!ObjectCreate(0,ffname,OBJ_FIBOFAN,0,tm1,pr1,tm2,pr2,0,0,0,2,C'00,00,200',OBJPROP_FILL,false))
   {
      Print(__FUNCSIG__,
            ": не удалось создать \"Веер Фибоначчи\"! Код ошибки = ",GetLastError());
      return(false);
   }
   
   ChartRedraw();
   Sleep(1000);
   
   return(true);
}
//+------------------------------------------------------------------+
bool fiboFanLevelsSet(double  &values[],  // значения линий уровня
                      string  name)       // имя веера
{
   Print(__FUNCSIG__);
   
   levels = ArraySize(values);
   ArrayPrint(values);
   //--- установим количество уровней
   ObjectSetInteger(0,name,OBJPROP_LEVELS,levels);
   
   //--- установим свойства уровней в цикле
   for(int i=0;i<levels;i++)
   {
      //--- значение уровня
      ObjectSetDouble(0,name,OBJPROP_LEVELVALUE,i,values[i]);
      //--- описание уровня
      ObjectSetString(0,name,OBJPROP_LEVELTEXT,i,IntegerToString(i+1));
   }
   ChartRedraw();
   Sleep(1000);
   //--- успешное выполнение
   return(true);
}

Проверка

void OnTick()
{
   new_bars    = current_chart.isNewBar();   // проверить появление нового бара
   
   if(new_bars > 0)
   {
      if(ObjectFind(0,ff_name) >= 0) Print(ff_name,"4 = ",NormalizeDouble(ObjectGetValueByTime(0,ff_name,TimeCurrent(),4),Digits()));

....

2020.01.19 19:38:50.208 2019.09.19 11:15:00   bool fiboFanCreate(string,datetime,double,datetime,double)
2020.01.19 19:38:50.208 2019.09.19 11:15:01   bool fiboFanLevelsSet(double&[],string)
2020.01.19 19:38:51.365 2019.09.19 11:30:00   FFan4 = 0.0
 

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

2 вопроса МТ5

Сергей Таболин, 2020.01.20 11:52

Что вызывает ошибку при вызове индикатора из советника? При том, что сам индикатор нормально становится на график вручную.

   ResetLastError();
   handle_ICTMP1 = iCustom(Symbol(),0,"my_used\\ICTMP_3.01",0,in_symb1,false,false,in_smoothing);
   if(handle_ICTMP1 == INVALID_HANDLE)                                                 // проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора handle_ICTMP1...",GetLastError());   // если хендл не получен, то выводим сообщение в лог об ошибке
      return(INIT_FAILED);                                                             // завершаем работу с ошибкой
   }
   else
   {
      Print("Получен хендл индикатора handle_ICTMP1");
      if(!MQLInfoInteger(MQL_OPTIMIZATION))
      {
         if(!ChartIndicatorAdd(ChartID(),0,handle_ICTMP1)) Print("Ошибка подключения индикатора к графику"); // подключаем индикатор к графику
      }
   }
2020.01.20 13:42:09.390 Core 1  file Indicators\my_used\ICTMP_3.01 read error
2020.01.20 13:42:09.390 Core 1  loading of ICTMP_ EURGBP,M15 failed [557]
2020.01.20 13:42:09.390 Core 1  2019.09.19 00:00:00   cannot load custom indicator 'my_used\ICTMP_3.01' [4802]
2020.01.20 13:42:09.390 Core 1  2019.09.19 00:00:00   Не удалось получить хендл индикатора handle_ICTMP1...4802
2020.01.20 13:42:09.390 Core 1  tester stopped because OnInit returns non-zero code
П.С. Это в тестере.

И это при том, что советник запускается на графике в реальном времени. С отрисовкой индикатора. (((

В частности, что вот это?

 

Уважаемые, ну неужели никто ничего не может предположить?

Отдельно индикатор работает и в тестере, и на графике. При запуске из советника в тестере вылетает непонятная ошибка. Советник с этим индикатором нормально запускается и работает на графике.

Куда копать?

 
Сергей Таболин:

Уважаемые, ну неужели никто ничего не может предположить?

Отдельно индикатор работает и в тестере, и на графике. При запуске из советника в тестере вылетает непонятная ошибка. Советник с этим индикатором нормально запускается и работает на графике.

Куда копать?

Может в сторону пути к индикатору в тестере?
 
Artyom Trishkin:
Может в сторону пути к индикатору в тестере?

Это как?

У меня все нужные индикаторы лежат по этому пути

handle_ICTMP1 = iCustom(Symbol(),0,"my_used\\ICTMP_3.01"
handle_HMA7C = iCustom(Symbol(),0,"my_used\\my_HMA7C_201",

Никогда ранее такого не было. К тому же первый раз слышу об отдельном пути к индикатору в тестере...

Для других индикаторов путь подходит, а для этого нет?

 

Специально добавил ещё один индикатор перед этим.

   ResetLastError();
      handle_HMA7C = iCustom(Symbol(),0,"my_used\\my_HMA7C_201",45,9);
      if(handle_HMA7C == INVALID_HANDLE)                                                  // проверяем наличие хендла индикатора
      {
         Print("Не удалось получить хендл индикатора handle_HMA7C...",GetLastError());    // если хендл не получен, то выводим сообщение в лог об ошибке
         return(INIT_FAILED);                                                             // завершаем работу с ошибкой
      }
      else
      {
         Print("Получен хендл индикатора handle_HMA7C");
         if(!MQLInfoInteger(MQL_OPTIMIZATION))
         {
            if(!ChartIndicatorAdd(ChartID(),0,handle_HMA7C)) Print("Ошибка подключения индикатора к графику"); // подключаем индикатор к графику
         }
      }
   
   handle_ICTMP1 = iCustom(Symbol(),0,"my_used\\ICTMP_3.01",0,in_symb1,false,false,in_smoothing);
   if(handle_ICTMP1 == INVALID_HANDLE)                                                 // проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора handle_ICTMP1...",GetLastError());   // если хендл не получен, то выводим сообщение в лог об ошибке
      return(INIT_FAILED);                                                             // завершаем работу с ошибкой
   }
   else
   {
      Print("Получен хендл индикатора handle_ICTMP1");
      if(!MQLInfoInteger(MQL_OPTIMIZATION))
      {
         if(!ChartIndicatorAdd(ChartID(),0,handle_ICTMP1)) Print("Ошибка подключения индикатора к графику"); // подключаем индикатор к графику
      }
   }
2020.01.20 20:15:34.713 program file added: Indicators\my_used\my_HMA7C_201.ex5. 41715 bytes loaded
2020.01.20 20:15:34.920 2019.09.19 00:00:00   Получен хендл индикатора handle_HMA7C
2020.01.20 20:15:34.921 file Indicators\my_used\ICTMP_3.01 read error
2020.01.20 20:15:34.921 loading of ICTMP_ EURGBP,M15 failed [557]
2020.01.20 20:15:34.921 2019.09.19 00:00:00   cannot load custom indicator 'my_used\ICTMP_3.01' [4802]
2020.01.20 20:15:34.921 2019.09.19 00:00:00   Не удалось получить хендл индикатора handle_ICTMP1...4802
2020.01.20 20:15:34.921 tester stopped because OnInit returns non-zero code

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

 
Сергей Таболин:

Уважаемые, ну неужели никто ничего не может предположить?

Куда копать?

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

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