Создал советник , 1 - как правильно настроить уведомления не боле чем 1 раз и 2- при смене таймфрейма сбрасывается значения из editBox, как сохранять значения в editBox переходят по разным таймфремам?

 

1- Как можно сделать чтобы указанная цена не сбрасывалась в editbox при смене таймфрема?

2- Как можно настроить работу уведомления 1 раз, вроде все сделал правильно, даже создал уже глобальную переменную, там ее обнулил. В условии проверки на 1-о уведомление срабатывает хорошо. А как теперь сделать чтобы не приходилось заново таскать сову, или при каком событии правильнее обнулять значения переменной bool? Я вешал в else после событии отжатия кнопки (в проверки на false), но происходит  снова зациклинивание событий и уведомление начинают приходить не 1 раз а больше.

Исходники Советника ниже после include. mql4 .

CreateOject.mqh - тут функции из help по созданию графических объектов

IndStreet.mqh>  тут функция-


int alertingLelev(double SoundWhenPriceGoesAbove,double SoundWhenPriceGoesBelow,double SoundWhenPriceIsExactly){
 if ((Ask > SoundWhenPriceGoesAbove) && (SoundWhenPriceGoesAbove > 0))
   {
      Alert("Цена " + Symbol() + "пробила выше уровня" + (string)SoundWhenPriceGoesAbove);
      PlaySound("alert.wav");
      SendMail(Symbol() +  " пробила уровень ВЫШЕ " + (string)Ask, "Цена " + Symbol() +  " достигла " + (string)Ask + " уровня, который выше вашего уровня предупреждения " + (string)SoundWhenPriceGoesAbove);
      ObjectDelete("SoundWhenPriceGoesAbove");
      SoundWhenPriceGoesAbove = 0;
      return 1;
   }
   if ((Bid < SoundWhenPriceGoesBelow) && (SoundWhenPriceGoesBelow > 0))
   {
      Alert(Symbol() + "пробила уровень НИЖЕ" + (string)SoundWhenPriceGoesBelow);
      PlaySound("alert.wav");
      SendMail("Цена- " + Symbol() +  " пробила уровень НИЖЕ  " + (string)Bid, "Цена " + Symbol() +  " достигла " + (string)Bid + " уровня, который ниже вашего уровня предупреждения" + (string)SoundWhenPriceGoesBelow);
      ObjectDelete("SoundWhenPriceGoesBelow");
      SoundWhenPriceGoesBelow = 0;
      return 2;
   }
   if ((Bid == SoundWhenPriceIsExactly) || (Ask == SoundWhenPriceIsExactly))
   {
      Alert("Price is exactly at the alert level.");
      PlaySound("alert.wav");
      SendMail("Цена " + Symbol() +  " точно на уровне предупреждения " + (string)Ask, "Цена " + Symbol() +  " достигла " + (string)Ask + "/" + (string)Bid + " уровень, который является именно вашим уровнем предупреждения " + (string)SoundWhenPriceIsExactly);
      ObjectDelete("SoundWhenPriceIsExactly");
      SoundWhenPriceIsExactly = 0;
      return 3;
   }
return 0;
}

//+------------------------------------------------------------------+
//|                                                   PanelAlert.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#include <GraphicsObject/CreateOject.mqh>
#include <NotificationInduc/IndStreet.mqh>
bool firstNotifHight = 0,firstNotifDown=0,firstNotifLevel=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---


      if (id == CHARTEVENT_CLICK || CHARTEVENT_MOUSE_MOVE) { 
//цена выше         
         RectLabelCreate(0,"RectLabel",0, 0,0,74,280,C'236,233,216',BORDER_FLAT,CORNER_LEFT_UPPER,clrRed,STYLE_SOLID,1,false,true,true,0); 
         LabelCreate(0,"LabelPriceHight",0,4,25,CORNER_LEFT_UPPER,"Цена выше:","Tahoma",9,clrRed,0.0,ANCHOR_LEFT_UPPER,false,false,true,0);
         EditCreate(0,"EditPriceHight",0,4,85,70,18,"","Arial",10,ALIGN_CENTER,false,CORNER_LEFT_UPPER,clrBlack,clrWhite,clrNONE,false,false,true);//EditCreate(0,0,0,X,Y,W,H);
         ButtonCreate(0,"btnAlertPriceHight",0,2,2,70,25,CORNER_LEFT_UPPER,"alert","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0);     
        // ButtonCreate(0,"btnEmailPriceHight",0,2,2,20,25,CORNER_LEFT_UPPER,"@","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0);      
         ButtonCreate(0,"btnLinePriceHight",0,2,2,25,25,CORNER_LEFT_UPPER,"--","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0); 
         ButtonCreate(0,"btnClrPriceHight",0,2,2,23,25,CORNER_LEFT_UPPER,"[..]","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0); 
         ButtonCreate(0,"btnGetPriceHight",0,2,2,20,25,CORNER_LEFT_UPPER,"[$]","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0);        
         
         int x = (int)ObjectGetInteger(0,"RectLabel",OBJPROP_XDISTANCE); 
         int y = (int)ObjectGetInteger(0,"RectLabel",OBJPROP_YDISTANCE); 
         
       
        
         ObjectSetInteger(0,"LabelPriceHight",OBJPROP_XDISTANCE, x + 5); 
         ObjectSetInteger(0,"LabelPriceHight",OBJPROP_YDISTANCE, y + 2);       
         
         ObjectSetInteger(0,"EditPriceHight",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"EditPriceHight",OBJPROP_YDISTANCE, y + 20); 
         
         
         ObjectSetInteger(0,"btnAlertPriceHight",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"btnAlertPriceHight",OBJPROP_YDISTANCE, y + 40);

      //   ObjectSetInteger(0,"btnEmailPriceHight",OBJPROP_XDISTANCE, x + 52); 
      //   ObjectSetInteger(0,"btnEmailPriceHight",OBJPROP_YDISTANCE, y + 40);
                       
         ObjectSetInteger(0,"btnLinePriceHight",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"btnLinePriceHight",OBJPROP_YDISTANCE, y + 65);       
         ObjectSetInteger(0,"btnClrPriceHight",OBJPROP_XDISTANCE, x + 28); 
         ObjectSetInteger(0,"btnClrPriceHight",OBJPROP_YDISTANCE, y + 65);         
         ObjectSetInteger(0,"btnGetPriceHight",OBJPROP_XDISTANCE, x + 52); 
         ObjectSetInteger(0,"btnGetPriceHight",OBJPROP_YDISTANCE, y + 65);  
         
//цена ниже
         LabelCreate(0,"LabelPriceDown",0,4,25,CORNER_LEFT_UPPER,"Цена ниже:","Tahoma",9,clrRed,0.0,ANCHOR_LEFT_UPPER,false,false,true,0);
         EditCreate(0,"EditPriceDown",0,4,85,70,18,"","Arial",10,ALIGN_CENTER,false,CORNER_LEFT_UPPER,clrBlack,clrWhite,clrNONE,false,false,true);//EditCreate(0,0,0,X,Y,W,H);
         ButtonCreate(0,"btnAlertPriceDown",0,2,2,70,25,CORNER_LEFT_UPPER,"alert","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0);     
        // ButtonCreate(0,"btnEmailPriceDown",0,2,2,20,25,CORNER_LEFT_UPPER,"@","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0);      
         ButtonCreate(0,"btnLinePriceDown",0,2,2,25,25,CORNER_LEFT_UPPER,"--","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0); 
         ButtonCreate(0,"btnClrPriceDown",0,2,2,23,25,CORNER_LEFT_UPPER,"[..]","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0); 
         ButtonCreate(0,"btnGetPriceDown",0,2,2,20,25,CORNER_LEFT_UPPER,"[$]","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0);        


         ObjectSetInteger(0,"LabelPriceDown",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"LabelPriceDown",OBJPROP_YDISTANCE, y + 90);       
         
         ObjectSetInteger(0,"EditPriceDown",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"EditPriceDown",OBJPROP_YDISTANCE, y + 105); 
         
         
         ObjectSetInteger(0,"btnAlertPriceDown",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"btnAlertPriceDown",OBJPROP_YDISTANCE, y + 125);

       //  ObjectSetInteger(0,"btnEmailPriceDown",OBJPROP_XDISTANCE, x + 52); 
       //  ObjectSetInteger(0,"btnEmailPriceDown",OBJPROP_YDISTANCE, y + 125);
                       
         ObjectSetInteger(0,"btnLinePriceDown",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"btnLinePriceDown",OBJPROP_YDISTANCE, y + 150);   
             
         ObjectSetInteger(0,"btnClrPriceDown",OBJPROP_XDISTANCE, x + 28); 
         ObjectSetInteger(0,"btnClrPriceDown",OBJPROP_YDISTANCE, y + 150);
                  
         ObjectSetInteger(0,"btnGetPriceDown",OBJPROP_XDISTANCE, x + 52); 
         ObjectSetInteger(0,"btnGetPriceDown",OBJPROP_YDISTANCE, y + 150);  


//цена на уровне

         LabelCreate(0,"LabelPriceLevel",0,4,175,CORNER_LEFT_UPPER,"Цена level:","Tahoma",9,clrRed,0.0,ANCHOR_LEFT_UPPER,false,false,true,0);
         EditCreate(0,"EditPriceLevel",0,4,85,70,18,"","Arial",10,ALIGN_CENTER,false,CORNER_LEFT_UPPER,clrBlack,clrWhite,clrNONE,false,false,true);//EditCreate(0,0,0,X,Y,W,H);
         ButtonCreate(0,"btnAlertPriceLevel",0,2,2,70,25,CORNER_LEFT_UPPER,"alert","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0);     
        // ButtonCreate(0,"btnEmailPriceLevel",0,2,2,20,25,CORNER_LEFT_UPPER,"@","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0);      
         ButtonCreate(0,"btnLinePriceLevel",0,2,2,48,25,CORNER_LEFT_UPPER,"--","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0); 
         ButtonCreate(0,"btnClrPriceLevel",0,2,2,20,25,CORNER_LEFT_UPPER,"[..]","Tahoma",9,clrBlack,clrAliceBlue,clrNONE,false,false,false,true,0); 
         
         ObjectSetInteger(0,"LabelPriceLevel",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"LabelPriceLevel",OBJPROP_YDISTANCE, y + 175);       
         
         ObjectSetInteger(0,"EditPriceLevel",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"EditPriceLevel",OBJPROP_YDISTANCE, y + 190); 
         
         
         ObjectSetInteger(0,"btnAlertPriceLevel",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"btnAlertPriceLevel",OBJPROP_YDISTANCE, y + 210);

       //  ObjectSetInteger(0,"btnEmailPriceLevel",OBJPROP_XDISTANCE, x + 52); 
       //  ObjectSetInteger(0,"btnEmailPriceLevel",OBJPROP_YDISTANCE, y + 125);
                       
         ObjectSetInteger(0,"btnLinePriceLevel",OBJPROP_XDISTANCE, x + 2); 
         ObjectSetInteger(0,"btnLinePriceLevel",OBJPROP_YDISTANCE, y + 235);   
             
                 
         ObjectSetInteger(0,"btnClrPriceLevel",OBJPROP_XDISTANCE, x + 52); 
         ObjectSetInteger(0,"btnClrPriceLevel",OBJPROP_YDISTANCE, y + 235);  

 
      }  
      
      if (ObjectGetInteger(0,"btnLinePriceHight", OBJPROP_STATE) == true) { // если нажата кнопка --
         HLineCreate(0,"LineStartHight",0,(double)ObjectGetString(0,"EditPriceHight",OBJPROP_TEXT),clrGreen,STYLE_SOLID,2,false,false,true,0);
       }else { // если отжата кнопка --
         ObjectDelete(0,"LineStartHight");
       }       
       
//line down     
       if (ObjectGetInteger(0,"btnLinePriceDown", OBJPROP_STATE) == true) { // если нажата кнопка --
         HLineCreate(0,"LineStartDown",0,(double)ObjectGetString(0,"EditPriceDown",OBJPROP_TEXT),clrRed,STYLE_SOLID,2,false,false,true,0);
       }else { // если отжата кнопка --
         ObjectDelete(0,"LineStartDown");
       }    
//line level 
       if (ObjectGetInteger(0,"btnLinePriceLevel", OBJPROP_STATE) == true) { // если нажата кнопка --
         HLineCreate(0,"LineStartLevel",0,(double)ObjectGetString(0,"EditPriceLevel",OBJPROP_TEXT),clrBlue,STYLE_SOLID,3,false,false,true,0);
       }else { // если отжата кнопка --
         ObjectDelete(0,"LineStartLevel");
       }    
       
       
// если нажата кнопка получить цену Hight      
       if (ObjectGetInteger(0,"btnGetPriceHight", OBJPROP_STATE) == true) { 
            ObjectSetString(0,"EditPriceHight",OBJPROP_TEXT,(string)Ask);
       }      
// если нажата кнопка получить цену Down
       if (ObjectGetInteger(0,"btnGetPriceDown", OBJPROP_STATE) == true) { 
            ObjectSetString(0,"EditPriceDown",OBJPROP_TEXT,(string)Bid);
       } 

       
// если нажата кнопка clr(...) Hight  
       if (ObjectGetInteger(0,"btnClrPriceHight", OBJPROP_STATE) == true) { // если нажата кнопка ..
            ObjectSetString(0,"EditPriceHight",OBJPROP_TEXT,"");
            ObjectSetInteger(0,"btnClrPriceHight",OBJPROP_STATE,false); //--- переведем кнопку в заданное состояние 
       }         
// если нажата кнопка clr(...) Down        
       if (ObjectGetInteger(0,"btnClrPriceDown", OBJPROP_STATE) == true) { // если нажата кнопка ..
            ObjectSetString(0,"EditPriceDown",OBJPROP_TEXT,"");
            ObjectSetInteger(0,"btnClrPriceDown",OBJPROP_STATE,false); //--- переведем кнопку в заданное состояние 
       }
// если нажата кнопка clr(...)level       
       if (ObjectGetInteger(0,"btnClrPriceLevel", OBJPROP_STATE) == true) { // если нажата кнопка ..
            ObjectSetString(0,"EditPriceLevel",OBJPROP_TEXT,"");
            ObjectSetInteger(0,"btnClrPriceLevel",OBJPROP_STATE,false); //--- переведем кнопку в заданное состояние 
       }


if (ObjectGetInteger(0,"btnAlertPriceHight", OBJPROP_STATE) == true) {
   if (alertingLelev((double)ObjectGetString(0,"EditPriceHight",OBJPROP_TEXT),(double)ObjectGetString(0,"EditPriceDown",OBJPROP_TEXT),(double)ObjectGetString(0,"EditPriceLevel",OBJPROP_TEXT)) == 1 && firstNotifHight == 0){
      firstNotifHight = 1;
     Sleep(1000);
     ObjectSetInteger(0,"btnAlertPriceHight",OBJPROP_STATE,false); //--- переведем кнопку в заданное состояние 
     
   }
} 
if (ObjectGetInteger(0,"btnAlertPriceDown", OBJPROP_STATE) == true) {
   if (alertingLelev((double)ObjectGetString(0,"EditPriceHight",OBJPROP_TEXT),(double)ObjectGetString(0,"EditPriceDown",OBJPROP_TEXT),(double)ObjectGetString(0,"EditPriceLevel",OBJPROP_TEXT)) == 2 && firstNotifDown == 0){
     firstNotifDown = 1;
     Sleep(1000);
     ObjectSetInteger(0,"btnAlertPriceDown",OBJPROP_STATE,false); //--- переведем кнопку в заданное состояние 
     
   }
} ;
if (ObjectGetInteger(0,"btnAlertPriceLevel", OBJPROP_STATE) == true) {
   if (alertingLelev((double)ObjectGetString(0,"EditPriceHight",OBJPROP_TEXT),(double)ObjectGetString(0,"EditPriceDown",OBJPROP_TEXT),(double)ObjectGetString(0,"EditPriceLevel",OBJPROP_TEXT)) == 3 && firstNotifLevel == 0){
     
     Sleep(1000);
     ObjectSetInteger(0,"btnAlertPriceLevel",OBJPROP_STATE,false); //--- переведем кнопку в заданное состояние 
   }
} 
        ChartRedraw(); 
         
}
//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete(0,"RectLabel");
   ObjectDelete(0,"EditPriceHight"); 
   ObjectDelete(0,"LabelPriceHight"); 
   ObjectDelete(0,"btnLinePriceHight");
   ObjectDelete(0,"btnClrPriceHight");
   ObjectDelete(0,"btnGetPriceHight");
   ObjectDelete(0,"btnAlertPriceHight");


   ObjectDelete(0,"EditPriceDown"); 
   ObjectDelete(0,"LabelPriceDown"); 
   ObjectDelete(0,"btnLinePriceDown");
   ObjectDelete(0,"btnClrPriceDown");
   ObjectDelete(0,"btnGetPriceDown");
   ObjectDelete(0,"btnAlertPriceDown");
   
   ObjectDelete(0,"EditPriceLevel"); 
   ObjectDelete(0,"LabelPriceLevel"); 
   ObjectDelete(0,"btnLinePriceLevel");
   ObjectDelete(0,"btnClrPriceLevel");
   ObjectDelete(0,"btnGetPriceLevel");
   ObjectDelete(0,"btnAlertPriceLevel");
     
   
  // ObjectDelete(0,"btnEmailPriceDown");  
  }

Окно : Так выглядит форма
Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
Выберите подходящую торговую стратегию и оформите подписку на нее в пару кликов. Все Сигналы сопровождаются подробной статистикой и графиками. Станьте Поставщиком торговых сигналов и продавайте подписку тысячам трейдеров по всему миру. Наш сервис позволит вам хорошо зарабатывать на прибыльной стратегии даже при небольшом стартовом капитале...
 
 
operlay:

1- Как можно сделать чтобы указанная цена не сбрасывалась в editbox при смене таймфрема?

2- Как можно настроить работу уведомления 1 раз, вроде все сделал правильно, даже создал уже глобальную переменную, там ее обнулил. В условии проверки на 1-о уведомление срабатывает хорошо. А как теперь сделать чтобы не приходилось заново таскать сову, или при каком событии правильнее обнулять значения переменной bool? Я вешал в else после событии отжатия кнопки (в проверки на false), но происходит  снова зациклинивание событий и уведомление начинают приходить не 1 раз а больше.

Исходники Советника ниже после include. mql4 .

CreateOject.mqh - тут функции из help по созданию графических объектов

IndStreet.mqh>  тут функция-


Окно : 

Нашел ответ: 1- используйте глобальные переменные. + Обратите внимание на REASON.

2- Уведомление работает.

Во вложении файл, может будет полезным.

в Mql новичок, поэтому сильно опираться на мой код не стоит, очень многое можно было вывести в функции или даже в ООП.

Файлы:
PanelAlert.zip  40 kb
 
самый простой вариант это даже не те глобальные переменные которые GlobalVariable, а просто объявление переменной до инициализации перед функцией OnInit, и ей будет пофиг на переинициализацию, главное следить чтоб при переинициализации эта переменная не обнулялась, смена тф - переинициализация, изменение входных настроек советника - переинициализация, открыли/закрыли терминал - переинициализация
 
Aleksey Semenov #:
самый простой вариант это даже не те глобальные переменные которые GlobalVariable, а просто объявление переменной до инициализации перед функцией OnInit, и ей будет пофиг на переинициализацию, главное следить чтоб при переинициализации эта переменная не обнулялась, смена тф - переинициализация, изменение входных настроек советника - переинициализация, открыли/закрыли терминал - переинициализация
Спасибо. Помогли в настройке советника при смене графика. Теперь при смене графика сбрасываю все значения, которые до OnInit() и робот сам себя заново настраивает, проходя снова по OnInit()