Нужна небольшая помощь в исправлении кода.

[Удален]  

Здравствуйте. Нашлепал индикатор, а он не хочет рисоваться. В программировании плохо разбираюсь. Пожалуйста, помогите.

Я коментами пометил что и как хотел посчитать.

//+------------------------------------------------------------------+
//|                                               Test_indicator.mq4 |
//|                                              Mikhail Dementienko |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Mikhail Dementienko"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Black

extern int period1 = 8; // период сглаживания
extern color color1 = Black;
double Buffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
SetIndexStyle(0,DRAW_LINE, 0, 2, color1);
   SetIndexBuffer(0, Buffer1);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  double BullsPbuf;
  double BearsPbuf;
  double BullsP[];
  double BearsP[];
  

   int    counted_bars=IndicatorCounted();
     int i = counted_bars;
        while (i>=0)
          {
          if (Open[i]<Close[i]) // закрытие вверх
            {
             BullsP[i]   = High[i] - Low[i]; // сила быков = макс - мин.
             BearsP[i]   = BullsP[i] - MathAbs(Open[i]-Close[i]); // медведи = быки - то, что не отвоевали
            }
          if (Open[i]>Close[i])
            {
             BearsP[i] = High[i] - Low[i]; 
             BullsP[i] = BearsP[i] - MathAbs(Open[i]-Close[i]); // соотв.  наоборот            
            }
          if (Open[i]==Close[i]) 
            {
            BullsP[i] = High[i] - Low[i];
            BearsP[i] = BullsP[i];
            }
            
             BullsPbuf = iMAOnArray (BullsP, 0, period1,0,MODE_SMMA,0); // сглаживаем значения 
             BearsPbuf = iMAOnArray (BearsP, 0, period1,0,MODE_SMMA,0); //
            Buffer1[i] = BullsPbuf - BearsPbuf ; // выводим в буфер индикатора разницу сглаженных "сил" быков и медведей.
            i--;      
          }
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
[Deleted]  
  double BullsP[];
  double BearsP[];

Массивы нулевой длины. Сделайте их тоже буферами как Buffer1 и со стилем DRAW_NONE если не хотите отображать их.

[Удален]  
LostTrader >>:


Массивы нулевой длины. Сделайте их тоже буферами как Buffer1 и со стилем DRAW_NONE если не хотите отображать их.

Добавил

double BullsP[];
  double BearsP[];
   SetIndexStyle(1,DRAW_NONE, 0, 2, color1);
   SetIndexBuffer(1, BullsP);
   
   SetIndexStyle(2,DRAW_NONE, 0, 2, color1);
   SetIndexBuffer(2, BearsP);

Но выводит все равно не то, что нужно. Какая-то прямая линия в самом низу.... окна индикатора....

Где же ошибка?

Расчет таков:

Если закрытие выше открытия (т.е. с повышением), то считаем силу быков (BullsP ) как High - Low. А силу медведей (BearsP), как High - Low - *тело свечи*

Если закрытие нижу открытия (т.е. с понижением), то считаем силу медведей (BearsP) как High - Low. А силу быков (BullsP ), как High - Low - *тело свечи*

Затем сглаживаем значения получившихся массивов с "силами" быков и медведей по 8 периодам.

Находим разницу между сглаженными значениями и выводим ее на экран в виде линии.

Добавлю весь подправленный код для удобочитаемости.

//+------------------------------------------------------------------+
//|                                               Test_indicator.mq4 |
//|                                              Mikhail Dementienko |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Mikhail Dementienko"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Black

extern int period1 = 8;
extern color color1 = Black;
double Buffer1[];
double BullsP[];
double BearsP[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
SetIndexStyle(0,DRAW_LINE, 0, 2, color1);
   SetIndexBuffer(0, Buffer1);
   
   SetIndexStyle(1,DRAW_NONE, 0, 1, CLR_NONE);
   SetIndexBuffer(1, BullsP);
   
   SetIndexStyle(2,DRAW_NONE, 0, 1, CLR_NONE);
   SetIndexBuffer(2, BearsP   );
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  double BullsPbuf;
  double BearsPbuf;
 
  

   int    counted_bars=IndicatorCounted();
     int i = counted_bars;
        while (i>=0)
          {
          if (Open[i]<Close[i]) // закрытие вверх
            {
             BullsP[i]   = High[i] - Low[i]; // сила быков = макс - мин.
             BearsP[i]   = BullsP[i] - MathAbs(Open[i]-Close[i]); // медведи = быки - то, что не отвоевали
            }

           if (Open[i]>Close[i])
            {
            BearsP[i] = High[i] - Low[i];
            BullsP[i] = BearsP[i] - MathAbs(Open[i]-Close[i]); // соотв.  наоборот
            }

           if (Open[i]==Close[i]) 
            {
            BullsP[i] = High[i] - Low[i];
            BearsP[i] = BullsP[i];
            }
            
             BullsPbuf = iMAOnArray (BullsP, 0, period1,0,MODE_SMMA,0); // сглаживаем значения 
             BearsPbuf = iMAOnArray (BearsP, 0, period1,0,MODE_SMMA,0); //
             
             Buffer1[i] = BullsPbuf - BearsPbuf ; // выводим в буфер индикатора разницу сглаженных "сил" быков и медведей.
            i--;      
          }
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
             BullsPbuf = iMAOnArray (BullsP, 0, period1,0,MODE_SMMA,i); // сглаживаем значения 
             BearsPbuf = iMAOnArray (BearsP, 0, period1,0,MODE_SMMA,i); //
в iMAOnArray последний параметр "Индекс получаемого значения из индикаторного буфера" всегда ноль стоял, а надо i, потому и линия получалась
и ещё вначале i=Bars-counted_bars, а не counted_bars
и всё-равно у тебя после вычитания уср. значений получится 0 .т.к BullsPbuf = BearsPbuf будет всегда
[Удален]  
Все поправил, а чтобы BullsPbuf не было равно BearsPbuf сделал два цикла. Большшое спасибо.