статический массив ? - страница 2

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

В любом случае, спасибо, мне придется еще почитать об этом, я подбираюсь ближе, но все еще немного туманно :)

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

Спасибо за ответ.
 
RaptorUK:
Есть 2 буфера (массива), в которых хранятся значения цен фракталов ... val1 и val2. Если вы хотите найти предыдущие значения фракталов, вы просто выполняете цикл, увеличивая значение сдвига, и проверяете значения буферов, пока не найдете те, которые не являются EMPTY_VALUE ( https://docs.mql4.com/customind/SetIndexEmptyValue ).
Ладно, просто размышляю вслух:

Итак, я могу зациклиться на v1[i] и v2[i] с помощью кода 1++,

Я не понимаю val1>0, разве оно не всегда больше 0, кроме High[0]?

И почему val1 отмечает только высокий фрактал, а не все High[i] AHHH Я думаю, что понимаю, потому что оператор if говорит ему делать только High[i].

Хорошо, давайте подумаем еще немного.

val1 - это фракталы, однако v1[i] - это только высокие значения фракталов. Хорошо, думаю, я разобрался с этой частью.

Тогда я могу зациклить v1[i] 1++ каким-то образом (мне придется разобраться с этой частью) до предыдущей точки перед EMPTY_VALUE, и это будет предыдущий High[i] фрактал.

Я приближаюсь к цели?
 
Agent86:
Ладно, просто размышляю вслух:

val1 - это фракталы, однако v1[i] - это только максимумы фракталов. Я думаю, что я разобрался с этой частью.

Тогда я могу зациклить v1[i] 1++ каким-то образом (мне придется разобраться с этой частью) до предыдущей точки перед EMPTY_VALUE, и это будет предыдущий High[i] фрактал.

Я приближаюсь к цели?
Правильно... :-)
 
RaptorUK:
Правильно... :-)
Фух! Я волновался.

Спасибо
 
Я что-то напутал, я могу поставить 0 для EMPTY_VALUE и он постоянно печатает 0, так что это не правильно, ну может это и правильно, но не мой желаемый эффект.

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

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                                    Unfinished POS |
//|                                    
//+------------------------------------------------------------------+
#property copyright "Unfinished POS by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=15.0;
extern int MagicNumber=123486;

double v1[];
double v2[];
double val1;
double val2;

//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
   
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
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;         
   
   while(i>=0)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0) v1[i]=High[i];
      else          v1[i]=v1[i+1];

      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0) v2[i]=Low[i];
      else          v2[i]=v2[i+1];
      
      i--;
     }
   
    for(val1=High[i]; v1[i] == EMPTY_VALUE ;i++)
      {
      Print (v1[i]);
      } 
  
//----
            
                       
            

           

//---- 

 
                    
        

                
   return(0);
  }    

//+------------------------------------------------------------------+
Я думал, что цикл for вернет меня назад только на один сигнал и напечатает уровень сигнала для меня. но я не получаю ничего или 0.

После нескольких дней обдумывания и перепробования многих вещей, я попытался внести эти изменения в версию индикатора, добавив 3-й буфер и попытавшись сигнализировать ценой на графиках, но и это не помогло.


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

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

//+------------------------------------------------------------------+
//|                Support and Resistance                            |
//|                Copyright © 2004/5     Barry Stander              |
//|                http://www.4Africa.net/4meta/                     |
//+------------------------------------------------------------------+

#property copyright "Support and Resistance             Barry_Stander_4@yahoo.com"
#property link      "http://www.4Africa.net/4meta/"
#property indicator_chart_window
#property indicator_buffers 2
#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(2);

   SetIndexArrow(0, 159);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");
   SetIndexEmptyValue(0,0.0);

   SetIndexArrow(1, 159);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");
   SetIndexEmptyValue(1,0.0);
   
   SetIndexArrow(2, 225);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A");
   SetIndexEmptyValue(2,0.0); 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   
   
   int i=Bars;
//----
   while(i>=0)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0) v1[i]=High[i];
      else          v1[i]=v1[i+1];

      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0) v2[i]=Low[i];
      else          v2[i]=v2[i+1];
      
      i--;      
       
      }
      
     
     for(val1=High[i]; v1[i] == 0 ;i++)  // or v1[i] == EMPTY_VALUE
      {
      Print (v1[i]);
      }
       
     
     
     
//----
   return(0);
  }
//+------------------------------------------------------------------+
В общем, я пока оставил попытки создать 3-й буфер/сигнал и просто хочу посмотреть, смогу ли я вывести результат предыдущего сигнала

EMPTY_VALUE, как я ввел код, инициализирует индикатор, но это все, что ничего не печатает.
 

Не могли бы вы объяснить, как работает этот цикл for?

for(val1=High[i]; v1[i] == 0 ;i++)

 
RaptorUK:

Не могли бы вы объяснить, как работает этот цикл for?

for(val1=High[i]; v1[i] == 0 ;i++)

Наверное, я подумал, что поскольку оператор while и v1[i] хранят максимумы, а i -- отсчитывает вниз от самого высокого уровня Барса, то я просто буду отсчитывать снова вверх while v1[i] == EMPTY_VALUE.

Я думал, что это увеличит i++ на 1 уровень до предыдущего максимума, ну, на самом деле, я думаю, что это перейдет к следующему EMPTY_VALUE.

Поэтому мне нужно сделать это наоборот v1[i] = High[i]; i++

Тогда это не должно привести меня к предыдущему High, но я не уверен, как правильно инициализировать его.

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

Все, что я получаю, это 0, так что на самом деле нет никаких значений, когда = Print (v1[i]);
Что странно, потому что как тогда индикатор вообще работает в этот момент?

Ну ладно, буду продолжать.
 
Agent86:
Я меняю его на if( Я просто хочу увидеть хоть что-то, что печатается в этот момент, чтобы я мог хотя бы увидеть, что делает индикатор.

Все, что я получаю, это 0, так что на самом деле нет никаких значений, когда = Print (v1[i]);
Что странно, потому что как тогда индикатор вообще работает в этот момент?

Ну ладно, буду продолжать.


Может быть, вы просто видите значения для v1[0] ? print i в то же время...

Print ("v1[", i, "]= ", v1[i]);
 
2011.09.17 11:56:15     2011.01.03 09:24  Agent86_5min EURUSD,M5: v1[-1]= 0
хмм интересно
я не все выложил, но все строки читаются одинаково = 0

я думал я все же должен увидеть фактическое значение для v1[0] ?

как оно может быть всегда 0, когда индикатор должен быть if(>0) ?

Возможно, я попадаю в еще одну область, в которой я невежественен.

Я думал, что смогу распечатать, чтобы попытаться понять, что и почему все мои попытки терпят неудачу; и чтобы я мог увеличить i++ каким-то образом, чтобы добраться до следующего фрактала, а затем как-то понять, как использовать эту информацию для чего-то.


Я могу напечатать High[i] или v1[i] и это всегда 0

Печать High[0] или High[1] тоже 0

Хотя я понимаю, что вы написали и печать значения i, которое, кажется, застряло из-за цикла i--, который всегда возвращает его к 0, но даже в этом случае он должен печатать значение для i, по крайней мере, я думал.

И я понимаю, почему он печатает [-1], потому что i=Bars. Это я понял, но =0?




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