Скачать MetaTrader 5

Помогите поправить код в индикаторе

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен торговый робот? Закажи его в сервисе Фриланс!
uniface
526
uniface 2016.07.16 00:41 

Я только учусь mql и многое пока не понимаю, помогите и подскажите что сделать!

Есть код: 

//+------------------------------------------------------------------+
//|                                         MarketGOD_Indicators.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window    // Индикатор рисуется в основном окне
#property indicator_buffers 1       // Количество буферов
#property indicator_color1 Green    // Цвет первой линии

double Buf_0[];             // Объявление массивов(под буферы индикатора)
//+------------------------------------------------------------------+
int init()                                     // Специальная функция init()
  {
   SetIndexBuffer(0,Buf_0);                    // Назначение массива буферу
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);  // Стиль линии
   return(0);                                  // Выход из спец. ф-ии init()
  }
//+------------------------------------------------------------------+
int start()                    
 {
      for(int i= 0; i < Bars; i++)
       {
           if(Open[i] > Close[i])
           {
               /* 1 формула подсчета;*/
                  Buf_0[i] = (High[i]+Low[i]+Open[i]+Close[i])/4.0;/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
           }
          else if(Open[i] < Close[i])
                 {
                 /* 2 формула подсчета;*/
                   Buf_0[i] = 0/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
                 }
               else//если будет равно то управление перейдет в этот блок
               {
                     /* 3 формула подсчета;*/
                    Buf_0[i] = 0/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
               }
           }
          return(0);

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

То есть при выполнении условия if все происходит нормально (бар просчитался и отметился), получается надо чтобы при выполнении условий else if и else им возвращалось значение предыдущего бара. Тогда линия не будет обрыватся, а при наступлении нового бычьего бара, цена перейдет на другое значение. Как мне это осуществить?

Dmitry Fedoseev
42906
Dmitry Fedoseev 2016.07.16 06:45  

Начните с начала. Вот такого цикла в индикаторе:

 for(int i= 0; i < Bars; i++)

не должно быть. Не должен индикатор на каждом тике рассчитываться для всех баров графика. Нужно вычислять диапазон обсчитываемых баров используя функцию IndicatorCounted(). Впрочем это уже устаревший подход. Сейчас нужно использовать функцию OnCalculate():

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[]){ 

 

При этом вычислять диапазон обсчитываемых баров используя переменные rates_total и prev_calculated. 

Собственно по вопросу: при медвежьем баре вычисляем, а если бар не медвежий, надо взять значение с предыдущего бара. 

Alexey Busygin
6437
Alexey Busygin 2016.07.16 06:56  
ukro:

Я только учусь mql и многое пока не понимаю, помогите и подскажите что сделать!

Есть код: 

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

То есть при выполнении условия if все происходит нормально (бар просчитался и отметился), получается надо чтобы при выполнении условий else if и else им возвращалось значение предыдущего бара. Тогда линия не будет обрыватся, а при наступлении нового бычьего бара, цена перейдет на другое значение. Как мне это осуществить?

У вас при переходе на медвежий в буфере стоит 0. Не проще отпустить else  и не считать медвежьи бары. Тогда линия, по идеи должна отрисовываться на следующий бычий бар.

Или в else придать значению буферу, последнее значение медвежьего бара. Тогда на медвежьих барах будет отрисовываться прямая линия

Alexey Viktorov
6855
Alexey Viktorov 2016.07.16 08:15  
ukro:

Я только учусь mql и многое пока не понимаю, помогите и подскажите что сделать!

Есть код: 

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

То есть при выполнении условия if все происходит нормально (бар просчитался и отметился), получается надо чтобы при выполнении условий else if и else им возвращалось значение предыдущего бара. Тогда линия не будет обрыватся, а при наступлении нового бычьего бара, цена перейдет на другое значение. Как мне это осуществить?

Вот тебе уже второй раз повторяют что надо писать в новой редакции языка.

Dmitry Fedoseev:

Начните с начала. Вот такого цикла в индикаторе:

не должно быть. Не должен индикатор на каждом тике рассчитываться для всех баров графика. Нужно вычислять диапазон обсчитываемых баров используя функцию IndicatorCounted(). Впрочем это уже устаревший подход. Сейчас нужно использовать функцию OnCalculate():

Примерно так должен выглядеть твой код

//+------------------------------------------------------------------+
//|                                         MarketGOD_Indicators.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window       // Индикатор рисуется в основном окне
#property indicator_buffers 1          // Количество буферов
#property indicator_color1 Green       // Цвет первой линии
#property indicator_width1 2           // Толщина линии

double Buf_0[];                        // Объявление массивов(под буферы индикатора)
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()                           // Специальная функция OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, Buf_0);           // Назначение массива буферу
   SetIndexStyle (0, DRAW_SECTION);    // Стиль линии
//---
   return(INIT_SUCCEEDED);             // Выход из спец. ф-ии init()
  }
//+------------------------------------------------------------------+
//| 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, 
            limit = prev_calculated == 0  // Переменной limit, при условии что prev_calculated равно нулю
          ? rates_total-1                 // будет присвоено значение rates_total(количество баров в окне) минус 1
          : prev_calculated;              // иначе будет присвоено prev_calculated(количество не посчитанных баров
          // Это можно было записать в одну строку, перенос строк сделан для удобства написания комментариев

      for(i = 0; i < limit; i++)          // цикл 
       {
           if(open[i] > close[i])
           {
               /* 1 формула подсчета;*/
                  Buf_0[i] = (high[i]+low[i]+open[i]+close[i])/4.0;/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
           }
          else if(open[i] < close[i])
                 {
                 /* 2 формула подсчета;*/
                   Buf_0[i] = EMPTY_VALUE/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
                 }
               else//если будет равно то управление перейдет в этот блок
               {
                     /* 3 формула подсчета;*/
                    Buf_0[i] = EMPTY_VALUE/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
               }
       }   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Чтобы линия не прерывалась достаточно назначить стиль DRAW_SECTION и не всегда полезно в буфер записывать 0 если в нём не должно быть значения. или-же в OnInit() надо установить значение пустой величины SetIndexEmptyValue(0, 0.0);

uniface
526
uniface 2016.07.16 10:18  
Alexey Viktorov:

Вот тебе уже второй раз повторяют что надо писать в новой редакции языка.

Примерно так должен выглядеть твой код

Чтобы линия не прерывалась достаточно назначить стиль DRAW_SECTION и не всегда полезно в буфер записывать 0 если в нём не должно быть значения. или-же в OnInit() надо установить значение пустой величины SetIndexEmptyValue(0, 0.0);

Спасибо за помощь, дай БОГ тебе здоровья! И всем кто отписался!
uniface
526
uniface 2016.07.19 10:32  
Alexey Viktorov:

Вот тебе уже второй раз повторяют что надо писать в новой редакции языка.

Примерно так должен выглядеть твой код

Чтобы линия не прерывалась достаточно назначить стиль DRAW_SECTION и не всегда полезно в буфер записывать 0 если в нём не должно быть значения. или-же в OnInit() надо установить значение пустой величины SetIndexEmptyValue(0, 0.0);

А как сделать чтобы каждое новое полученное значение усреднялось с предыдущим?
Alexey Viktorov
6855
Alexey Viktorov 2016.07.19 19:08  
novichek:

А как сделать чтобы каждое новое полученное значение усреднялось с предыдущим?

Так как ты и написал, берёшь текущее и предыдущее значение, складываешь, делишь на 2 и ты в дамках...

Ещё можно воспользоваться iMAOnArray()

iMAOnArray - Технические индикаторы - Справочник MQL4
iMAOnArray - Технические индикаторы - Справочник MQL4
  • docs.mql4.com
iMAOnArray - Технические индикаторы - Справочник MQL4
uniface
526
uniface 2016.07.20 10:50  
Alexey Viktorov:

Так как ты и написал, берёшь текущее и предыдущее значение, складываешь, делишь на 2 и ты в дамках...

Ещё можно воспользоваться iMAOnArray()

Я понимаю, но непойму как мне зафиксировать предыдущее значение, чтобы в дальнейшем его использовать в уравнении?
uniface
526
uniface 2016.07.20 10:55  
Alexey Viktorov:

Так как ты и написал, берёшь текущее и предыдущее значение, складываешь, делишь на 2 и ты в дамках...

Ещё можно воспользоваться iMAOnArray()

Пробовал даже пользовательскую функцию, компиляция без ошибок, но линия не отображается!

double bulls(int i, double b, double b_0) 
  { 
    for(i = 0; i < Bars; i++)          // цикл 
       {
           if(Open[i] > Close[i])
           {
                  b_0 = (High[i]+Low[i]+Open[i]+Close[i])/4.0;/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
           }
          else if(Open[i] < Close[i])
                 {
                   b_0 = b/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
                 }
               else//если будет равно то управление перейдет в этот блок
               {
                    b_0 = b/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ;
               }
         b = b_0;
         Buf_0[i] = b_0 + b;
       }  
   return(b); 
  }
Alexey Viktorov
6855
Alexey Viktorov 2016.07.20 13:49  
novichek:

Пробовал даже пользовательскую функцию, компиляция без ошибок, но линия не отображается!

Потомучто ты думаешь одно, а делаешь другое.

Попробуй думать и делать одно и то-же. Иными словами, делать то, что думаешь.

uniface
526
uniface 2016.07.20 19:11  
Alexey Viktorov:

Потомучто ты думаешь одно, а делаешь другое.

Попробуй думать и делать одно и то-же. Иными словами, делать то, что думаешь.

Дело не в моем мышлении, я не знаю как записать значение бара и сравнить с будущим баром, все что в голову лезло уже перепробывал, но mql я еще плоховато зная и многого не понимаю!
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий