Ваши вопросы по языку MQL4

aleksmerlin

Интересующийся
Здравствуйте, подскажите пожалуйста как исправить ошибку.
 

Вложения

  • 2020-03-13.png
    2020-03-13.png
    145,7 КБ · Просмотры: 31

aleksmerlin

Интересующийся
Благодарю, но вылезло другое предупреждение, теперь ему индикатор нужен , если правильно перевод понял.
 

Вложения

  • Exp_PairTrader v44.2.mq4
    13,8 КБ · Просмотры: 14

OSS_5

Активный участник

Вложения

  • Exp_PairTrader v44.2.mq4
    27,6 КБ · Просмотры: 24
  • Exp_PairTrader v44.2.ex4
    38,7 КБ · Просмотры: 14

Leva20

Новичок форума
Добрый день
Пишу индикатор который наподобие зигзага по определенному алгоритму должен рисовать хай и лоу на графике
Столкнулся с трудностью при работе с динамическими массивами.
Использую для этого функции
SetIndexBuffer(1,Buf_1);
SetIndexEmptyValue(1,0.0);
Но что то не вяжется, индикатор или рисует линию через каждый бар или вообще не чего не рисует.
Не могли бы помочь разобраться с вопросом?
Ниже мои попытки разобраться с массивом:



#property indicator_chart_window // Индик. рисуется в основном окне
#property indicator_buffers 2 // Количество буферов
#property indicator_color1 Blue // Цвет первой линии


double ,Buf_1[]; // Открытие индикаторных массивов
//--------------------------------------------------------------------
int init() // Специальная функция init()
{
//--------------------------------------------------------------------

SetIndexBuffer(1,Buf_1); // Назначение массива буферу
SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Стиль линии
SetIndexEmptyValue(1,0.0);
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int i; // Индекс бара

//--------------------------------------------------------------------
i=10;


while(i>=0) // Цикл по непосчитанным барам
{


if(i<=6 && i>=3 );
{
Buf_1=0.0;
}


Buf_1=Low; // Значение 1 буфера на i-ом баре



i--;



}
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии start()
}
 

AlexeNP

Гуру форума
Добрый день
Пишу индикатор который наподобие зигзага по определенному алгоритму должен рисовать хай и лоу на графике
Столкнулся с трудностью при работе с динамическими массивами.
Использую для этого функции
SetIndexBuffer(1,Buf_1);
SetIndexEmptyValue(1,0.0);
Но что то не вяжется, индикатор или рисует линию через каждый бар или вообще не чего не рисует.
Не могли бы помочь разобраться с вопросом?
Ниже мои попытки разобраться с массивом:
...
ну, если попробовать написать все без ошибок, то он все норм рисовать должен... так, к примеру
Код:
#property strict
#property indicator_chart_window
#property indicator_buffers 2 // Количество буферов
#property indicator_color1 clrBlue // Цвет первой линии
#property indicator_type1 DRAW_LINE
#property indicator_style1 STYLE_DOT
#property indicator_width1 1

double Buf_1[]; // Открытие индикаторных массивов
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buf_1); // Назначение массива буферу
   SetIndexEmptyValue(0,EMPTY_VALUE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   int i=10; // Индекс бара
   while(i>=0) // Цикл по непосчитанным барам
     {
      if(i<=6 && i>=3)
        {
         Buf_1[i]=0.0;
        }
      Buf_1[i]=low[i]; // Значение 1 буфера на i-ом баре
      i--;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Leva20

Новичок форума
Как у вас он рисует через каждый бар

То что я скинул, он делает пропуск но не чего не рисует. Как заставить соединить его 2 точки.

2020-03-17_201529.jpg

Код:
#property strict
#property indicator_chart_window // Индик. рисуется в основном окне
#property indicator_buffers 2 // Количество буферов
#property indicator_color1 Blue // Цвет первой линии


double Buf_1[]; // Открытие индикаторных массивов
//--------------------------------------------------------------------
int init() // Специальная функция init()
{
//--------------------------------------------------------------------

SetIndexBuffer(1,Buf_1); // Назначение массива буферу
SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Стиль линии
SetIndexEmptyValue(1,0.0);
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int i; // Индекс бара

//--------------------------------------------------------------------
i=10;


while(i>=0) // Цикл по непосчитанным барам
{


if(i<=6 && i>=3 )
{
Buf_1[i]=0.0;
}
else
{

Buf_1[i]=Low[i]; // Значение 1 буфера на i-ом баре
  }


i--;



}

//Alert ("Mas - ",Buf_1[1]);
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии start()
}




В конечном результате он должен рисовать свинги. Условия отбора я ему задал, теперь только нужно заставит все это отобразить.
Получится должно как то так

2020-03-17_202244.jpg
 
Последнее редактирование:

Leva20

Новичок форума
Спасибо, изначально все заработало как нужно. А потом линия стала учитывать 0. Поставил как Вы и сказали
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_SECTION);

Вот как отображает на графике. Чего ему теперь не хватает?
Ниже код
2020-03-18_225116.jpg
Код:
#property strict
#property indicator_chart_window // Индик. рисуется в основном окне
#property indicator_buffers 1 // Количество буферов
#property indicator_color1 Blue // Цвет первой линии

double Buf_0[];// Открытие индикаторных массивов
//--------------------------------------------------------------------
int init() // Специальная функция init()
{
//--------------------------------------------------------------------

SetIndexBuffer(0,Buf_0); // Назначение массива буферу
SetIndexStyle(0,DRAW_SECTION); // Стиль линии

//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии init()
}
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int i; // Индекс бара
i=10;
while(i>=0) // Цикл по непосчитанным барам
{
if(i<=9 && i>=6 || i<=4 && i>=2 )
{
Buf_0[i]=0.0;
}
else
 {
Buf_0[i]=Low[i]; // Значение 1 буфера на i-ом баре
  }
i--;
}
//--------------------------------------------------------------------
return (INIT_SUCCEEDED); // Выход из спец. ф-ии start()
}
 

mobidik

-----
А если так:
C-подобный:
   while(i>=0) // Цикл по непосчитанным барам
     {
      if((i<=9 && i>=6) || (i<=4 && i>=2))
        {
         Buf_0[i]=EMPTY_VALUE;
        }
      else
        {
         Buf_0[i]=Low[i]; // Значение 1 буфера на i-ом баре
        }
      i--;
     }
 

vladradon

Программист
Спасибо, изначально все заработало как нужно. А потом линия стала учитывать 0. Поставил как Вы и сказали
Секционное рисование пропускает пустые значения буфера. По-умолчанию пустые значения заполняются EMPTY_VALUE и 0 не является пустым - значит будет рисовать от 0-ля. Либо пустые приравниваем к EMPTY_VALUE, либо командой SetIndexEmptyValue(0,0.0); присваиваем буферу пустые значения = 0. В файле второй вариант.
 

Вложения

  • TestZZ.mq4
    4,2 КБ · Просмотры: 19
  • TestZZ.png
    TestZZ.png
    4,3 КБ · Просмотры: 67

Leva20

Новичок форума

Секционное рисование пропускает пустые значения буфера. По-умолчанию пустые значения заполняются EMPTY_VALUE и 0 не является пустым - значит будет рисовать от 0-ля. Либо пустые приравниваем к EMPTY_VALUE, либо командой SetIndexEmptyValue(0,0.0); присваиваем буферу пустые значения = 0. В файле второй вариант.

Спасибо за помощь теперь все работает.
Теперь я понял в чем была причина. Для правильного отображения кривой нужна функция SetIndexEmptyValue(0,0.0); и присвоить буферу значение 0 или просто присвоить буферу значение EMPTY_VALUE без применения функции SetIndexEmptyValue(0,0.0);
 

Leva20

Новичок форума
Добрый день

Столкнулся с такой проблемой, что иногда на рынке возникает такая ситуация, что нужно записать в массив 2 точки на одном баре. Как можно решить данный вопрос, так как одномерный массив немного не подходит. Как правильно сделать записать в двух мерный массив, что бы решить вопрос на скрине.
2019-08-19_215010.jpg
 

AlexeyVik

Программист mql4 mql5
Добрый день

Столкнулся с такой проблемой, что иногда на рынке возникает такая ситуация, что нужно записать в массив 2 точки на одном баре. Как можно решить данный вопрос, так как одномерный массив немного не подходит. Как правильно сделать записать в двух мерный массив, что бы решить вопрос на скрине.
Посмотреть вложение 373880
Да вроде тип построения DRAW_ZIGZAG должен справляться с этой проблемой. В mql5 точно справляется...
 

vladradon

Программист
Столкнулся с такой проблемой, что иногда на рынке возникает такая ситуация, что нужно записать в массив 2 точки на одном баре. Как можно решить данный вопрос, так как одномерный массив немного не подходит. Как правильно сделать записать в двух мерный массив, что бы решить вопрос на скрине.
Задай параллельный массив для данных - его не нужно делать "выходным" - просто для расчетов.
 

AlexeyVik

Программист mql4 mql5
Задай параллельный массив для данных - его не нужно делать "выходным" - просто для расчетов.
Влад, а что это даст? Дело в том, что имеющийся ZigZag построен на DRAW_SECTION который имеет только один буфер и следовательно на одном баре буфер можно заполнить только одним значением. А DRAW_ZIGZAG имеет два буфера, соответственно два массива и на одном баре можно заполнить оба буфера.
 

vladradon

Программист
Влад, а что это даст? Дело в том, что имеющийся ZigZag построен на DRAW_SECTION который имеет только один буфер и следовательно на одном баре буфер можно заполнить только одним значением. А DRAW_ZIGZAG имеет два буфера, соответственно два массива и на одном баре можно заполнить оба буфера.
Леш, я понятия не имею - челу зачем-то нужно...
 

vladradon

Программист
Я не о том, что человеку нужно, а о том как может помочь «параллельный массив для данных»
Я не так давно один индюк переводил из подвала на график - мне пришлось, чтобы сохранить все расчеты, сделать дубль - старые буферы остались чисто расчетными, а в новые (рисующие) я заносил актуальную информацию.
 

Slava78

Элитный участник
Уважаемые прогеры, нужна помощь. Буфера не соответствуют, не получается прописать в советнике. Нужно чтобы от верхней зоны селл, от нижней бай
 

Вложения

  • Screenshot_45.png
    Screenshot_45.png
    23,3 КБ · Просмотры: 30
  • AutoFib TradeZones.zip
    25,6 КБ · Просмотры: 11
Верх