Индикаторный вопрос

 

Привет всем,

Я изучал некоторые общие темы о массивах из кодовой базы индикатора, который имеет iFractals с большой помощью гуру на форумах.


Как бы то ни было

Я не смог добавить условные операторы или логические операции, чтобы добавить функцию сложения в индикатор.

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[1000];
double v2[1000];
double v3[1000];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
  
   
   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0)
         {        
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

Я попробовал вставить if(faster > slower) в различные области кода, просто чтобы поиграть с идеей. Обычно эти идеи работают в советнике, но не в индикаторе.

IE if(v1 > 0 && faster > slower)

но это приводит к исчезновению индикатора.

Множество других комбинаций, которые, как я думал, должны привести к желаемому индикатору if(other conditions) и так далее.
Все они не приводят к выводу оператора печати.

Какой момент я упускаю.

Пожалуйста, посоветуйте.
Спасибо





 

double v1[1000];
double v2[1000];
double v3[1000];<------ leave out the '1000' initialization for indicator buffers, as they don't require 

 
diostar:


Сначала я так и сделал, но потом не смог вывести значения буфера, что я и хотел сделать

Подождите, позвольте мне переформулировать:

Если я не объявлю количество элементов в буфере, то индикатор будет работать как в случае v1[i]=High[i]
Но Print (v1[i]); не будет выводиться, потому что, насколько я могу судить, нет способа вывести значения необъявленного массива, если количество элементов не было объявлено, таким образом, он всегда будет печатать 0

Итак, если я не объявляю его глобально, то индикатор работает, однако if(faster>slower) по-прежнему заставляет индикатор исчезнуть, И я также не могу вывести значения.

Если я объявляю его, а также повторно инициализирую с v1[i]=High[i], то я могу печатать, однако любые дополнения, такие как && faster > slower, снова удаляют индикатор.

Я не совсем понимаю почему.

Спасибо
 

Я взял ваш код, убрал значения из объявлений буфера и он работает просто отлично. ...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 если
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 если
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 если


 
RaptorUK:

Я взял ваш код, убрал значения из объявлений буфера и он работает просто отлично. ...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if <----High

------> в это время фракталы несовместимого High ниже предыдущего Low <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if <----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if<----High

------> в это время Fractals inconsistent High ниже предыдущего Low <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if<----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if<----High

------> в это время чередующиеся фракталы последовательны <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if<----Low
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if<----High


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

 
RaptorUK:

Я взял ваш код, убрал значения из объявлений буферов, и он работает просто отлично...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 если
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 если
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 если


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

int start()
   {
   double test[];
   
   test[39] = 45.6;
   Print("test[39]= ",test[39] );
   

      return(0);
   }
Вы проинструктировали меня объявить, как указано выше:

И вы процитировали эту тему:

Когда вы читали книгу о массивах, вы видели, где там написано это?

"При объявлении массива должны быть указаны тип данных, имя массива и количество элементов каждого измерения:".

Итак, с одной стороны, я не могу распечатать массив, как в этом сценарии, не объявив сначала double test[40]; как вы указали, но теперь, похоже, я могу распечатать и без объявления.

Таким образом, получается, что я могу печатать значения в буфере независимо от объявления.

Однако я не могу добавить дополнительные условия, которые обычно дают желаемый результат, такие как if(faster > slower) или && faster > slower.
Это может быть EMA, что угодно, я просто хочу понять, почему это не работает.
Это приводит к тому, что максимумы индикатора исчезают, а вывод v1 print перестает печататься. Я ожидал, что он будет соответствовать условию и печатать вывод.

Я пытался добавить дополнительные блоки кода для этого и с теми же результатами.

Спасибо
 

Я также написал следующее...

RaptorUK:

Индикаторные буферы - это специальные массивы ... не путайте массивы и буферы, они похожи и в то же время различны.

В оригинальном коде v1[] и v2[] - это буферы, в вашем последнем коде - это массивы, когда вы объявляете массив, вы должны указать его размер, например, v1[50] имеет 50 элементов от v1[0] до v1[49]. Буфер автоматически изменяет размер, когда требуется больше элементов, и значения автоматически смещаются в буфере. Рассмотрим текущий формирующийся бар, бар 0, когда этот бар завершается, значение индикатора, связанное с этим баром, должно переместиться на индекс 1 ... это делается автоматически с помощью буферов ... если вы хотите сделать что-то подобное с массивами, вы можете, но вам придется кодировать это самостоятельно.

 
Agent86:

Однако я не могу добавить дополнительные условия, которые обычно дают желаемый результат, например if(faster > slower) или && faster > slower.
Это может быть EMA, что угодно, я просто хочу понять, почему это не работает.
Это приводит к тому, что максимумы индикатора исчезают, а вывод v1 print перестает печататься. Я ожидал, что он будет соответствовать условию и печатать вывод.

Я пытался добавить дополнительные блоки кода для этого и с теми же результатами.

Спасибо

Покажите свой код, то, что не работает... Я не использую технические индикаторы... никогда, поэтому не думайте, что я знаю, что вы имеете в виду с EMAs и т.д. ;-) вам нужно показать мне ваш код.
 
RaptorUK:

Я также написал следующее...

RaptorUK:

Индикаторные буферы - это специальные массивы ... не путайте массивы и буферы, они похожи и в то же время различны.

В оригинальном коде v1[] и v2[] - это буферы, в вашем последнем коде - это массивы, когда вы объявляете массив, вы должны указать его размер, например, v1[50] имеет 50 элементов от v1[0] до v1[49]. Буфер автоматически изменяет размер, когда требуется больше элементов, и значения автоматически смещаются в буфере. Рассмотрим текущий формирующийся бар, бар 0, когда этот бар завершается, значение индикатора, связанное с этим баром, должно переместиться на индекс 1 ... это делается автоматически с помощью буферов ... если вы хотите сделать что-то подобное с массивами, вы можете, но вам придется кодировать это самостоятельно.

Верно. "Похожи, но разные". Я не вижу других лучших способов сказать, чем этот.
 
Хорошо, похожее, но другое Я понял, у меня изначально были большие проблемы даже с печатью v1[i] в любой точке кода, но теперь кажется, что печатается так, как я ожидал изначально.
Я создал вторичный цикл только потому, что не мог напечатать в первом индикаторном цикле, но теперь он печатает.
В любом случае, я не буду повторять это, я думаю, что понял.

Итак, код, который не будет работать - это несколько примеров, показанных здесь:

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
  
   
   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0 && faster > slower) 
         // I think I need to add some more comparisons for the Low[i] also
         // the comparison works but shows indicator when faster < slower too.
         // adding additional code blocks instead of above and including the part below and inserting this instead 
         //                                               if(faster>slower)
         //                                                     {
         //                                                      v1[i]=High[i];
         //                                                     }
         //                                                      causes indicator to disappear
         
         {                             
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

Спасибо

 
Agent86:

Итак, код, который не будет работать - это несколько примеров, показанных здесь:

Спасибо

Хорошо, я могу сказать вам, в чем ваша проблема, или я могу дать вам несколько подсказок. ... сначала подсказки, если вы хотите, чтобы я сказал вам, просто скажите, и я скажу вам. .

Внутри цикла, for(i=Bars; i>=0; i--) ... какие значения для быстрее и медленнее?

Причина обращения: