Как еще раз включить Timer

 

Добрый день.


Есть бизнес события которые при срабатывании включают таймер.

Если событие не наступило то таймер выключить.

Все работает до первого KillTimer. Потому видимо удаляется объект и событие не наступает.

Может кто знает как запускать таймер и выключатьт таймер при наступлении конкретного события?


Свой код прикладываю ниже.

//+------------------------------------------------------------------+
//|                                                        panel.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include <Utilities/Graphics.mqh>
#include <Utilities/Price.mqh>

#include <Alerts/alerting.mqh>

bool activManualMode = false; // переключение автоматического и ручного режимов выставления торговых фильтров
long result=clrNONE;
int periodColor;
#include <WinUser32.mqh>
#import "user32.dll"
   int RegisterWindowMessageW(string a0);
#import

bool timerOn = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
         ObjectDelete(0,"up");  
         ObjectDelete(0,"down"); 
         ObjectDelete(0,"downHLine"); 
         ObjectDelete(0,"upHLine");
         deleteAutoLevel(); 
         off_Timer();
}
int OnInit()
  {
   
//--- indicator buffers mapping
   //on_Timer();
   
   getGv();
   drawHline();      
   createGraphic(); 
   getGvAlerting();
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam){

     getGv();
     drawHline();
     eventClickUp();
     eventClickDown();
     checkActivateGlobalVar();
     if(id == CHARTEVENT_CLICK && timerOn == true) { // клик на график выключить таймер
         Print("ClickChar timer false");
         off_Timer();
     }
}                  
                  
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[])
  {
     
     //Print("!=" + price);
     //Print("sssssss");
     //getGvAlerting();
      getGv(); // 
      
      //if(gv_checkFilter)
       // setting alerting price on level 
      if (activManualMode) {
     //manual space
     
      double priceMaxManual = NormalizeDouble(ObjectGet("upHLine",OBJPROP_PRICE1),Digits);
      double priceMinManual = NormalizeDouble(ObjectGet("downHLine",OBJPROP_PRICE1),Digits);
      
     // Print("Event 2h manual" + priceMinManual);    
      string strForAlert = "Пробит уровень(M): " +Symbol();
         if (Bid > priceMaxManual)    {
             Print("Current price manual UP");
             alerting(strForAlert,strForAlert +" UP"); //уведомления о событии
             
             if (timerOn == false){
                on_Timer();
             }
         } 
   
         if (Ask < priceMinManual)   {
             Print("Current price manual DOWN");
             alerting(strForAlert,strForAlert +" DOWN"); //уведомления о событии
             
             if (timerOn == false){
                on_Timer();
             }
         }
      
      } else {
     
           if(gv_checkFilter) { //включен анализ фильтров
               //включен 2h
               if (gv_btnFilter2){
                     // automatical space     
                     double price2hMax = NormalizeDouble(ObjectGet("upHLine2",OBJPROP_PRICE1),Digits);
                     double price2hMin = NormalizeDouble(ObjectGet("downHLine2",OBJPROP_PRICE1),Digits);
                     //Print("Event 2h automatic" + price2hMin);
               
               
                     string strForAlert = "Пробит 2H(A): " +Symbol();
                     
                     if (Bid > price2hMax)    {
                         Print("Current price up automaticPriceUP 2h");
                         alerting(strForAlert,strForAlert +" UP"); //уведомления о событии
                         
                         if (timerOn == false){
                            on_Timer();
                         }
                     } 
               
                     if (Ask < price2hMin)   {
                         Print("Current price down automaticPriceDOWN 2h");
                         alerting(strForAlert,strForAlert +" DOWN"); //уведомления о событии
                         
                         if (timerOn == false){
                            on_Timer();
                         }
                     } 
                     //if (Bid < price2hMax || Ask > price2hMin ){ // если ценовая ситуация не эффективна(внутри корридора и не проходит из-за фильтра)
                     //   offTimer();    
                     //}                      
               }
               //включен 3h
               if (gv_btnFilter3){
                     double price3hMax = NormalizeDouble(ObjectGet("upHLine3",OBJPROP_PRICE1),Digits);
                     double price3hMin = NormalizeDouble(ObjectGet("downHLine3",OBJPROP_PRICE1),Digits);
                     
                     string strForAlert = "Пробит 3H(A): " +Symbol();
                                    
                     if (Bid > price3hMax)    {
                         Print("Current price up automaticPriceUP 3h");
                         alerting(strForAlert,strForAlert +" UP"); //уведомления о событии
                         
                         if (timerOn == false){
                            on_Timer();
                         }
                     } 
               
                     if (Ask < price3hMin)   {
                         Print("Current price down automaticPriceDOWN 3h");
                         alerting(strForAlert,strForAlert +" DOWN"); //уведомления о событии
                         
                         if (timerOn == false){
                            on_Timer();
                         }
                     } 
                     //if (Bid < price3hMax || Ask > price3hMin ){ // если ценовая ситуация не эффективна(внутри корридора и не проходит из-за фильтра)
                     //   offTimer();    
                     //}                      
                            
               }         
               //включен 4h 
               if (gv_btnFilter4){
                     double price4hMax = NormalizeDouble(ObjectGet("upHLine4",OBJPROP_PRICE1),Digits);
                     double price4hMin = NormalizeDouble(ObjectGet("downHLine4",OBJPROP_PRICE1),Digits);
                     
                     string strForAlert = "Пробит 4H(A): " +Symbol();
                     
                     if (Bid > price4hMax)    {
                         Print("Current price up automaticPriceUP 4h");
                         alerting(strForAlert,strForAlert +" UP"); //уведомления о событии
                         
                         if (timerOn == false){
                            on_Timer();
                         }
                         
                     } 
               
                     if (Ask < price4hMin)   {
                         Print("Current price down automaticPriceDOWN 4h");
                         alerting(strForAlert,strForAlert +" DOWN"); //уведомления о событии
                         
                         if (timerOn == false){
                            on_Timer();
                         }
                     }  
                     //if (Bid < price4hMax || Ask > price4hMin ){ // если ценовая ситуация не эффективна(внутри корридора и не проходит из-за фильтра)
                     //   offTimer();    
                     //}                 
               }  
            
               
               
            }
     }

    return(rates_total);  
   
//--- return value of prev_calculated for next call
   
  }
//+------------------------------------------------------------------+
void setGlobalColorChart(){
   long colorDefault;
   ChartGetInteger(0,CHART_COLOR_BACKGROUND,0,colorDefault);
   GlobalVariableSet("ColorChart",colorDefault);
}

void on_Timer(){
   timerOn = true;
   EventSetTimer(2);
   Print("таймер включен");
}



void OnTimer() {
  newTick();
  color currentColor;
  
  currentColor = ChartBackColorGet(0);
  Print("Я OnTimer");
   if(currentColor == clrRed){
      ChartBackColorSet(clrBlack,0);
      Print("Я clrBlack");
      //Sleep(200);
      return;
   }    
   
   if(currentColor == clrBlack){
      ChartBackColorSet(clrRed,0);
      Print("Я clrRed");
      //Sleep(200);
      return;
   }
}

void off_Timer() {
   EventKillTimer();
   //ChartBackColorSet(GlobalVariableGet("ColorChart"),0);
  // Print("таймер выключен");
}

void createGraphic(){
   BitmapLabelCreate(
   0     // ID графика
   ,"up" // имя метки
   ,0    // номер подокна
   ,20   // координата по оси X
   ,40   // координата по оси Y
   ,"\\Images\\panel\\40_up_2.bmp"   // картинка в режиме On
   ,"\\Images\\panel\\40_up_1.bmp"   // картинка в режиме Off
   ,0    // X-координата области видимости
   ,0    // Y-координата области видимости
   ,0    // смещение области видимости по X
   ,0    // смещение области видимости по Y
   ,false // нажата/отжата
   ,CORNER_LEFT_UPPER   // угол графика для привязки
   ,ANCHOR_CENTER       // способ привязки
   ,clrRed              // цвет рамки при выделении
   ,STYLE_SOLID         // стиль линии при выделении
   ,1                   // размер точки перемещения
   ,false               // на заднем плане
   ,false               // выделить для перемещений
   ,false               // скрыт в списке объектов
   ,0);                 // приоритет на нажатие мышью

 BitmapLabelCreate(
   0     // ID графика
   ,"down" // имя метки
   ,0    // номер подокна
   ,20   // координата по оси X
   ,80   // координата по оси Y
   ,"\\Images\\panel\\40_down_2.bmp"   // картинка в режиме On
   ,"\\Images\\panel\\40_down_1.bmp"   // картинка в режиме Off
   ,0    // X-координата области видимости
   ,0    // Y-координата области видимости
   ,0    // смещение области видимости по X
   ,0    // смещение области видимости по Y
   ,false // нажата/отжата
   ,CORNER_LEFT_UPPER   // угол графика для привязки
   ,ANCHOR_CENTER       // способ привязки
   ,clrRed              // цвет рамки при выделении
   ,STYLE_SOLID         // стиль линии при выделении
   ,1                   // размер точки перемещения
   ,false               // на заднем плане
   ,false               // выделить для перемещений
   ,false               // скрыт в списке объектов
   ,0);                 // приоритет на нажатие мышью
  
}

void drawHline(){
   
   
   if(gv_btnFilter2){ //если активный режим 2h
      HLineCreate(0,"upHLine2",0,getMaxPrice(120,0),clrGreen,STYLE_DASH,1,false,true,false,0); //(double)
      HLineCreate(0,"downHLine2",0,getMinPrice(120,0),clrRed,STYLE_DASH,1,false,true,false,0); //(double)
    //  Print("gv_2h= " + (string)gv_2h);
      ///пунктирная
   }
   if(gv_btnFilter3){ //если активный режим 3h
      HLineCreate(0,"upHLine3",0,getMaxPrice(180,0),clrGreen,STYLE_SOLID,2,false,true,false,0); //(double)
      HLineCreate(0,"downHLine3",0,getMinPrice(180,0),clrRed,STYLE_SOLID,2,false,true,false,0); //(double)   
      //Print("gv_3h= " + (string)gv_3h);
      ///пунктирная
   }
   
   if(gv_btnFilter4){ //если активный режим 4h
      HLineCreate(0,"upHLine4",0,getMaxPrice(240,0),clrGreen,STYLE_SOLID,4,false,true,false,0); //(double)
      HLineCreate(0,"downHLine4",0,getMinPrice(240,0),clrRed,STYLE_SOLID,4,false,true,false,0); //(double)      
     // Print("gv_4h= " + (string)gv_4h);
   }   
}
  
  
void deleteAutoLevel(){
   ObjectDelete("upHLine2");
   ObjectDelete("upHLine3");
   ObjectDelete("upHLine4");
   ObjectDelete("downHLine2");
   ObjectDelete("downHLine3");
   ObjectDelete("downHLine4");
}
void checkActivateGlobalVar(){
   if(ObjectGetInteger(0,"up",OBJPROP_STATE)==false && ObjectGetInteger(0,"down",OBJPROP_STATE)==false && activManualMode  == true){
      activManualMode = false;
      Print("Выключены оба режима11");
      getGv();
   }  

} 
  
void eventClickUp(){

  if(ObjectGetInteger(0,"up",OBJPROP_STATE)==true){
     deleteAutoLevel();
     HLineCreate(0,"upHLine",0,getMaxPrice(120,0),clrGreen,STYLE_DASH,1,false,true,false,0); //(double)
     activManualMode = true;
     
  }  else {
    // activManualMode = false;
     ObjectDelete(0,"upHLine");  
  }
}  
void eventClickDown(){
if(ObjectGetInteger(0,"down",OBJPROP_STATE)==true){
     deleteAutoLevel();
     HLineCreate(0,"downHLine",0,getMinPrice(120,0),clrRed,STYLE_DASH,1,false,true,false,0); //(double)
     activManualMode = true;
  }  else {
     //activManualMode = false;
     ObjectDelete(0,"downHLine");  
  } 
} 



void newTick() {
   int message = RegisterWindowMessageW("MetaTrader4_Internal_Message");
   int hwd = WindowHandle(Symbol(), Period());
   PostMessageW(hwd, message, 2, 1);

}
 
operlay:

Может кто знает как запускать таймер и выключатьт таймер при наступлении конкретного события?

самое простое решение - поставить проверку глобально описанной переменной

OnTimer()
{
if(NoUseTimer) return;
}
 
Igor Makanu:

самое простое решение - поставить проверку глобально описанной переменной

Спасибо!!