Как добавить 3-е условие по нажатие на клавишу с клавиатуры?

 

Здравствуйте, сейчас при нажатии на клавишу клавиатуры показывается число, при 2-м нажатии оно удаляется
Как сделать так чтобы было 3-е значение????
т.е при одном нажатии показывается первое число, при втором нажатии показывается 2-е число, при 3-м нажатии все убирается(удаляется)

//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam  // параметр события типа string 
                  )
  {
//--- нажатие кнопки на клавиатуре 
   if(id==CHARTEVENT_KEYDOWN && lparam==40)
     {
//--- тут 2 условия, показ и удаление
      if(ObjectFind(0,"utock")>=0)
        {
         ObjectDelete(0,"utock");
        }
      else
        {
         PutLabel(atr);
        }
//--- тут 2 условия
     }   
  }
 
utock:

Здравствуйте, сейчас при нажатии на клавишу клавиатуры показывается число, при 2-м нажатии оно удаляется
Как сделать так чтобы было 3-е значение????
т.е при одном нажатии показывается первое число, при втором нажатии показывается 2-е число, при 3-м нажатии все убирается(удаляется)

Вот пример, доработаете под свои нужды. Нажимать Ctrl

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

int res = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(100);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
   EventKillTimer();
   Comment("");   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
   Comment(res);
   
}
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id == CHARTEVENT_KEYDOWN && lparam == 17)
   { 
      if(res == 0)res = 1;
      else
      if(res == 1)res = 2;
      else
      if(res == 2)res = 0;
   }  
}
//+------------------------------------------------------------------+
 
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   static int click=0;
   if(id==CHARTEVENT_KEYDOWN && lparam==17)
     {
     click = (click)%3+1;
      switch(click){
         case 0: Print("0!"); break; // не выполняется!!!!
         case 1: Print("1!"); break;
         case 2: Print("2!"); break;
         case 3: Print("3!"); break;
         case 4: Print("4!"); break; // не выполняется!!!!
         case 5: Print("5!"); break; // не выполняется!!!!
         case 6: Print("6!"); break; // не выполняется!!!!
         default: Print("Ошибка!!!");  click=0;
      }
     }
  }

можно и так, но проверить бы, вроде работает

Нажимать Ctrl

 
Igor Makanu:

можно и так, но проверить бы, вроде работает

Нажимать Ctrl

Sergey Kolemanov:

Вот пример, доработаете под свои нужды. Нажимать Ctrl

Спасибо большое, но в ваших примерах при смене ТФ счетчик сбивается, как заставить при смене ТФ знать что у нас уже включено?

 
utock:

Спасибо большое, но в ваших примерах при смене ТФ счетчик сбивается, как заставить при смене ТФ знать что у нас уже включено?

проверил, действительно в индикаторах не работает модификатор static и глобально описанные переменные сбрасываются в ноль, даже не помню где бы такое в справке было написано, вот 2 тестовых исходника:

индикатор:

//+------------------------------------------------------------------+
//|                                                    tst_click.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include <ChartObjects\ChartObjectsTxtControls.mqh>

CChartObjectLabel *TxtLabel;
static int click=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   TxtLabel=new CChartObjectLabel;
   TxtLabel.Create(0,"Ind_tst_click",0,100,20);
   TxtLabel.Color(clrRed);
   TxtLabel.FontSize(28);
   TxtLabel.Description(IntegerToString(click));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+ 
//| Custom indicator deinitialization function                       | 
//+------------------------------------------------------------------+ 
void OnDeinit(const int reason)
  {
   TxtLabel.Delete();
   delete TxtLabel;
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_KEYDOWN && lparam==17)
     {
     click++;// = (click)%3+1;
     TxtLabel.Description(IntegerToString(click));
     }
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

эксперт:

//+------------------------------------------------------------------+
//|                                                    tst_click.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict

#include <ChartObjects\ChartObjectsTxtControls.mqh>

CChartObjectLabel *TxtLabel;
static int click=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TxtLabel=new CChartObjectLabel;
   TxtLabel.Create(0,"EA_tst_click",0,300,20);
   TxtLabel.Color(clrYellow);
   TxtLabel.FontSize(28);
   TxtLabel.Description(IntegerToString(click));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   TxtLabel.Delete();
   delete TxtLabel;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_KEYDOWN && lparam==17)
     {
      click++;// = (click)%3+1;
      TxtLabel.Description(IntegerToString(click));
     }
  }
//+------------------------------------------------------------------+

в индикаторе не работает, в эксперте все корректно работает при переключении ТФ

 
Igor Makanu:

проверил, действительно в индикаторах не работает модификатор static и глобально описанные переменные сбрасываются в ноль, даже не помню где бы такое в справке было написано, вот 2 тестовых исходника:

индикатор:

эксперт:

в индикаторе не работает, в эксперте все корректно работает при переключении ТФ

В индикаторах прекрасно работают статические переменные.

Дело всё в том, что при смене таймфрейма создаётся совершенно новый экземпляр индикатора, а старый удаляется.

 
Artyom Trishkin:

В индикаторах прекрасно работают статические переменные.

Дело всё в том, что при смене таймфрейма создаётся совершенно новый экземпляр индикатора, а старый удаляется.

ну и как работают тогда статические переменные? - я проверил, исходники выше, не работает, запускаю и индикатор и эксперт на одном графике, эксперт все корректно отрабатывает при смене ТФ, а индикатор сбрасывает переменную  click

или речь идет о вызове индикаторов через iCustom()  ???

запустил и индикатор и эксперт, нажимаю 4 раза Ctrl:

переключил ТФ и нажал еще 4 раза Ctrl:

красным счетчик индикатора, желтым счетчик нажатий Ctrl в эксперте

 
Igor Makanu:

ну и как работают тогда статические переменные? - я проверил, исходники выше, не работает, запускаю и индикатор и эксперт на одном графике, эксперт все корректно отрабатывает при смене ТФ, а индикатор сбрасывает переменную  click

или речь идет о вызове индикаторов через iCustom()  ???

запустил и индикатор и эксперт, нажимаю 4 раза Ctrl:

переключил ТФ и нажал еще 4 раза Ctrl:

красным счетчик индикатора, желтым счетчик нажатий Ctrl в эксперте

Внимательнее)

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

Как добавить 3-е условие по нажатие на клавишу с клавиатуры?

Artyom Trishkin, 2018.11.04 19:01

В индикаторах прекрасно работают статические переменные.

Дело всё в том, что при смене таймфрейма создаётся совершенно новый экземпляр индикатора, а старый удаляется.


 
Vitaly Muzichenko:

Внимательнее)

чтобы мы без Вашего комментария делали бы ))))

в справке пока не вижу этих случаев:

https://docs.mql4.com/ru/basis/variables

https://docs.mql4.com/ru/basis/variables/static

https://docs.mql4.com/ru/basis/variables/variable_scope

https://docs.mql4.com/ru/basis/variables/initialization

Переменные - Основы языка - Справочник MQL4
Переменные - Основы языка - Справочник MQL4
  • docs.mql4.com
Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором. Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов...
 
Igor Makanu:

чтобы мы без Вашего комментария делали бы ))))

в справке пока не вижу этих случаев:

https://docs.mql4.com/ru/basis/variables

https://docs.mql4.com/ru/basis/variables/static

Справка правильно описывает статические переменные. И они и работают правильно в индикаторах в пределах одного экземпляра. При смене таймфрейма создаётся новый экземпляр индикатора со своими переменными. Старый удаляется.

 
Artyom Trishkin:

Справка правильно описывает статические переменные. И они и работают правильно в индикаторах в пределах одного экземпляра. При смене таймфрейма создаётся новый экземпляр индикатора со своими переменными. Старый удаляется.

это я уже слышал, где информация об этом случае? как и где в указанным мной ссылках упоминание об этом? где найти разъяснения этого случая?

в MQL5 так же работают в индикаторах глобально описанные переменные и переменные с модификатором static ?