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

 
voron_026:

Доброго времени суток Aleksey Vyazmikin  Я недавно занялся программированием. Потихоньку въезжаю в тему.

Попробовал таким образом сделать:

Рисуется первый прямоугольник. остальные не рисуются. Пока думаю как сделать. Благодарю вас за подсказки и что вы имеете ввиду под не типичным стилем?


Вы уверены, что один объект рисуется, а не много по одним и тем же координатам?

У вас точки константы 

datetime time0 = iTime(Symbol(),PERIOD_H4,0);
datetime time1 = iTime(Symbol(),PERIOD_H4,1);
double open0 = iOpen(Symbol(), PERIOD_H4,0);
double open1 = iOpen(Symbol(), PERIOD_H4,1);
double close1 = iClose(Symbol(), PERIOD_H4,1);
double high1 = iHigh(Symbol(), PERIOD_H4,1);
double low1 = iLow(Symbol(), PERIOD_H4,1);

Определяйте их либо в функции, либо сразу в коде при создании объекта...

Про типичность - функция вычисления у вас закручена и такое выражение if(!...) мало кто из начинающих использует по моим наблюдениям.

 

Здравствуйте!


Подскажите пожалуйста:

как можно вычислить положение одного индикатора(И-1), относительно построенного по нему(И-1) другого индикатора(И-2).


Например:

Положение RSI относительно Боллинджера.

 

Думал можно подставить данные вместо цены расчёта

 RSI = iRSI(Symbol(), TimeFrame, 14, PRICE_CLOSE, 1);
 BB  = iBands(Symbol(), TimeFrame, 34, 1, 0, RSI, MODE_UPPER, 1);
, но выдаёт ошибку.
 
Ras al Ghul:

Здравствуйте!


Подскажите пожалуйста:

как можно вычислить положение одного индикатора(И-1), относительно построенного по нему(И-1) другого индикатора(И-2).


Например:

Положение RSI относительно Боллинджера.

 

Думал можно подставить данные вместо цены расчёта

, но выдаёт ошибку.

Даже не ясно, как Вы построили бб по RSI, т.е. картинка ясно как сделано...


double  iBands( 
   string       symbol,           // имя символа 
   int          timeframe,        // таймфрейм 
   int          period,           // период 
   double       deviation,        // кол-во стандартных отклонений 
   int          bands_shift,      // сдвиг относительно цены 
   int          applied_price,    // тип цены 
   int          mode,             // индекс линии 
   int          shift             // сдвиг 
   );

тип цены у Вас не верный - надо делать через 

double  iBandsOnArray( 
   double       array[],          // массив 
   int          total,            // количество элементов 
   int          period,           // период 
   double       deviation,        // кол-во стандартных отклонений 
   int          bands_shift,      // сдвиг относительно цены 
   int          mode,             // индекс линии 
   int          shift             // сдвиг 
   );
 
Aleksey Vyazmikin:

Про типичность - функция вычисления у вас закручена и такое выражение if(!...) мало кто из начинающих использует по моим наблюдениям.


Я вас понял. Возможно у меня вырабатывается свой стиль. Мне нравится использовать оператор if(!...) в таком формате. А функцию вычисления я подсмотрел у другого человека, но мне понравилась такая логика

 
Aleksey Vyazmikin:

Даже не ясно, как Вы построили бб по RSI, т.е. картинка ясно как сделано...


тип цены у Вас не верный - надо делать через 

Благодарю за ответ!

Стало понятно в какую сторону мысли направить.


Картинка для наглядности стандартными инструментами МТ4 (По данным предыдущего/первого индикатора).


С массивами знаком только по java... и то мельком.

Как его создать и что именно туда нужно внести?

F1 в MetaEditor'е и Учебник MQL ясности не внесли... 

 
voron_026:

Я вас понял. Возможно у меня вырабатывается свой стиль. Мне нравится использовать оператор if(!...) в таком формате. А функцию вычисления я подсмотрел у другого человека, но мне понравилась такая логика


Видно, что человек Вы думающий глубоко - удачи!

 
Ras al Ghul:

Благодарю за ответ!

Стало понятно в какую сторону мысли направить.


Картинка для наглядности стандартными инструментами МТ4 (По данным предыдущего/первого индикатора).


С массивами знаком только по java... и то мельком.

Как его создать и что именно туда нужно внести?

F1 в MetaEditor'е и Учебник MQL ясности не внесли... 


Создать массив и через цикл (к примеру for) его заполнить значением индикатора. А потом уже использовать функцию iBandsOnArray().

 
Aleksey Vyazmikin:

Создать массив и через цикл (к примеру for) его заполнить значением индикатора. А потом уже использовать функцию iBandsOnArray().


Либо Ваш вариант очень сложный, либо я не понял о каком значении Вы говорите...


double Array[], BB;  


Array[1] = iRSI(Symbol(),TimeFrame,14,PRICE_CLOSE,1);
BB = iBandsOnArray(Array[1],0,34,1,0,MODE_UPPER,1);

В моём варианте ругается на выделенный кусок:

'Array' - array required.

Разве мы так не заносим значение индикатора в массив?


 
Aleksey Vyazmikin:

Вы уверены, что один объект рисуется, а не много по одним и тем же координатам?



Да, вы правы. Прямоугольники рисуются по одним координатам. Решил задачу следующим образом:

void OnTick()
{
Fun_New_Bar();

   if(UseDojiCandles = true && Doji() == 1 && New_Bar == true)
     {
      datetime time0 = iTime(Symbol(),TimeFrame,0);
      datetime time1 = iTime(Symbol(),TimeFrame,1);
      double open0 = iOpen(Symbol(), TimeFrame,0);
      double open1 = iOpen(Symbol(), TimeFrame,1);

      if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_RECTANGLE,0,time1,open1,time0,open0))
         {
         Print("Не удалось создать метку вверх");
         }
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_COLOR,clrRed);//--- установим цвет прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане 
         
         DojiCandle ++;
     }
   

   
   if(UseDojiCandles = true && Doji() == -1 && New_Bar == true)
     {
      datetime time0 = iTime(Symbol(),TimeFrame,0);
      datetime time1 = iTime(Symbol(),TimeFrame,1);
      double open0 = iOpen(Symbol(), TimeFrame,0);
      double open1 = iOpen(Symbol(), TimeFrame,1);
      
      if(!ObjectCreate(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJ_RECTANGLE,0,time1,open1,time0,open0))
         {
         Print("Не удалось создать метку вниз");
         }
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_COLOR,clrRed);//--- установим цвет прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
         ObjectSetInteger(ChartID(),"Doji_"+IntegerToString(DojiCandle),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане 

         DojiCandle ++;
     }
     

   
}
Добавил переменную TimeFrame, для быстрой смены расчетного таймфрейма
 
Ras al Ghul:

Либо Ваш вариант очень сложный, либо я не понял о каком значении Вы говорите...


В моём варианте ругается на выделенный кусок:

'Array' - array required.

Разве мы так не заносим значение индикатора в массив?


Array[1] = iRSI(Symbol(),TimeFrame,14,PRICE_CLOSE,1);
BB = iBandsOnArray(Array,0,34,1,0,MODE_UPPER,1);
Причина обращения: