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

 
Sayberix:

我正在读。只是还没有到那一步,我想。我认为要读懂一个28MB的pdf参考资料并不容易。或者换一种说法--并非所有教友都知道整本圣经,即使他们是虔诚的信徒。

我还有一个问题,请告知--如果不难的话。

当在策略可视化器中执行代码时。

1.程序进入无限循环。

2.执行的结果是不同的。

没有断点。

在打印时有断点。


都是在调试历史数据上完成的。

你在不断增加变量。你认为:什么时候变量的大小会超过其极限?

 
Vladimir Karputov:

你在不断增加变量的大小。你认为:什么时候变量的大小会超过其极限?

我认为乌龙的 10次迭代应该已经足够了。那么问题来了。

1.为什么循环没有断裂?

2.为什么不显示迭代时间计数器本身的结果?


是不是因为调试是在历史数据上进行的?

 
Sayberix:

我认为,对于10次迭代来说,乌龙 应该已经足够了。那么问题来了。

1.为什么循环没有断裂?

2.为什么不显示迭代时间计数器本身的结果?


是因为对历史数据进行调试吗?

你有一个在全局程序级别声明的变量--你在不断地增加它。

 
哦,我明白了...迭代的时间不到一毫秒......
 
Vladimir Karputov:

你有一个在全局程序层面声明的变量--你在不断地增加它。

我还是不明白全局变量 与此有什么关系。程序本身只限于一个循环:"for(int i=1; i<=10; i++)" ?

或者是我不明白的地方,请解释。

 
Sayberix:

我还是不明白全局变量 与此有什么关系。程序本身只限于一个循环:"for(int i=1; i<=10; i++)" ?

或者是我不明白的地方,请解释。

删除变量

ulong count, raschet = 1;

超出全球范围。


在每一个刻度上,你都会重复地增加raschet变量。而在下一次打勾时,你继续将其增加数倍。几下子,拉舍特 变量就超出了范围最终你打印出了变量的值,但由于某些原因没有看打印出来的结果。

 
Vladimir Karputov:

删除变量

从全局范围来看。


在每一次打勾时,你都会重复地增加raschet变量。而在下一次打勾时,你继续重复增加它。几下子,拉舍特 变量就超出了范围最后你打印出了变量的值,但由于某种原因没有看打印出来的结果。

谢谢,我明白了。我只是被搞糊涂了,以为return会完全停止程序,而它只是中断了当前tick的执行。我把 "返回;"改为"ExpertRemove();"。

 

你能告诉我在这个代码中。

//+------------------------------------------------------------------+
//|                                                          env.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property indicator_buffers 2

int envHandle;
double upperEnv[], lowerEnv[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   envHandle = iCustom(_Symbol,_Period,"Examples\\Envelopes",3,0,MODE_LWMA,PRICE_OPEN,0.03);
   if(envHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,upperEnv,INDICATOR_DATA);
   SetIndexBuffer(1,lowerEnv,INDICATOR_DATA);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(envHandle);
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {

   ArraySetAsSeries(upperEnv, true);
   ArraySetAsSeries(lowerEnv, true);

   if((CopyBuffer(envHandle,0,0,3,upperEnv)<0) || CopyBuffer(envHandle,1,0,3,lowerEnv)<0)
      Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");

   double   upEnv = upperEnv[0];
   double   lowEnv = lowerEnv[0];
  }
//+------------------------------------------------------------------+

我怎样才能在变量upEnv和lowEnv中获得不断更新的信封 线的价格值?它画出了指标,但变量中的指标值被更新2次,仅此而已。

 
Sayberix:

你能告诉我这个代码吗?

我怎样才能在变量upEnv和lowEnv中获得不断更新的信封线的价格值?它画出了指标,但变量中的指标值被更新2次,仅此而已。

首先,决定:你想写一个专家顾问 还是一个指标?(你现在有一个混合的代码--指标和专家顾问混在一起)--也就是说,该代码将无法工作。

提示:使用MQL向导来创建一个模板。

 
Vladimir Karputov:

首先下定决心:你想写一个EA 还是一个指标?(现在你的代码是一团糟--指标和专家顾问都混在一起)--也就是说,代码是不可行的。

提示:使用MQL向导来创建一个模板。

我已经试过了。但它在Wizard中生成了类。我希望至少能以简单的方式理解代码--代码我至少能理解一点。能否请您告知如何纠正代码,以便在EA中获得指标值?