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

 
Igor Nagorniuk #:

Понятно, что в вышеуказанную функцию). Главный вопрос, что вписывать. Вопрос, может ли эта функция быть "пустой"? 

Эта функция срабатывает с приходом новой котировки. То есть, на каждом тике. Подумайте. Посмотрите чужие коды простейших индикаторов.
 
Vitaly Murlenko #:
Эта функция срабатывает с приходом новой котировки. То есть, на каждом тике. Подумайте. Посмотрите чужие коды простейших индикаторов.

Уже подумал и переделал). Правда не рисует, однако ошибок и предупреждений нет

Вот оригинал (оригинал рабочий ).

//+------------------------------------------------------------------+
//|                                                        LeMan.mq4 |
//|                                         Copyright © 2009, LeMan. |
//|                                                 b-market@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, LeMan."
#property link      "b-market@mail.ru"
//----

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red
#property indicator_width1 3
#property indicator_width2 3
//----
extern int    N = 12;
//----
double OpenUp[];
double OpenDown[];
double StopUp[];
double StopDn[];
//+------------------------------------------------------------------+
int init() {
//----
   IndicatorDigits(Digits);
   IndicatorBuffers(4);
//----      
   SetIndexBuffer(0,OpenUp);
   SetIndexBuffer(1,OpenDown);
   SetIndexBuffer(2,StopUp);
   SetIndexBuffer(3,StopDn);
   
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,159);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,159);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
//----      
   return(0);
}
//+------------------------------------------------------------------+
int start() { 

   int i, limit, counted_bars = IndicatorCounted();      
   if(counted_bars > 0) counted_bars--;
   limit = iBars(NULL,0)-counted_bars;

   for (i = 0; i < limit; i++) {
      OpenUp[i] = 0;
      OpenDown[i] = 0;
      double hl1 = iLow(NULL,0,iHighest(NULL,0,MODE_LOW,N,i+1));
      double hl2 = iLow(NULL,0,iHighest(NULL,0,MODE_LOW,N,i+2));
      double lh1 = iHigh(NULL,0,iLowest(NULL,0,MODE_HIGH,N,i+1));
      double lh2 = iHigh(NULL,0,iLowest(NULL,0,MODE_HIGH,N,i+2));
      if (Low[i+2] <= lh2 && Low[i+1] > lh1) {
         OpenUp[i] = High[i+1]+Point;
      }
      if (High[i+2] >= hl2 && High[i+1] < hl1) {
         OpenDown[i] = Low[i+1]-Point;
      }
      StopUp[i] = iLow(NULL,0,iLowest(NULL,0,MODE_LOW,N,i+1));
      StopDn[i] = iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,N,i+1));
   } 
   
//----
   return(0);
}
//+------------------------------------------------------------------+

Вот, что получилось у меня

//+------------------------------------------------------------------+
//|                                                                  |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, LeMan."
#property link      "b-market@mail.ru"
#property description "Индикатор                                             "
#property description "                                                      "
#property description "                                                      "
#property description "                                                      "
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   4
#property indicator_type1   DRAW_ARROW
#property indicator_color1 clrGreen
#property indicator_width1 3
#property indicator_type2   DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_width2 3
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrGreen
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1 
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrDodgerBlue
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1 
// Внешняя переменная
input int N = 12;

// Объявление буфера
double OpenUp[];
double OpenDown[];
double StopUp[];
double StopDn[];

//+------------------------------------------------------------------+
//| Функция инициализации индикатора                                  |
//+------------------------------------------------------------------+
int OnInit()
{
        // 
  
   SetIndexBuffer(0, OpenUp, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_ARROW, 159);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
   SetIndexBuffer(1, OpenDown, INDICATOR_DATA);
   PlotIndexSetInteger(1, PLOT_ARROW, 159);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0);
   SetIndexBuffer(2,StopUp,INDICATOR_DATA);
   SetIndexBuffer(3,StopDn,INDICATOR_DATA);
      // 
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
   
   return(INIT_SUCCEEDED);
}

                     
//+------------------------------------------------------------------+
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 i, limit;
   
   //Настройка количества баров для расчета
   if (prev_calculated == 0)
      limit = rates_total - N;
   else
      limit = rates_total - prev_calculated;

   // Процесс расчета индикатора
   for (i = limit; i >= 0; i--)
   {
      OpenUp[i] = 0;
      OpenDown[i] = 0;
      double hl1 = iLow(NULL, 0, iHighest(NULL, 0, MODE_LOW, N, i + 1));
      double hl2 = iLow(NULL, 0, iHighest(NULL, 0, MODE_LOW, N, i + 2));
      double lh1 = iHigh(NULL, 0, iLowest(NULL, 0, MODE_HIGH, N, i + 1));
      double lh2 = iHigh(NULL, 0, iLowest(NULL, 0, MODE_HIGH, N, i + 2));

      if (low[i + 2] <= lh2 && low[i + 1] > lh1)
         OpenUp[i] = high[i + 1] + _Point;

      if (high[i + 2] >= hl2 && high[i + 1] < hl1)
         OpenDown[i] = low[i + 1] - _Point;

      StopUp[i] = iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, N, i + 1));
      StopDn[i] = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, N, i + 1));
   }
   
   return(rates_total);
}

Если не трудно, подскажите, почему не формируется линия?

 
Существует ли в mql4 возможность воспринимать клик мышки в качестве команды для к-л действия?
 
grezky #:
Существует ли в mql4 возможность воспринимать клик мышки в качестве команды для к-л действия?
События
  • CHARTEVENT_CLICK — cобытие щелчка мыши на графике;
  • CHARTEVENT_OBJECT_CLICK — событие щелчка мыши на графическом объекте, принадлежащем графику;
 
Igor Nagorniuk #:
Если не трудно, подскажите, почему не формируется линия?
   
Файлы:
LeMan.mq5  7 kb
 
Tretyakov Rostyslav #:
События
  • CHARTEVENT_CLICK — cобытие щелчка мыши на графике;
  • CHARTEVENT_OBJECT_CLICK — событие щелчка мыши на графическом объекте, принадлежащем графику;

Правильно ли я понимаю - 

void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam) // параметр события типа string 
  { 
//--- нажатие левой кнопкой мышки на графике 
   if(id==CHARTEVENT_CLICK) 
     { 
      Print("Координаты щелчка мышки на графике: x = ",lparam,"  y = ",dparam); 
     } 
//--- нажатие мышкой на графическом объекте 
   if(id==CHARTEVENT_OBJECT_CLICK) 
     { 
      Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'"); 
     } 
. . . 


здесь 'OnChartEvent()' это такая же функция как OnInit() или OnTimer()?
Т.е. внутри  OnTimer() {...} клик мышки проверить не получится?

 
Tretyakov Rostyslav #:
   

Спасибо большое, за помощь.

 
grezky #:

Правильно ли я понимаю - 


здесь 'OnChartEvent()' это такая же функция как OnInit() или OnTimer()?
Т.е. внутри  OnTimer() {...} клик мышки проверить не получится?

Да, такая же как и инициализация или таймер. А зачем проверять клик мыши внутри таймера?

Вот Вам Ваш же код. Вставьте его после блока деинициализации в советника.

// ===================== OnChartEvent() ============================================================
void OnChartEvent(const int id,         // идентификатор события   
  const long& lparam,   // параметр события типа long (Координата Х мыши)
  const double& dparam, // параметр события типа double (Координата Y мыши)
  const string& sparam){ // параметр события типа string (Имя объекта, по которому кликнули)
   
        //--- нажатие левой кнопкой мышки на графике 
  if(id==CHARTEVENT_CLICK){ 
                Print("Координаты щелчка мышки на графике: x = ",lparam,"  y = ",dparam); 
        } 
        //--- нажатие мышкой на графическом объекте 
        if(id==CHARTEVENT_OBJECT_CLICK){ 
                Print("Нажатие кнопки мышки на объекте с именем '"+sparam+"'"); 
        }
}

Теперь создайте объект "Прямоугольник"   и залейте его цветом. Теперь выделите его. Теперь откройте журнал экспертов и отслеживайте координаты X и Y. Наведите указатель мыши точно в центр прямоугольника. Сделайте клик и посмотрите на координаты в журнале. Теперь из этой же точки зажмите левую кнопку мыши и перетащите прямоугольник на новое место. Как только Вы отпустите левую кнопку мыши, в журнале появится запись но новых координатах. Заметьте, запись появится ПОСЛЕ того, как Вы отпустили левую кнопку мыши. И запись появляется мгновенно. Зачем тут может понадобиться таймер?

 
Vitaly Murlenko #:

Да, такая же как и инициализация или таймер. А зачем проверять клик мыши внутри таймера?

Вот Вам Ваш же код. Вставьте его после блока деинициализации в советника.

Теперь создайте объект "Прямоугольник"   и залейте его цветом. Теперь выделите его. Теперь откройте журнал экспертов и отслеживайте координаты X и Y. Наведите указатель мыши точно в центр прямоугольника. Сделайте клик и посмотрите на координаты в журнале. Теперь из этой же точки зажмите левую кнопку мыши и перетащите прямоугольник на новое место. Как только Вы отпустите левую кнопку мыши, в журнале появится запись но новых координатах. Заметьте, запись появится ПОСЛЕ того, как Вы отпустили левую кнопку мыши. И запись появляется мгновенно. Зачем тут может понадобиться таймер?

Написал индикатор, в котором есть один модуль для окна, когда оно активное (т.е. выделено), и другой модуль для окна, когда оно пассивное. 
Сейчас для того чтобы указать индикатору активное окно вручную мышкой перетаскиваю Label в левую часть окна (во всех других окнах в это время Label-ы других индикаторов находятся в правой части окон). Индикаторы разных окон взаимодействуют между собой. Хотелось бы просто кликнуть мышкой, сделав окно активным, и тем самым включить в индикаторе модуль для активного окна (остальные окна будут неактивными). 
В индикаторе обновление один раз в секунду, сделано в OnTimer(). 

По правде говоря я не знаю как работает OnTimer() - это как цикл типа 'for', из которого индикатор выходит только один раз в OnDeinit()?
Или происходит чередование  OnTimer() =>  OnChartEvent() =>  OnTimer() =>  OnChartEvent() => ... ?

 
grezky #:

...По правде говоря я не знаю как работает OnTimer() - это как цикл типа 'for', из которого индикатор выходит только один раз в OnDeinit()?
Или происходит чередование  OnTimer() =>  OnChartEvent() =>  OnTimer() =>  OnChartEvent() => ... ?

К посту прицеплен советник. Посмотрите на деле как работает таймер. Запустите его в режиме реалтайм, но сперва откройте журнал экспертов - он туда новости Вам напишет.

Файлы:
Timer_1.0.mq4  5 kb