Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2340

 
Ivan Kravchenko #:
Добрый день. Кто знает, Боты с mql5 не работают на серверах Zomro?

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

 
Возникла необходимость использовать функцию OnTimer(), а для нее компилятор требует наличия OnCalculate().
Добавил OnCalculate(), но компилятор ее не видит:

OnCalculate function declared with wrong type or/and parameters CHECK___TESTER_TermVariable.mq4 57      5
OnCalculate function not found in custom indicator              1       1
1 errors, 1 warnings            2       2

Код для проверок/экспериментов ниже.
С чем может быть связана ошибка?



#property indicator_chart_window

datetime   MTF_Time_0            = 0;


void OnInit() {
   EventSetTimer(3);        // 3 секунды - периодичность запуска функции OnTimer()
GlobalVariableSet("_AA__MTF_Time_0", MTF_Time_0);       // временно, позже удалить!!! --------------------------------
}


void OnDeinit(const int reason) {
   EventKillTimer();
}


void OnTimer() {
   if(GlobalVariableGet("_AA__MTF_Time_0")>MTF_Time_0 ) {
      MTF_Time_0                 = GlobalVariableGet("_AA__MTF_Time_0");
      GlobalVariableSet("_AA__MTF_Time_0", 0);
   } // if(GlobalVariableGet("_AA___Time_Control_Check")>=Time[0] ) {
} // void OnTimer() {




/*
int OnCalculate(int Time_tmp) {
   if(MTF_Time_0>0) {
//      ObjectDelete(       "VLINE_Name_1");
//      FUNCTION_DRAW_VLINE("VLINE_Name_1", clrPink, 1, MTF_Time_0, true, TimeToStr(MTF_Time_0, TIME_DATE|TIME_MINUTES), 0);
      MTF_Time_0 =  0;
   }

   int TempR = 10;
   TempR                             = TempR + Time_tmp;
   MTF_Time_0                    = 0;

   return(TempR);
} // void OnCalculate() {
*/



int OnCalculate(const int rates_total) {
   return(rates_total);
}
 
grezky #:
Возникла необходимость использовать функцию OnTimer(), а для нее компилятор требует наличия OnCalculate().
Добавил OnCalculate(), но компилятор ее не видит:


Код для проверок/экспериментов ниже.
С чем может быть связана ошибка?

 
grezky #:
Возникла необходимость использовать функцию OnTimer(), а для нее компилятор требует наличия OnCalculate().
Добавил OnCalculate(), но компилятор ее не видит:


Код для проверок/экспериментов ниже.
С чем может быть связана ошибка?



OnCalculate() для OnTimer() не требуется.
 
Artyom Trishkin #:

Спасибо! Повторил как в Вашем gif-е - лед тронулся, ошибка компиляции пропала.

 
Sergey Gridnev #:
OnCalculate() для OnTimer() не требуется.

Это то что я сейчас наблюдаю при отладке.
В документации пишут:

Функция OnCalculate() вызывается только в пользовательских индикаторах при необходимости произвести расчет значений индикатора по событию Calculate. Обычно это происходит при поступлении нового тика по символу.. 

Поскольку тики не приходят то OnCalculate() выполнился один раз и остановился.
А в  OnTimer() все бежит как следует (выставил обновление через 3 секунды).
Можно графические объекты рисовать на графике в самой функции  OnTimer() ?

- - - 

Пока для проверки рисую вертикальную линию и наблюдаю за ее перемещением на графике.
Перенес все из  OnCalculate() в  OnTimer() - работает!
Спасибо!
 
//+------------------------------------------------------------------+
//|                                                    Dandi_New.mq4 |
//+------------------------------------------------------------------+
//Показывает значения линий индикатора Alligator

#property indicator_chart_window //Индикатор в основном окне
#property strict //Ошибки строго, анализ результата OnInit().

int Okno=0;
bool RezultatInit=true;



//+------------------------------------------------------------------+
//| Инициализация                                                    |
//+------------------------------------------------------------------+
int OnInit()
{
RezultatInit=RezultatInit && EventSetTimer(1); //Одна секунда

if(ObjectFind(Okno,"Dandi_Line")== -1)//Если отсутствует
  {RezultatInit=RezultatInit && ObjectCreate("Dandi_Line",OBJ_VLINE,Okno,Time[10],Bid);
  }
if(RezultatInit)ObjectSetInteger(Okno,"Dandi_Line",OBJPROP_SELECTED,true);  //Выделить объект

if(ObjectFind(Okno,"Chelusti")== -1)//Если отсутствует
   {RezultatInit=RezultatInit && ObjectCreate("Chelusti",OBJ_ARROW,Okno,Time[2],Bid);  //10-8==2
    ObjectSet("Chelusti",OBJPROP_ARROWCODE,233);
    ObjectSet("Chelusti",OBJPROP_COLOR,Blue);
   }

if(ObjectFind(Okno,"Zubi")== -1)//Если отсутствует
   {RezultatInit=RezultatInit && ObjectCreate("Zubi",OBJ_ARROW,Okno,Time[5],Bid);
    ObjectSet("Zubi",OBJPROP_ARROWCODE,233);
    ObjectSet("Zubi",OBJPROP_COLOR,Red);
   }

if(ObjectFind(Okno,"Gubi")== -1)//Если отсутствует
   {RezultatInit=RezultatInit && ObjectCreate("Gubi",OBJ_ARROW,Okno,Time[7],Bid);
    ObjectSet("Gubi",OBJPROP_ARROWCODE,233);
    ObjectSet("Gubi",OBJPROP_COLOR,Lime);
   }

if(RezultatInit==false)return(INIT_FAILED); //Переход в OnDeinit()
return(INIT_SUCCEEDED); //Инициализация_Проследовало успешно
}



void OnDeinit(const int KodZaversheniya=0)
{

if(RezultatInit==false)Print("Ошибка инициализации: ",UninitializeReason());

Print("Деинициализация: ",KodZaversheniya);

ObjectDelete("Dandi_Line");
ObjectDelete("Chelusti");
ObjectDelete("Zubi");
ObjectDelete("Gubi");

EventKillTimer();
}


//+------------------------------------------------------------------+
//| Вызов по событию Calculate (после Init и при каждом тике).       |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

Indikator_start();

return(rates_total);
}



//+------------------------------------------------------------------+
//| Вызов по событию Timer                                           |
//+------------------------------------------------------------------+
void OnTimer()
{

Indikator_start();

}


//+------------------------------------------------------------------+
//| Функция индикатора.                                              |
//+------------------------------------------------------------------+
void Indikator_start()
{

datetime tline,tch,tz,tg;
double cena;
int shift;


tline=(datetime)ObjectGet("Dandi_Line",OBJPROP_TIME1);
shift=iBarShift(NULL,0,tline,false);

cena=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, shift-8);
tch=iTime(NULL,0,shift-8);
if(tch==0)tch=tline+(8*Period()*60);
ObjectSet("Chelusti",OBJPROP_TIME1,tch);
ObjectSet("Chelusti",OBJPROP_PRICE1,cena);

cena=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, shift-5);
tz=iTime(NULL,0,shift-5);
if(tz==0)tz=tline+(5*Period()*60);
ObjectSet("Zubi",OBJPROP_TIME1,tz);
ObjectSet("Zubi",OBJPROP_PRICE1,cena);

cena=iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, shift-3);
tg=iTime(NULL,0,shift-3);
if(tg==0)tg=tline+(3*Period()*60);
ObjectSet("Gubi",OBJPROP_TIME1,tg);
ObjectSet("Gubi",OBJPROP_PRICE1,cena);

return;
}

 

Перемещая вертикальную линию получаем значения индикатора.

OnCalculate() срабатывает от каждого тика.

OnTimer() нужен для выходных, когда тиков нет.

 
Putnik #:

Перемещая вертикальную линию получаем значения индикатора.

OnCalculate() срабатывает от каждого тика.

OnTimer() нужен для выходных, когда тиков нет.

Спасибо!

 

Вечер добрый! Подскажите, почему в тестере на малых ТФ выходит за пределы массива. В он-лайн работает.


#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.10"
#property strict
#property indicator_chart_window
input int multi=1; //Значения до 5 дней
int m=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   m=(multi<=0)||(multi>5)?A():multi;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
 
   int teDay=0;
   int h= PeriodSeconds(_Period)/60,
      limit=(!prev_calculated)?(1440/h)*m-1:rates_total-prev_calculated;
    for(int i=limit; i>=0; i--)
     {
     Print("i = ",i);
       teDay = iBarShift(Symbol(),1440,Time[i],false);
        Print("teDay =",teDay," m = ",m);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//-------------------------------------------------------------------+
int A()
  {
   Alert("Некорректное значение параметра multi");
   return 1;
  }