指标问题 - 页 7

 
这是关于范围和最后设定的值。 所有这些变量的作用域至少是它们所在的函数,如果它们是全局声明的,那么它们的作用域就在该函数之外。 如果一个变量的值在一个循环中改变了3次,你就不能从循环外获得它被设置的第二个值,因为当循环外的代码被执行时,该变量已经被设置为第三个值。
 
如果我使用像这样的东西

让我们说我用shift 3声明val1
,然后循环当然是shift i

如果我在循环之外引用val1,我是在说val1全局还是val1循环?

我想我在想,我是否应该为我的if语句添加一个单独的全局分形,如val3和val4或其他东西

我在这里有点卡住了,但看起来ABCD方案至少有了一点进展

总之,这里是代码,有什么想法?

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                                    Unfinished POS |
//|                      my attempt at an ABCD scheme and fib retrace | 
//+------------------------------------------------------------------+
#property copyright "Unfinished POS by Agent86"


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

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()
  {
   
        
   int i=0;                
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 
  


for(i=0; val1==0 || val2==0; i++)
     {
     if(iFractals(NULL, 0, MODE_UPPER,i) > 0 && val1 == 0) 
     val1 = iFractals(NULL, 0, MODE_UPPER, i);
     if(iFractals(NULL, 0, MODE_LOWER, i) > 0 && val2 == 0)
     val2 = iFractals(NULL, 0, MODE_LOWER, i);
     double A = val2;
     if(A !=0) 
     Print (A, " A loop down");
     double a = val1;
     if(a !=0)
     Print (a, " a loop up");
      
     //Print (" Last UPPER Fractal at ", val1, " Last LOWER Fractal at ", val2);
         
     }   
                            
      if(val1 > 0)
         {
         //Print (val1, " val1");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val1 time");      
         //datetime b = Time[3];
         ////Print (A, " A if");
         double Z=(val1-A)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double C=A+Z; //using the calc above to get the retrace value at .50
         //Print (C, " C");
         if(Bid<=C && Bid > A) //C will be somewhere in between here
         Print (Low[0], " Low [0] ", C, " = C");
         // some other signal here to trade at retrace
         }        
         
         

      if(val2 < 0)
         {
         //Print (val2, " val2");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val2 time");
         //datetime c = Time[3];
         //Print(a, " a");
         double z=(a-val2)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double c=a+z; //using the calc above to get the retrace value at .50
         //Print (c, " c");
         if(Bid<=c && c < a) //c will be somewhere in between here
         Print (Low[0], " Low [0] ", c, " = c");
         //some other signal here to trade at retrace
         }
         
                   
                
   return(0);
  }    

//+------------------------------------------------------------------+


所以A将是之前的低点,而val1应该是当前的移位3,a和val2也是如此

我必须再重新测试一下,以确定A和a指的是正确的值,因为我加入了!=0语句,这样它就不会打印空值了。
乍一看似乎没有问题,但我需要重新确认一下

,总之要重述一下。
我的if(语句)中的val1是否正确指的是正确的条件,还是我需要一个完全不同的iFractal来指的是shift 3
我真的无法判断它是否工作正常,它似乎在工作,但有些东西似乎不对,我无法退出我的手指来。

请指教

谢谢

虽然这真的不是一个指标性的话题了,但我应该把它移到一个新的话题上吗?

 
Agent86:
如果我使用像这样的东西

让我们说我用shift 3声明val1
然后循环当然是shift i

如果我在循环外引用val1,我是在谈论val1全局还是val1循环?

我想知道我是否应该为我的if语句添加一个单独的全局分形,如val3和val4或其他东西。

val1和val2 是在全局范围内声明的,i 是在start()中本地声明的。

循环内或循环外的val1和val2都有最后分配给它们的值 ......这发生在循环之前,然后这些值可能 循环 被改变 ......一旦循环退出,这些值就是它们现在的样子,并保持这种状态直到下次调用start(),然后它们被重置,然后可能在循环内被修改 ......等等。

 
RaptorUK:

val1和val2 是在全局范围内声明的,i 是在start()中本地声明的。

循环内部或外部的val1和val2具有最后分配给它们的值 ......这发生在循环之前,然后这些值可能 循环 被改变 ......一旦循环退出,这些值就是它们现在的样子,直到下次调用start(),然后它们被重置,然后可能在循环内被修改 ......等等。

嗯,所以决定决定。

我可以尝试在循环中追寻这些值,然后再次重新声明val1和val2=iFractal,,3。重置事情,但只是在我声明A=val2和a=val1之后,这样我就有了这些值,如果我有这个权利的话,希望是我之前的分形

或者我可以在循环外重新声明val1和val2,但我不想丢失A或a的值,所以我想我必须在适当的时候解决这个问题。

我也可能是把这一切都弄错了,但没有关系。总得从某个地方开始,所以我现在选择了这个;当我获得更多经验时,我可以调整它。

谢谢你的帮助
 
所以这些都是无关紧要的?

val1=iFractals(NULL, 0, MODE_UPPER,3);
val2=iFractals(NULL, 0, MODE_LOWER,3);

 

我想我应该把这些改为val3和val4,以便使用实际的iFractal进行交易,并且只参考和使用(A)和(a)来参考我以前的分形


我将继续努力

谢谢

 
好的

经过几天的思考和尝试,我认为我现在有了一个更好的工作代码,虽然不是很完美,但也在不断进步。

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                              Unfinished POS slate |
//|                                           See progress notes below |
//+------------------------------------------------------------------+
#property copyright "Unfinished POS slate by Agent86"


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

double val1;
double val2;
bool traded = false;

//++++ 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()
  {
   
        
   int i=0;
   int ticket,total,result;
   total = OrdersTotal();                 
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 


     
     if(val1 > 0 && traded == false)
      { 
      // in the absence of an && indicator above I get continous print statements
      // with indicator added && indicator above, then it prints A and B once as it should ???
      // I need to work this out so it won't print all the time aka trade all the time
      // A and B first values seems to initialize the whole block
      // just a reminder that they time stamps coordinate after this FYI
      // now work on C retrace and possibly signals
      // add options for user to select some candle patterns
      // add options to select indicators
      // add bells and whistles to make things fun
      // alerts,sounds,maybe poppup video animation or something
      
      double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
     
                    
                
   return(0);
  }    

//+------------------------------------------------------------------+


      

所以我有我的A和B值,当一个指标语句被放置在最初的if(语句&&指标)中时,这些值会被打印一次,例如MACD更快>更慢或一些类似的指标语句。

所以我只得到我想要的A和B。

我不知道为什么当指标选项从我的if(语句)中拿出来时,会打印多次。

总之,我对这个ABCD类型的方案越来越接近了,它也可以用于其他指标,而不仅仅是分形等,供以后 参考。

请指教

谢谢

 

这可能对你有所帮助。这是一个访问最后一个分形和移位的指标,所以你可以用它来计算你的ABCD。

iCustom(Symbol(),0,"Fractal Store",0,"",0,0)

这将提供上层分 形。把""改成 "L "表示下层分形。

iCustom(Symbol(),0,"Fractal Store",1,"",0,0)

将给出最近一次分形之前的分形。

附加的文件:
 
heelflip43:

这可能对你有所帮助。这是一个访问最后一个分形和移位的指标,所以你可以用它来计算你的ABCD。

这将提供上层分形。把""改成 "L "表示下层分形。

将给出最近一次分形之前的分形。

是的,我看到

在我在这个主题中的最新代码之前,我在一些帮助下研究出了一些不同的(for)语句,这也是我能够在缓冲区中画出我想要的东西的一个指标,然而这给我带来了另一个问题,即试图提取数值,并且只打印一次这些数值,以便使用或参考。

因为这些不同的for语句给我带来了问题,而且这些问题与你发布的代码相似。
我一直无法在不不断打印数值的情况下获得这些数值,而这些数值每次都会变成 "真"。
我已经解决了一些问题,但仍然没有真正学会如何在一个条件为真时停止。

我在你的代码中看到一个可能有帮助的东西,那就是静态数据块,我以前只用过一次,只在新的条形图和新的条形图时间出现时才引用这个条件。
这一部分可能对我的工作有帮助。尽管我目前的代码确实产生了当前的分形和之前的分形,但目前它是有效的

我唯一的问题是,一旦条件为真,它就会连续打印出声明,这可能是好的,但这意味着一旦我达到这个点,它也可能连续进行交易。

也许我需要更多关于如何使用iCustom指标 的经验,这可能会解决我的很多问题,但我的学习还没到那个程度。

我会再审查一下这段代码,还有EMPTY_VALUE部分。现在我看到这一点在使用,我也可以从中学习。以前有人提出过这个建议,但我一直不明白如何使用它。

我会继续努力的
谢谢你的帮助
 
最后我注意到,当我把MACD 添加到if(val1 > 0 && faster > slower && traded == false)

,然后它就工作了,而且只给出我想要的东西,即打印A低点、B高点,然后和/或B低点和A高点

但是,如果我把这两个if语句中的faster > slower和faster < slower拿掉,那么我注意到它永远不会打印出A高点,也会连续打印出其他的高点,这让我感到很困惑。


我将继续努力,我确信我需要让它在EA中没有其他指标语句的情况下打印一次语句,这样我就知道指标不会干扰代码的ABCD部分 。




 

我认为你的问题在于你没有重置val1和val2。所以一旦你找到了高点和最后的低点,你就需要重置它们。

double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               //Print("i "+i);
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 

     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
希望这能有所帮助。