Изучаем язык программирования MQL4

gravity

Местный знаток
опять 25
Индикатор изначально показывал линии аск и бид горизонтальными линиями OBJ_HLINE, пытался передлать под линии тренда OBJ_TREND.
Сначала была такая проблема, что линии перекашивались.

Screenshot_4.jpg

Задал OBJPROP_PRICE2 , проблема с перекосом исчезла, но появилась новая. Теперь, линии не перемещаются за ценой, а остаются на месте первой установки.

Screenshot_5.jpg
Код:
//+------------------------------------------------------------------+
//|                                                  Line_AskBid.mq4 |
//|                                          Copyright © 2011,Alen_T |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012,Alen_T"
#property link      "http://fxgeneral.com"
//Свойства линий можно менять при выделении на графике.
//При удалении линий - будут восстановлены с заданными параметрами
#property indicator_chart_window

extern color  Bidcolor = clrDeepSkyBlue; //Цвет линии
extern int    Bidstyle = 1;    //Стиль линии. Используется только при толщине линии 0 или 1.
//STYLE_SOLID      0 Сплошная линия
//STYLE_DASH       1 Штриховая линия
//STYLE_DOT        2 Пунктирная линия
//STYLE_DASHDOT    3 Штрих-пунктирная линия
//STYLE_DASHDOTDOT 4 Штрих-пунктирная линия с двойными точками
extern int    Bidwidth = 0;    //Толщина линии

extern bool   ShowAsk   = true; //Рисовать линию Ask
extern color  Askcolor = clrRed;  //Цвет линии
extern int    Askstyle = 0;    //Стиль линии. Используется только при толщине линии 0 или 1.
extern int    Askwidth = 1;    //Толщина линии

int init()
{
   return(0);
}

int deinit()
{
  ObjectDelete("line_Ask");
  ObjectDelete("line_Bid");
  return(0);
}

int start()
{
string name = "line_Bid";
   RefreshRates();
   if(ObjectFind(name) < 0) {
      ObjectCreate(name, OBJ_HLINE, 0, 0, Bid);
      ObjectSet(name, OBJPROP_COLOR, Bidcolor);
      ObjectSet(name, OBJPROP_STYLE, Bidstyle);
      ObjectSet(name, OBJPROP_WIDTH, Bidwidth);
   }
   ObjectSet(name, OBJPROP_PRICE1, Bid);
   if(!ShowAsk) return(0);
   name = "line_Ask";
   if(ObjectFind(name) < 0) {
      ObjectCreate(name, OBJ_HLINE, 0, 0, Ask);
      ObjectSet(name, OBJPROP_COLOR, Askcolor);
      ObjectSet(name, OBJPROP_STYLE, Askstyle);
      ObjectSet(name, OBJPROP_WIDTH, Askwidth);
   }
   ObjectSet(name, OBJPROP_PRICE1, Ask);
   return(0);

}
Код:
//+------------------------------------------------------------------+
//|                                                  Line_AskBid.mq4 |
//|                                          Copyright © 2011,Alen_T |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012,Alen_T"
#property link      "http://fxgeneral.com"
#property strict
//Свойства линий можно менять при выделении на графике.
//При удалении линий - будут восстановлены с заданными параметрами
#property indicator_chart_window

extern string t1 = " === Настройки линии Bid ===";
extern color  Bidcolor = clrDeepSkyBlue; //Цвет
extern int    Bidstyle = 1;    //Стиль
//STYLE_SOLID      0 Сплошная линия
//STYLE_DASH       1 Штриховая линия
//STYLE_DOT        2 Пунктирная линия
//STYLE_DASHDOT    3 Штрих-пунктирная линия
//STYLE_DASHDOTDOT 4 Штрих-пунктирная линия с двойными точками
extern int    Bidwidth = 0;    //Толщина

extern string t2 = " === Настройки линии Ask ===";
extern bool   ShowAsk   = true; //Рисовать линию
extern color  Askcolor = clrRed;  //Цвет
extern int    Askstyle = 1;    //Стиль
extern int    Askwidth = 1;    //Толщина
extern string t3 = " === Общие настройки ===";
extern int    Length   = 30;   // Длина линий

int init()
{
   return(0);
}

int deinit()
{
  ObjectDelete("line_Ask");
  ObjectDelete("line_Bid");
  return(0);
}

int start()
{
string name = "line_Bid";
   RefreshRates();
   if(ObjectFind(name) < 0) {
      ObjectCreate(name, OBJ_TREND, 0, Time[0], Bid, Time[0]+PeriodSeconds()*Length,Bid);
      ObjectSet(name, OBJPROP_COLOR, Bidcolor);
      ObjectSet(name, OBJPROP_STYLE, Bidstyle);
      ObjectSet(name, OBJPROP_WIDTH, Bidwidth);
      ObjectSet(name,OBJPROP_RAY,false);
   }
      ObjectSet(name, OBJPROP_PRICE1, Bid);
      ObjectSet(name, OBJPROP_PRICE2, Bid);
   if(!ShowAsk) return(0);
   name = "line_Ask";
   if(ObjectFind(name) < 0) {

      ObjectCreate(name, OBJ_TREND, 0, Time[0], Ask, Time[0]+PeriodSeconds()*Length);
      ObjectSet(name, OBJPROP_COLOR, Askcolor);
      ObjectSet(name, OBJPROP_STYLE, Askstyle);
      ObjectSet(name, OBJPROP_WIDTH, Askwidth);
      ObjectSet(name,OBJPROP_RAY,false);
   }
      ObjectSet(name, OBJPROP_PRICE1, Ask);
      ObjectSet(name, OBJPROP_PRICE2, Ask);
  
   return(0);

}
 

Вложения

  • +++Line AskBid(оригинал).mq4
    4,1 КБ · Просмотры: 9
  • +++Line AskBid(поделка).mq4
    4,8 КБ · Просмотры: 11

AlexeNP

Гуру форума
опять 25
Индикатор изначально показывал линии аск и бид горизонтальными линиями OBJ_HLINE, пытался передлать под линии тренда OBJ_TREND.
Сначала была такая проблема, что линии перекашивались.

Посмотреть вложение 420796

Задал OBJPROP_PRICE2 , проблема с перекосом исчезла, но появилась новая. Теперь, линии не перемещаются за ценой, а остаются на месте первой установки.

Посмотреть вложение 420797
Код:
//+------------------------------------------------------------------+
//|                                                  Line_AskBid.mq4 |
//|                                          Copyright © 2011,Alen_T |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012,Alen_T"
#property link      "http://fxgeneral.com"
//Свойства линий можно менять при выделении на графике.
//При удалении линий - будут восстановлены с заданными параметрами
#property indicator_chart_window

extern color  Bidcolor = clrDeepSkyBlue; //Цвет линии
extern int    Bidstyle = 1;    //Стиль линии. Используется только при толщине линии 0 или 1.
//STYLE_SOLID      0 Сплошная линия
//STYLE_DASH       1 Штриховая линия
//STYLE_DOT        2 Пунктирная линия
//STYLE_DASHDOT    3 Штрих-пунктирная линия
//STYLE_DASHDOTDOT 4 Штрих-пунктирная линия с двойными точками
extern int    Bidwidth = 0;    //Толщина линии

extern bool   ShowAsk   = true; //Рисовать линию Ask
extern color  Askcolor = clrRed;  //Цвет линии
extern int    Askstyle = 0;    //Стиль линии. Используется только при толщине линии 0 или 1.
extern int    Askwidth = 1;    //Толщина линии

int init()
{
   return(0);
}

int deinit()
{
  ObjectDelete("line_Ask");
  ObjectDelete("line_Bid");
  return(0);
}

int start()
{
string name = "line_Bid";
   RefreshRates();
   if(ObjectFind(name) < 0) {
      ObjectCreate(name, OBJ_HLINE, 0, 0, Bid);
      ObjectSet(name, OBJPROP_COLOR, Bidcolor);
      ObjectSet(name, OBJPROP_STYLE, Bidstyle);
      ObjectSet(name, OBJPROP_WIDTH, Bidwidth);
   }
   ObjectSet(name, OBJPROP_PRICE1, Bid);
   if(!ShowAsk) return(0);
   name = "line_Ask";
   if(ObjectFind(name) < 0) {
      ObjectCreate(name, OBJ_HLINE, 0, 0, Ask);
      ObjectSet(name, OBJPROP_COLOR, Askcolor);
      ObjectSet(name, OBJPROP_STYLE, Askstyle);
      ObjectSet(name, OBJPROP_WIDTH, Askwidth);
   }
   ObjectSet(name, OBJPROP_PRICE1, Ask);
   return(0);

}
Код:
//+------------------------------------------------------------------+
//|                                                  Line_AskBid.mq4 |
//|                                          Copyright © 2011,Alen_T |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012,Alen_T"
#property link      "http://fxgeneral.com"
#property strict
//Свойства линий можно менять при выделении на графике.
//При удалении линий - будут восстановлены с заданными параметрами
#property indicator_chart_window

extern string t1 = " === Настройки линии Bid ===";
extern color  Bidcolor = clrDeepSkyBlue; //Цвет
extern int    Bidstyle = 1;    //Стиль
//STYLE_SOLID      0 Сплошная линия
//STYLE_DASH       1 Штриховая линия
//STYLE_DOT        2 Пунктирная линия
//STYLE_DASHDOT    3 Штрих-пунктирная линия
//STYLE_DASHDOTDOT 4 Штрих-пунктирная линия с двойными точками
extern int    Bidwidth = 0;    //Толщина

extern string t2 = " === Настройки линии Ask ===";
extern bool   ShowAsk   = true; //Рисовать линию
extern color  Askcolor = clrRed;  //Цвет
extern int    Askstyle = 1;    //Стиль
extern int    Askwidth = 1;    //Толщина
extern string t3 = " === Общие настройки ===";
extern int    Length   = 30;   // Длина линий

int init()
{
   return(0);
}

int deinit()
{
  ObjectDelete("line_Ask");
  ObjectDelete("line_Bid");
  return(0);
}

int start()
{
string name = "line_Bid";
   RefreshRates();
   if(ObjectFind(name) < 0) {
      ObjectCreate(name, OBJ_TREND, 0, Time[0], Bid, Time[0]+PeriodSeconds()*Length,Bid);
      ObjectSet(name, OBJPROP_COLOR, Bidcolor);
      ObjectSet(name, OBJPROP_STYLE, Bidstyle);
      ObjectSet(name, OBJPROP_WIDTH, Bidwidth);
      ObjectSet(name,OBJPROP_RAY,false);
   }
      ObjectSet(name, OBJPROP_PRICE1, Bid);
      ObjectSet(name, OBJPROP_PRICE2, Bid);
   if(!ShowAsk) return(0);
   name = "line_Ask";
   if(ObjectFind(name) < 0) {

      ObjectCreate(name, OBJ_TREND, 0, Time[0], Ask, Time[0]+PeriodSeconds()*Length);
      ObjectSet(name, OBJPROP_COLOR, Askcolor);
      ObjectSet(name, OBJPROP_STYLE, Askstyle);
      ObjectSet(name, OBJPROP_WIDTH, Askwidth);
      ObjectSet(name,OBJPROP_RAY,false);
   }
      ObjectSet(name, OBJPROP_PRICE1, Ask);
      ObjectSet(name, OBJPROP_PRICE2, Ask);
 
   return(0);

}
 

Вложения

  • +++Line AskBid(поделка).mq4
    6,7 КБ · Просмотры: 14

gravity

Местный знаток
Спасибо!
Вот так должен был выглядеть.
Screenshot_6.jpg

Код:
//+------------------------------------------------------------------+
//|                                                  Line_AskBid.mq4 |
//|                                          Copyright © 2011,Alen_T |
//|                                             http://fxgeneral.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012,Alen_T"
#property link      "http://fxgeneral.com"
#property strict
//Свойства линий можно менять при выделении на графике.
//При удалении линий - будут восстановлены с заданными параметрами
#property indicator_chart_window

extern string t1 = " === Настройки линии Bid ===";
extern color  Bidcolor = clrDeepSkyBlue; //Цвет
extern int    Bidstyle = 1;    //Стиль
//STYLE_SOLID      0 Сплошная линия
//STYLE_DASH       1 Штриховая линия
//STYLE_DOT        2 Пунктирная линия
//STYLE_DASHDOT    3 Штрих-пунктирная линия
//STYLE_DASHDOTDOT 4 Штрих-пунктирная линия с двойными точками
extern int    Bidwidth = 0;    //Толщина

extern string t2 = " === Настройки линии Ask ===";
extern bool   ShowAsk   = true; //Рисовать линию
extern color  Askcolor = clrRed;  //Цвет
extern int    Askstyle = 1;    //Стиль
extern int    Askwidth = 1;    //Толщина
extern string t3 = " === Общие настройки ===";
extern int    Length   = 30;   // Длина линий

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete("line_Ask");
   ObjectDelete("line_Bid");
   return(0);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   string name = "line_Bid";
   RefreshRates();
   if(ObjectFind(name) < 0)
     {
      ObjectCreate(name, OBJ_TREND, 0,0,0,0,0);
      ObjectSet(name, OBJPROP_COLOR, Bidcolor);
      ObjectSet(name, OBJPROP_STYLE, Bidstyle);
      ObjectSet(name, OBJPROP_WIDTH, Bidwidth);
      ObjectSet(name,OBJPROP_RAY,false);
     }
   ObjectSet(name, OBJPROP_PRICE1, Bid);
   ObjectSet(name, OBJPROP_PRICE2, Bid);
   ObjectSet(name, OBJPROP_TIME1, Time[0]);
   ObjectSet(name, OBJPROP_TIME2, Time[0]+PeriodSeconds()*Length);
   if(!ShowAsk)
      return(0);
   name = "line_Ask";
   if(ObjectFind(name) < 0)
     {

      ObjectCreate(name, OBJ_TREND, 0,0,0,0,0);
      ObjectSet(name, OBJPROP_COLOR, Askcolor);
      ObjectSet(name, OBJPROP_STYLE, Askstyle);
      ObjectSet(name, OBJPROP_WIDTH, Askwidth);
      ObjectSet(name,OBJPROP_RAY,false);
     }
   ObjectSet(name, OBJPROP_PRICE1, Ask);
   ObjectSet(name, OBJPROP_PRICE2, Ask);
   ObjectSet(name, OBJPROP_TIME1, Time[0]);
   ObjectSet(name, OBJPROP_TIME2, Time[0]+PeriodSeconds()*Length);

   return(0);

  }
//+------------------------------------------------------------------+
 

Вложения

  • +++Line AskBid(fix).mq4
    6,5 КБ · Просмотры: 15

majdhelobi

Активный участник
hi programers I have one problem with this indicator it are me late can you help me with alerting me on the same opinion candle, please
 

Вложения

  • Neon.mq4
    12,9 КБ · Просмотры: 17

flyyy09

Активный участник
Всем привет. Подскажите пожалуйста как записать условие на поиск свечи, с хвостами заданного размера, т.е например тело свечи 100пп, а хвосты один 200, другой 300пп.
 

AlexeNP

Гуру форума
Всем привет. Подскажите пожалуйста как записать условие на поиск свечи, с хвостами заданного размера, т.е например тело свечи 100пп, а хвосты один 200, другой 300пп.
верхний хвост = (High - MathMax(Open,Close))/_Point
нижний хвост = (MathMin(Open,Close) - Low)/_Point

if(верхний хвост == чему-то && нижний хвост == чему-то еще)
{
что-то тут такое-этакое
}
 
Последнее редактирование:

AlexeNP

Гуру форума
Сегодня только заметил, если этот return закомментить, то перестаёт работать режим мтф.
MTF там как-то и не особо заметен... в чем смысл MTF - проводишь все расчеты (слово "все" подчеркнуть или так сойдет?) по данным одного таймфрейма, а потом переносишь результаты на график другого... с соответствующим масштабированием... со временем шутки плохи)
если уж так захотелось душе MTF, то можно сделать гораздо проще - написать один раз нормально (фразу "один раз нормально" подчеркнуть или и так сойдет?) индикатор, потом забабахать нехитрую надстройку и радоваться)
как пример
 

Вложения

  • MTF MA.mq4
    3,4 КБ · Просмотры: 15

mobidik

-----
Сегодня только заметил, если этот return закомментить, то перестаёт работать режим мтф.
Все верно, раз в коде что-то написано, значит на то есть свои причины, имхо...
На примере HMA'BB Adaptive MTF [MERFY+(arr)]:
если индикатор работает на текущем ТФ, условие в строке 135 не выполняется и индикатор рассчитывается по текущему ТФ. В режиме МТФ происходит вызов самого себя, но уже по старшему ТФ. Условие в строке 135 уже выполнится - получим данные индикатора со старшего ТФ и занесем полученные результаты в массивы/буферы индикатора работающего на текущем ТФ и, т.к., задача уже выполнена - ретурн - вываливаемся из расчетов. Если этого не сделать - будет дальнейшие выполнение кода, но уже по текущему ТФ. Тем самым, ранее занесенные данные в массивы индикатора по текущему бару со старшего ТФ будут переписаны данными уже по текущему ТФ. Режим МТФ не работает...
 

mobidik

-----
с соответствующим масштабированием... со временем шутки плохи)
код Младена:
int y = iBarShift(NULL,TimeFrame,Time[i],false);:
Твой вариант:
datetime t=iTime(NULL,0,i);int i1=iBarShift(NULL,TF1,t,false);:
и в чем же разница со временем?

PS.
AlexeNP набрось свой индикатор на график, а спустя некоторое время - обнови и посмотри: изменится картинка или нет...
 
Последнее редактирование:

gravity

Местный знаток
Все верно, раз в коде что-то написано, значит на то есть свои причины, имхо...
На примере HMA'BB Adaptive MTF [MERFY+(arr)]:
если индикатор работает на текущем ТФ, условие в строке 135 не выполняется и индикатор рассчитывается по текущему ТФ. В режиме МТФ происходит вызов самого себя, но уже по старшему ТФ. Условие в строке 135 уже выполнится - получим данные индикатора со старшего ТФ и занесем полученные результаты в массивы/буферы индикатора работающего на текущем ТФ и, т.к., задача уже выполнена - ретурн - вываливаемся из расчетов. Если этого не сделать - будет дальнейшие выполнение кода, но уже по текущему ТФ. Тем самым, ранее занесенные данные в массивы индикатора по текущему бару со старшего ТФ будут переписаны данными уже по текущему ТФ. Режим МТФ не работает...
Благодарю! Только не понял, как выполняется Arr_show и AlertsOn. Получается они всегда выполняется (включая режим мтф), если они true в настройках?
Хотя Arr_show находятся внутри цикла for для текущего ТФ.
 

gravity

Местный знаток
Тут пробовал сделать инд стрелки, алерт и т.д. За пример взял инд Turbo_JRSX alert & arrows.
Вроде всё сделал по подобию, но похоже где-то ошибся. Стрелки отображаются неправильно.
Иногда, через какое-то время, стрелки начинают отображаться как надо.
 

Вложения

  • MomPinboll(ошибка).mq4
    16,7 КБ · Просмотры: 12
  • Turbo_JRSX2 alert & arrows(m).mq4
    15,3 КБ · Просмотры: 13
  • неверно.jpg
    неверно.jpg
    86,9 КБ · Просмотры: 29
  • Верно.jpg
    Верно.jpg
    79,8 КБ · Просмотры: 29

mobidik

-----
Вроде всё сделал по подобию, но похоже где-то ошибся. Стрелки отображаются неправильно.
Иногда, через какое-то время, стрелки начинают отображаться как надо.
Что сделал - то и получил...
Постараюсь объяснить на пальцах:
Условие на стрелки находятся в цикле, а цикл начинается от нуля и до упора. Находимся на баре с индексом "0" - получили данные и записали в BufferRSI[0], затем увеличили i-ку на 1, перешли на первый бар и записали данные в BufferRSI[1] и т.д. При этом, если "сейчас" работаем, например, с i=5, то во всех последующих ячейках буферного массива хранится значение EMPTY_VALUE, что равно 2147483647. Теперь переходим к самому условию на стрелки:
if(BufferRSI[i+SignalBar]<Level_Up && BufferRSI[i+1+SignalBar]>Level_Up)...
Вот i=5 и что имеем по условию:
SignalBar = 0;
if(BufferRSI[5+0]<Level_Up && BufferRSI[5+1+0]>Level_Up).
т.е. сравниваем данные по 5-му бару, который только что просчитали, с 6-м, до которого еще не дошла очередь, а значит, его значение равно: EMPTY_VALUE. Условие выполнится на каждом баре если выполнится первая часть условия: BufferRSI[5+0]<Level_Up, вторая часть выполняется всегда. Это же и объясняет почему нет стрелок при SignalBar = 1.
Что изменить, как вариант, изменить знак "+" в условии на "-". Но, получим ошибку, т.к., есть strict и будет выход за массив при самом первом входе в цикл. т.к., будет запрошен массив с индексом -1. Не подходит такое решение, тогда меняем направление счета в самом цикле - начинаем с i = limit и до "0", при этом, само условие на стрелки остается прежним, что, собственно говоря, и сделано в индикаторе, который был взят для примера.
 

gravity

Местный знаток
Что сделал - то и получил...
Постараюсь объяснить на пальцах:
Спасибо ещё раз 🤝 Из тебя хороший учитель :)
Код:
  //---- Заполнение вспом.буфера ROC
for ( i = 0; i < iCount; i++ ) {//( i = iCount; i >=0; i-- ) {
    BufferROC[i] = Close[ i ] - Close[ i + ExtPeriodROC ];
  } // for

  //---- Расчёт RSI от ROC
  for ( i = iCount; i >=0; i-- )//( i = 0; i < iCount; i++ )
  {
    BufferRSI[i] = iRSIOnArray( BufferROC, 0, ExtPeriodRSI, i );
Изменил только для BufferRSI.

Получается что для BufferROC можно оставить порядок счёта (i++).
Потому что для этого массива нет такого условия как [i+1+SignalBar] и не возникает такой ошибки как для массива RSI. :geek:
 

mobidik

-----
Спасибо ещё раз 🤝 Из тебя хороший учитель :)
Код:
  //---- Заполнение вспом.буфера ROC
for ( i = 0; i < iCount; i++ ) {//( i = iCount; i >=0; i-- ) {
    BufferROC[i] = Close[ i ] - Close[ i + ExtPeriodROC ];
  } // for

  //---- Расчёт RSI от ROC
  for ( i = iCount; i >=0; i-- )//( i = 0; i < iCount; i++ )
  {
    BufferRSI[i] = iRSIOnArray( BufferROC, 0, ExtPeriodRSI, i );
Изменил только для BufferRSI.

Получается что для BufferROC можно оставить порядок счёта (i++).
Потому что для этого массива нет такого условия как [i+1+SignalBar] и не возникает такой ошибки как для массива RSI. :geek:
Предыдущий цикл нам не интересен, он отработает и только потом мы попадем в следующий цикл, где будет расчет BufferRSI и прописались условия на стрелки. Можно было оставить цикл как есть и создать новый цикл - только для стрелок с нужным направлением, но зачем лишний раз нагружать систему повторным просчетом, когда все решается в одном цикле.
 
Верх