指标问题

 

大家好。

我正在学习一些关于数组的一般主题,这些主题来自于一个有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),只是为了玩玩这个想法。通常情况下,这些想法在EA中是可行的,但在指标中却不行

IEif(v1 > 0 && faster > slower)

但这导致了指标的消失。

许多其他的组合,我认为应该产生理想的指标,如果(其他条件)等等。
所有这些都没有产生打印语句的输出。

我在这里错过了什么呢。

请指教
谢谢





 

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(快>慢)仍然使指标消失,而且我也不能打印值。如果我声明它,并再次以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 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]=1.5996 if
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 if


 
RaptorUK:

我采用了你的代码,去掉了缓冲区 声明中的值,它工作得很好 . . .

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

------> 此时分形不一致的高点低于前低点 <---------

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

------>此时分形不一致的高点低于前低点 <---------

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 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]=1.5996 if
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 if


我也可以在不产生零值的情况下打印代码,而在另一个线程中不是这种情况。
我很抱歉,我就是不明白。我以为我明白了,但我似乎还是错过了什么。

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打印输出停止打印。我期待它能与条件一致并打印输出。

我试图为此添加额外的代码 块,结果也一样。

谢谢
 

我还写了这个 ....

RaptorUK:

指示器缓冲区是特殊的Arrays ......不要把Arrays和Buffers混为一谈,它们相似而又不同。

在原来的代码中,v1[]和v2[]是缓冲区,在你最新的代码中,它们是数组,当你声明一个数组时,你必须给它一个大小,例如,v1[50]有50个元素,从v1[0]到v1[49]。当需要更多的元素时,缓冲区会自动调整大小,并且数值会在缓冲区内自动移动。考虑到当前形成的条形图,即条形图0,当这个条形图完成后,与该条形图相关的指标值必须转移到索引1 ......这是用缓冲区自动完成的,如果你想用数组做类似的事情,你可以,但你必须自己编码。

 
Agent86:

然而,我不能添加通常会产生所需结果的额外条件,如if(快>慢)或&&快>慢。
它可以是EMA任何东西,我只是想了解它为什么不工作。
它导致指标高点消失,v1打印输出停止打印。我期待它能与条件一致并打印输出。

我试图为此添加额外的代码块,结果也一样。

谢谢

显示你的代码,那些不起作用的东西......。我不使用技术指标......,所以不要以为我知道你说的EMA等是什么意思;-)你需要向我展示你的代码。
 
RaptorUK:

我还写了这个 ....

RaptorUK:

指示器缓冲区是特殊的Arrays ......不要把Arrays和Buffers混为一谈,它们相似而又不同。

在原来的代码中,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--) ......更快更慢的 值是什么?