OnTick() не работает совместно с пользовательским индикатором

 

Привет всем! Такая проблема: подключил пользовательский индикатор к советнику через #resource, все работает хорошо кроме OnTick(), эта функция тупо не работает. Как только отключаю индикатор - OnTick() начинает работать... Может кто сталкивался с таким? 

...И, к сожалению, исходника индикатора нет.

 

Вот код и индикатор:

#property copyright "Copyright 2022, Maksim Neimerik"
#property link      "https://www.mql5.com/ru/users/istrebitel"
#property version   "1.00"
#property strict
#resource "\\Indicators\\GFX2.ex4"

extern string trade="===Trade Settings===";//===Trade Settings===
extern double Lot_Size=0.01;//Lot Size
extern int Magic=777;//Magic Number
extern string _Comment="Your Comment";//Comment
extern int EntryDelay=2;//Entry Delay (minute)
extern bool Time_Filter=true;//Enable Time Filter
extern string StartTime="00:00";//Start Time
extern string StopTime="23:59";//Stop Time
extern string gfx="===GFX2 Settings===";//===GFX2 Settings===
extern double Deviation=1.0;
extern int Length=8;
extern int MoneyRisk=1;

int pb=0,ps=0,x=0;
double UpArr=0,DnArr=0;
static datetime prevtime,arrowtimeB=0,arrowtimeS=0;
MqlDateTime str1,str2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(1);
   ObjectCreate(0,"Label",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"Label",OBJPROP_TEXT,"0");
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectDelete("Label");
   EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert Timer function                                            |
//+------------------------------------------------------------------+
void OnTimer()
{
   x++;
   ObjectSetString(0,"Label",OBJPROP_TEXT,IntegerToString(x));
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   Run();
}
//+------------------------------------------------------------------+
void Run()
{
   if((Time_Filter&&TimeToStr(TimeCurrent(),TIME_MINUTES)>=StartTime&&TimeToStr(TimeCurrent(),TIME_MINUTES)<StopTime)||!Time_Filter)
   {
      if(prevtime!=Time[0])
      {
         if(CountOrders(-1)==0)
         {
            if(GFX(0,1)!=EMPTY_VALUE&&GFX(0,0)!=EMPTY_VALUE&&GFX(4,0)>GFX(0,0)&&GFX(5,0)>GFX(0,0))OpenOrder(0,Lot_Size);
            if(GFX(1,1)!=EMPTY_VALUE&&GFX(1,0)!=EMPTY_VALUE&&GFX(4,0)<GFX(1,0)&&GFX(5,0)<GFX(1,0))OpenOrder(1,Lot_Size);
         }
         prevtime=Time[0];
      }
      if(CountOrders(-1)==0)
      {
         if(GFX(3,0)!=EMPTY_VALUE)
         {
            if(pb==0){arrowtimeB=TimeCurrent();pb=1;}
            if(timer(arrowtimeB))OpenOrder(0,Lot_Size);
         }
         else pb=0;
         if(GFX(2,0)!=EMPTY_VALUE)
         {
            if(ps==0){arrowtimeS=TimeCurrent();ps=1;}
            if(timer(arrowtimeS))OpenOrder(1,Lot_Size);
         }
         else ps=0;
      }
   }
   
   if(CountOrders(0)!=0&&((MathMin(GFX(5,0),GFX(4,0))<=GFX(0,0))||(GFX(1,0)!=EMPTY_VALUE)))CloseOrders(0);
   if(CountOrders(1)!=0&&((MathMax(GFX(5,0),GFX(4,0))>=GFX(1,0))||(GFX(0,0)!=EMPTY_VALUE)))CloseOrders(1);
}
//+------------------------------------------------------------------+
void CloseOrders(int cmd)
{
   int n=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS))
      {
         if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
         {
            RefreshRates();
            if(OrderType()==cmd||cmd<0)
            {
               if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,clrLimeGreen))
               {
                  if(n<10)
                  {
                     i++;
                     n++;
                  }
               }
            }
         }
      }
   }
}
//+------------------------------------------------------------------+
int CountOrders(int cmd)
{
   int res=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS))
      {
         if(OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic&&(OrderType()==cmd||cmd<0))
         res++;
      }
   }
   return(res);
}
//+------------------------------------------------------------------+
double GFX(int mode,int shift)
{
   double res=0;
   res=NormalizeDouble(iCustom(_Symbol,PERIOD_CURRENT,"::Indicators\\GFX2.ex4",Deviation,Length,MoneyRisk,clrNONE,clrNONE,clrNONE,clrNONE,mode,shift),_Digits);
   return(res);
}
//+------------------------------------------------------------------+
void OpenOrder(int cmd,double lot)
{
   int ticket=0;
   double Price=0;
   color clr=0;
   if(cmd==0)
   {
      clr=clrBlue;
      Price=NormalizeDouble(Ask,_Digits);
   }
   if(cmd==1)
   {
      clr=clrRed;
      Price=NormalizeDouble(Bid,_Digits);
   }
   ticket=OrderSend(_Symbol,cmd,CheckVolumeValue(NormalizeDouble(lot,2)),Price,10,0,0,"Project_185",Magic,0,clr);
   if(ticket<0)Print("Order not opened! Error = ",GetLastError(),". Order type=",cmd,", Order Lot=",lot,", Order open price=",Price);
}
//+------------------------------------------------------------------+
bool timer(datetime t)
{
   bool res=false;
   TimeToStruct(TimeCurrent(),str1);
   TimeToStruct(t,str2);
   if(str1.min-str2.min>=EntryDelay)res=true;
   return(res);
}
//+------------------------------------------------------------------+
double CheckVolumeValue(double volume)
{
   double res=volume;
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   
   if(volume<min_volume)
   res=min_volume;
   
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   
   if(volume>max_volume)
   res=max_volume;
   
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
   
   int ratio=(int)MathFloor(volume/volume_step);
   
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
   res=NormalizeDouble(ratio*volume_step,2);
   
   return(res);
}
Файлы:
GFX2.ex4  23 kb
 

Почему бы ни вызвать значение индикатора просто через iCustom()?

Я имею ввиду, почему бы ни отказаться от #resource?

 
Ох и тяжёлый индикатор. Терминал от него аж подвисает. Что же он там такое рассчитывает?
 
Vitaly Murlenko #:

Почему бы ни вызвать значение индикатора просто через iCustom()?

Я имею ввиду, почему бы ни отказаться от #resource?

Пробовал... OnTimer() все равно не работает. Через #resource удобнее, не надо с индикаторами возиться.

 
Vitaly Murlenko #:
Ох и тяжёлый индикатор. Терминал от него аж подвисает. Что же он там такое рассчитывает?

Да, это точно! Наверное надо выкинуть его и забыть... Но все же интересно найти причину почуму не работает OnTimer().

 
Maksim Neimerik #:

Да, это точно! Наверное надо выкинуть его и забыть... Но все же интересно найти причину почуму не работает OnTimer().

Я сегодня круто лоханулся с этим индикатором. Кинул его на М15. Он подгрузился, прорисовался. Я посмотрел-посмотрел, да и переключился на Н4. Покрутил и этот график. Затем сунул его в тестер. Стрелки на нулевой свече могут появляться и исчезать. А по формированию стрелки на первой свече входить уже поздно. Хотя, временами показывает сигналы хорошо. Далее я закрыл тестер и захотел посмотреть его работу на М1. Терминал минут 5-10 пытался что-то посчитать. Затем клик по терминалу выдал сообщение "Программа не отвечает". Я так и не дождался раздупления - выгрузил терминал из оперативы принудительно, грохнул индикатор да и всё. К чему я это? Может очередной тик настолько подвешивает советника, что до события  OnTimer() просто не доходит черёд?