静态数组 ? - 页 2

 
好吧,至少我几乎是在正确的轨道上,但由于我不知道EMPTY_VALUE 和如何使用它,我在想尝试回环检测价值的变化,因为阻力和支撑价值保持不变,直到前一个指标。

总之,谢谢你,我必须在这方面多读一些书,我已经越来越接近了,但还是有点迷糊。)

似乎我花了太多时间来学习东西。我想我需要多读一些别人的代码,试着去理解它们,以获得更好的设计思路。

谢谢你的答复。
 
RaptorUK:
有2个缓冲区(数组)保存着分形的价格值 . . . val1 & val2. 如果你想找到以前的分形值,你只需循环,增加一个移位值,并检查缓冲区的值,直到找到不是EMPTY_VALUE的值 (https://docs.mql4.com/customind/SetIndexEmptyValue)
好吧,我只是在这里大声思考。

所以我可以用1+代码的东西循环回v1[i]和v2[i]。

我不明白val1>0除了High[0]以外,它不是一直大于0吗?

还有,为什么val1只标记高分形,而不是所有的High[i]'s 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:
正确的......:-)
呜呼!我很担心

谢谢你
 
我弄错了,我可以在EMPTY_VALUE中填入0,它就会连续打印出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。

经过几天的思考和尝试,我试图对指标版本进行修改,增加第三个缓冲区,并试图在图表上用价格发出信号,但这也是徒劳的。


好吧,等等,我收回这句话,短版的EA我没有EMPTY_VALUE缓冲区,所以这很可能无论如何是行不通的,所以我的想法是测试EA,这样我就可以看到打印功能,看到结果,但指标版本我必须等待,所以我必须回帖,因为事实是这样。

无论如何,这是指标版本,但我对这一点没有信心,因为我不太确定我是否应该尝试在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);
  }
//+------------------------------------------------------------------+
我现在放弃了创建第三个缓冲区/信号的尝试,只想看看我是否能打印出之前的信号的结果

我在代码中输入的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--从Bars最高点开始向下计数,那么我将简单地再向上计数,而v1[i] ==EMPTY_VALUE

我想这将使i++向上递增到前一个高点,实际上我想它会超过这个高点到下一个EMPTY_VALUE。

所以我需要以相反的方式来做这件事 v1[i] = High[i]; i++

那么这不是应该把我带到前一个高点吗,但我不确定如何正确地初始化它。

我会继续努力的。
 
我把它改成了if(我只是想在这一点上看到任何打印,这样我至少可以看到指标在做什么。

我得到的都是0,所以当=Print(v1[i])时实际上没有任何数值。
这很奇怪,因为我怎么能让指标在这一点上工作呢?

哦,好吧,我会继续努力的。
 
Agent86:
我把它改成了if(我只是想在这时看到任何打印的东西,这样我至少可以看到指标在做什么。

我得到的都是0,所以当=打印(v1[i])时,实际上没有任何数值。
这很奇怪,因为我怎么能让指标在这一点上工作呢?

哦,好吧,我会继续努力的。


也许你只是看到v1[0]的值? 同时打印i

Print ("v1[", i, "]= ", v1[i]);
 
2011.09.17 11:56:15     2011.01.03 09:24  Agent86_5min EURUSD,M5: v1[-1]= 0
hmm有趣的是
,我没有把它全部贴出来,但所有的行读数都是一样的=0

,我想我还是应该看到v1[0]的实际值?

,当指标必须是if(>0)时,它怎么可能总是0?

我可能又要进入一个我无知的领域了。

我想我可能会打印出来,这样我可能会尝试了解什么以及为什么我所有的尝试都失败了;而且我可能会以某种方式增加i++来获得下一个分形,然后以某种方式想出如何使用这些信息来做一些事情。


我可以打印High[i]或v1[i],但它总是0

打印High[0]或High[1]也是0

虽然我理解你发布的内容,打印i值似乎被卡住了,因为i--循环总是把它带到0,但即使如此它还是应该为i打印一个值,至少我认为是这样。

我明白为什么它要打印[-1],因为i=Bars。我明白这一点,但=0?