初学者的问题 MQL5 MT5 MetaTrader 5 - 页 466

 

向大家问好。我有这样一个问题。我有一个指标(修改过的分形图),当加载到图表上时,一切都很正确,可以正常工作,但当我试图在EA中使用它时,它说缓冲区是空的。同时,在Deinit中传递缓冲区时,它存储了正确的值。

该指标的源代码见附件。我准备听取提示和建议,我做错了什么。

该代码来自专家顾问。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Time[0] == prevtime) return;
   prevtime = Time[0];
   

   if(iCustom(NULL,0,"modify_Fractal",0,0) > 0) Print("x = ", 0, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,0));     
   if(iCustom(NULL,0,"modify_Fractal",0,2) > 0) Print("x = ", 2, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,2));
   if(iCustom(NULL,0,"modify_Fractal",0,3) > 0) Print("x = ", 3, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,3));   
   if(iCustom(NULL,0,"modify_Fractal",0,4) > 0) Print("x = ", 4, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,4));
   if(iCustom(NULL,0,"modify_Fractal",0,5) > 0) Print("x = ", 5, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,5)); 
   if(iCustom(NULL,0,"modify_Fractal",0,6) > 0) Print("x = ", 6, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,6));
   
  // тут везде 0
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      Print("Deinit Function");
      
      for (int x = 0; x < 100; x++ )
      {
         if(iCustom(NULL,0,"modify_Fractal",0,x) > 0) Print("x = ", x, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,x));
         if(iCustom(NULL,0,"modify_Fractal",1,x) > 0) Print("x = ", x, "  fractal Down: ", iCustom(NULL,0,"modify_Fractal",1,x));
      }
   // а здесь полный буфер правильных значений индикатора.
  }
附加的文件:
 
Karputov Vladimir:

你可以把结尾处的 "如果 "换成 "如果"。

(如果有这么简单的话,,:)。

谢谢

 
Maxim Dobrovolskii:

向大家问好。我有这样一个问题。我有一个指标(修改过的分形图),当加载到图表上时,一切都很正确,可以正常工作,但当我试图在EA中使用它时,它说缓冲区是空的。同时,在Deinit中传递缓冲区时,它存储了正确的值。

该指标的源代码见附件。我准备听取提示和建议,我做错了什么。

来自EA的代码。

非常粗略地看了一眼。问题:我可以在零条 上有一个分形吗?但在OnDeinit()中,你在条形图中循环,自然会找到一个分形图(而不是一个空的缓冲值)。
 
Artyom Trishkin:
非常粗略地看了一眼。问题:分形可以在零条 上吗?但在OnDeinit()中,你循环浏览条形图,当然会找到一个分形图(而不是一个空的缓冲区值)。
在Deinit中,我也是通过4-6的循环,所有东西都在它的位置上,并且有价值。
 
Maxim Dobrovolskii:
在Deinit,我也通过了4-6,一切都在它的位置上。

在OnDeinit()中,你在一个循环中(从0到100)运行,寻找一个非零值,并记录找到的值。

在OnTick()中,你试图只输出缓冲区0的最后6条。他们身上可能没有分形。

首先,找到有分形的条形,然后打印该条形的数值。

 
Artyom Trishkin:

在OnDeinit()中,你在一个循环中(从0到100)通过条形图寻找一个非零值并记录找到的值。

但是在OnTick()中,你试图只打印缓冲区0的最后6个柱子。他们身上可能没有分形。首先,找到有分形的柱子,然后打印这个柱子的值。

第6小节应该是包含分形的。

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 分形向上: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 分形向上: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 分形下跌: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6分形 向上: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Deinit函数
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi!测试开始。

这就是日志的开始。 测试开始了,专家顾问工作了,Deinit启动了,在6个位置发现了分形。



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

图像回放。

附加的文件:
 
Maxim Dobrovolskii:

第6小节应该是包含一个分形的。

2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 29 分形向上: 1.09855
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 21 分形向上: 1.09976
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 16 分形下跌: 1.09652
2015.11.01 13:19:11.023 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: x = 6分形 向上: 1.10721
2015.11.01 13:19:10.577 2015.10.30 22:54 MoneyRobotics_Proboi! EURUSD,H1: Deinit函数
2015.11.01 13:19:08.380 2015.10.01 00:00 MoneyRobotics_Proboi!测试开始。

这是日志的开始。测试的开始,专家顾问已经工作了,Deinit开始,并立即在第6个位置找到一个分形。



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

我不知道如何解决指标缓冲区的问题。

这一个。

if(Time[0] == prevtime) return;
   prevtime = Time[0];

prevtime = Time[0];

到了最后

 
Artyom Trishkin:

这一点。

在最后。

这怎么会有影响呢? 不幸的是,什么都没有改变。

我是如何想象这个过程的:指标被加载,开始检查每个tick/bar 条件,如果条件得到满足,就把数值放在选定的一个或多个缓冲区中,然后EA通过缓冲区编号调用指标,在某个偏移处取值。对吗?

 
Maxim Dobrovolskii:

这怎么能影响到它呢? 不幸的是,什么都没有改变。

我如何想象这个过程:指标被加载,开始检查每一个tick/bar的条件,如果它被满足,将值放在选定的缓冲区或缓冲区中,然后EA通过缓冲区号码调用指标,在一定的偏移量上获取值。对吗?

还有,为什么在指标中出现了一个新的栏?显然,没有什么复杂的计算方法
 
Victor Nikolaev:
为什么在指标中出现了一个新的条形 控制?显然,没有什么复杂的计算方法
在使用该指标的EA中控制一个新条形。