Что-то не так с циклом? - страница 2

 
можно еще так
int OnInit()
  {
   string Objectname=NULL;
   for(int x=0;x<9;x++)
     {
      for(int y=0;y<3;y++)
        {
         StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
         ObjectCreate(0,Objectname,OBJ_LABEL,0,0,0,0,0);
         // создаем очередную метку. Обратите внимание, что название метки
         // создается "на лету" и зависит от счетчиков "x" и "y"
         ObjectSetString(0,Objectname,OBJPROP_FONT,"Wingdings");
         // меняем шрифт на Wingdingsб чтобы получить доступ к символам
         ObjectSetInteger(0,Objectname,OBJPROP_COLOR,Blue);
         // меняем цвет на синий
         ObjectSetString(0,Objectname,OBJPROP_TEXT,CharToString(110));
         //делаем квадратики
         ObjectSetInteger(0,Objectname,OBJPROP_XDISTANCE,x*20);
         // изменяем координату Х.
         // x*20 - каждая метка создается с интервалом в 20 пикселей по
         // горизонтали и напрямую зависит от счетчика "x"
         ObjectSetInteger(0,Objectname,OBJPROP_YDISTANCE,y*20);
         // изменяем координату Y.
         // y*20 - каждая метка создается с интервалом в 20 пикселей по
         // вертикали и напрямую зависит от счетчика "y"
        }
     }
   return(INIT_SUCCEEDED);
,,,
 
Эдуард Климуш:

А вы не могли бы подсказать, каким образом можно записать следующее условие на iRSI:

По текущему бару мы не смотрим, смотрим по последнему закрытому (чтобы сигнал был четким, не прыгал туда сюда)

Если RSI на баре, который шел перед последним закрытым (как я понимаю, его порядковый номер будет 2), меньше 20, а RSI на баре, который закрылся (как я понимаю, его порядковый номер будет 1), больше 20 (выход из зоны перепроданности), то квадратик окрашивается зеленым

Если речь о MQL4, то так:

  if(iRSI(_Symbol, 0, 14, PRICE_CLOSE, 2) < 20 && iRSI(_Symbol, 0, 14, PRICE_CLOSE, 1) > 20)
  {
    // меняем цвет
  }
 
Vasiliy Pushkaryov:

Если речь о MQL4, то так:

  if(iRSI(_Symbol, 0, 14, PRICE_CLOSE, 2) < 20 && iRSI(_Symbol, 0, 14, PRICE_CLOSE, 1) > 20)
  {
    // меняем цвет
  }
в mql5 нет в iRSI такого параметра как  Индекс получаемого значения из индикаторного буфера, что ж делать?...
 
Эдуард Климуш:
в mql5 нет в iRSI такого параметра как  Индекс получаемого значения из индикаторного буфера, что ж делать?...
CopyBuffer()
 
Эдуард Климуш:
в mql5 нет в iRSI такого параметра как  Индекс получаемого значения из индикаторного буфера, что ж делать?...

Да, тут немного по другому. Вначале создается хэндл индикатора для работы, обычно в OnInit()

  handleRSI_M5 = iRSI(_Symbol, 0, 14, PRICE_WEIGHTED);
  if(handleRSI_M5 < 0)
  {
    Print("Объект iRSI не создан: handleRSI_M5= ",INVALID_HANDLE);
    Print("Ошибка исполнения = ",GetLastError());
    return(INIT_FAILED);
  }

Предварительно нужен массив для значений индикатора, потом используете функцию CopyBuffer(), для того чтобы поместить три значения в этот массив. Три значения - это значения для 0-го, 1-го, 2-го баров. Потом работаете с эти массивом.

Только не забудьте еще задать направление таймсерии.

 
Vasiliy Pushkaryov:

Да, тут немного по другому. Вначале создается хэндл индикатора для работы, обычно в OnInit()

  handleRSI_M5 = iRSI(_Symbol, 0, 14, PRICE_WEIGHTED);
  if(handleRSI_M5 < 0)
  {
    Print("Объект iRSI не создан: handleRSI_M5= ",INVALID_HANDLE);
    Print("Ошибка исполнения = ",GetLastError());
    return(INIT_FAILED);
  }

Предварительно нужен массив для значений индикатора, потом используете функцию CopyBuffer(), для того чтобы поместить три значения в этот массив. Три значения - это значения для 0-го, 1-го, 2-го баров. Потом работаете с эти массивом.

Только не забудьте еще задать направление таймсерии.

А если нам необходимо получать по всем таймфреймам сигналы, нам, получается, нужно создавать для каждого таймфрейма отдельный хэндл?
 
Эдуард Климуш:
А если нам необходимо получать по всем таймфреймам сигналы, нам, получается, нужно создавать для каждого таймфрейма отдельный хэндл?
да для каждого тф свой хендл индикатора
 
Sergey Gritsay:
да для каждого тф свой хендл индикатора
а можно ли с помощью массива каким-то образом задать хендл индикатора для каждого таймфрейма?
 
Эдуард Климуш:
а можно ли с помощью массива каким-то образом задать хендл индикатора для каждого таймфрейма?
вот набросал вам примерчик.
//+------------------------------------------------------------------+
//|                                                    test_graf.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"

input int                  RSI_period       = 14;
input ENUM_APPLIED_PRICE   RSI_applied_price= PRICE_CLOSE;
input int                  RSI_shift        = 0;
input int                  RSI_UPlevel      = 70;
input int                  RSI_DOWNlevel    = 30;

string Objectname=NULL;
int ind_handle[3][9];// здесь храним хендл индикатора
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   for(int y=0;y<3;y++)
     {
      for(int x=0;x<9;x++)
        {
         ind_handle[y][x]=INVALID_HANDLE;
         if(y==0)ind_handle[y][x]=iRSI(_Symbol,tf(x),RSI_period,RSI_applied_price);// создадим хендл индикатора
         StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
         if(ObjectFind(0,Objectname)<0)//если объект не существует создадим его
            ObjectCreate(0,Objectname,OBJ_LABEL,0,0,0,0,0);
         // создаем очередную метку. Обратите внимание, что название метки
         // создается "на лету" и зависит от счетчиков "x" и "y"
         ObjectSetString(0,Objectname,OBJPROP_FONT,"Wingdings");
         // меняем шрифт на Wingdingsб чтобы получить доступ к символам
         ObjectSetInteger(0,Objectname,OBJPROP_COLOR,clrGreen);
         // меняем цвет на синий
         ObjectSetString(0,Objectname,OBJPROP_TEXT,CharToString(110));
         //делаем квадратики
         ObjectSetInteger(0,Objectname,OBJPROP_XDISTANCE,x*20);
         // изменяем координату Х.
         // x*20 - каждая метка создается с интервалом в 20 пикселей по
         // горизонтали и напрямую зависит от счетчика "x"
         ObjectSetInteger(0,Objectname,OBJPROP_YDISTANCE,y*20);
         // изменяем координату Y.
         // y*20 - каждая метка создается с интервалом в 20 пикселей по
         // вертикали и напрямую зависит от счетчика "y"
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   for(int y=0;y<3;y++)
     {
      for(int x=0;x<9;x++)
        {
         StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
         if(ObjectFind(0,Objectname)>=0)//если объект существует удалим его
            ObjectDelete(0,Objectname);
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int y=0;y<3;y++)
     {
      for(int x=0;x<9;x++)
        {
         StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
         if(ObjectFind(0,Objectname)>=0)//если объект существует изменим его свойства
           {
            if(y==0)ObjectSetInteger(0,Objectname,OBJPROP_COLOR,rsi(ind_handle[y][x],tf(x)));
           }
        }
     }
  }
//+------------------------------------------------------------------+
// функция возвращает период таймфрейма в зависимости от индекса
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES tf(int index)
  {
   switch(index)
     {
      case 0:return(PERIOD_M1);
      case 1:return(PERIOD_M5);
      case 2:return(PERIOD_M15);
      case 3:return(PERIOD_M30);
      case 4:return(PERIOD_H1);
      case 5:return(PERIOD_H4);
      case 6:return(PERIOD_D1);
      case 7:return(PERIOD_W1);
      case 8:return(PERIOD_MN1);
     }
   return(PERIOD_CURRENT);
  }
//+------------------------------------------------------------------+
// функция возвращает цвет согласно сигналу индикатора RSI
//+------------------------------------------------------------------+
color rsi(int handle,ENUM_TIMEFRAMES timeframes)
  {
   double buffer[];
   if(handle==INVALID_HANDLE || handle==0)
     {
      handle=iRSI(_Symbol,timeframes,RSI_period,RSI_applied_price);
      return(clrGreen);
     }
   else
     {
      if(CopyBuffer(handle,0,RSI_shift,2,buffer)<2) return(clrGreen);
      if(!ArraySetAsSeries(buffer,true)) return(clrGreen);
      if(buffer[0]>=RSI_DOWNlevel && buffer[1]<=RSI_DOWNlevel)return(clrBlue);
      if(buffer[0]<=RSI_UPlevel && buffer[1]>=RSI_UPlevel)return(clrRed);
     }
   return(clrGreen);
  }
//+------------------------------------------------------------------+
...
 
Sergey Gritsay:
вот набросал вам примерчик.
//+------------------------------------------------------------------+
//|                                                    test_graf.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"

input int                  RSI_period       = 14;
input ENUM_APPLIED_PRICE   RSI_applied_price= PRICE_CLOSE;
input int                  RSI_shift        = 0;
input int                  RSI_UPlevel      = 70;
input int                  RSI_DOWNlevel    = 30;

string Objectname=NULL;
int ind_handle[3][9];// здесь храним хендл индикатора
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   for(int y=0;y<3;y++)
     {
      for(int x=0;x<9;x++)
        {
         ind_handle[y][x]=INVALID_HANDLE;
         if(y==0)ind_handle[y][x]=iRSI(_Symbol,tf(x),RSI_period,RSI_applied_price);// создадим хендл индикатора
         StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
         if(ObjectFind(0,Objectname)<0)//если объект не существует создадим его
            ObjectCreate(0,Objectname,OBJ_LABEL,0,0,0,0,0);
         // создаем очередную метку. Обратите внимание, что название метки
         // создается "на лету" и зависит от счетчиков "x" и "y"
         ObjectSetString(0,Objectname,OBJPROP_FONT,"Wingdings");
         // меняем шрифт на Wingdingsб чтобы получить доступ к символам
         ObjectSetInteger(0,Objectname,OBJPROP_COLOR,clrGreen);
         // меняем цвет на синий
         ObjectSetString(0,Objectname,OBJPROP_TEXT,CharToString(110));
         //делаем квадратики
         ObjectSetInteger(0,Objectname,OBJPROP_XDISTANCE,x*20);
         // изменяем координату Х.
         // x*20 - каждая метка создается с интервалом в 20 пикселей по
         // горизонтали и напрямую зависит от счетчика "x"
         ObjectSetInteger(0,Objectname,OBJPROP_YDISTANCE,y*20);
         // изменяем координату Y.
         // y*20 - каждая метка создается с интервалом в 20 пикселей по
         // вертикали и напрямую зависит от счетчика "y"
        }
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   for(int y=0;y<3;y++)
     {
      for(int x=0;x<9;x++)
        {
         StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
         if(ObjectFind(0,Objectname)>=0)//если объект существует удалим его
            ObjectDelete(0,Objectname);
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int y=0;y<3;y++)
     {
      for(int x=0;x<9;x++)
        {
         StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
         if(ObjectFind(0,Objectname)>=0)//если объект существует изменим его свойства
           {
            if(y==0)ObjectSetInteger(0,Objectname,OBJPROP_COLOR,rsi(ind_handle[y][x],tf(x)));
           }
        }
     }
  }
//+------------------------------------------------------------------+
// функция возвращает период таймфрейма в зависимости от индекса
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES tf(int index)
  {
   switch(index)
     {
      case 0:return(PERIOD_M1);
      case 1:return(PERIOD_M5);
      case 2:return(PERIOD_M15);
      case 3:return(PERIOD_M30);
      case 4:return(PERIOD_H1);
      case 5:return(PERIOD_H4);
      case 6:return(PERIOD_D1);
      case 7:return(PERIOD_W1);
      case 8:return(PERIOD_MN1);
     }
   return(PERIOD_CURRENT);
  }
//+------------------------------------------------------------------+
// функция возвращает цвет согласно сигналу индикатора RSI
//+------------------------------------------------------------------+
color rsi(int handle,ENUM_TIMEFRAMES timeframes)
  {
   double buffer[];
   if(handle==INVALID_HANDLE || handle==0)
     {
      handle=iRSI(_Symbol,timeframes,RSI_period,RSI_applied_price);
      return(clrGreen);
     }
   else
     {
      if(CopyBuffer(handle,0,RSI_shift,2,buffer)<2) return(clrGreen);
      if(!ArraySetAsSeries(buffer,true)) return(clrGreen);
      if(buffer[0]>=RSI_DOWNlevel && buffer[1]<=RSI_DOWNlevel)return(clrBlue);
      if(buffer[0]<=RSI_UPlevel && buffer[1]>=RSI_UPlevel)return(clrRed);
     }
   return(clrGreen);
  }
//+------------------------------------------------------------------+
...

Вообще потрясает ваш ход мысли! Если вы при каждом чихе проверяете хэндл, и если что, загружаете индикатор, то зачем в начале загружать индикатор?

Надо только в ините загружать индикаторы.  

Причина обращения: