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

 
Artyom Trishkin:

在OnInit()中调用符号的时间序列:iTime(Symbol,Timeframe,1)。

在OnTick()的最开始,通过相应的iFunc()询问需要的时间序列的需要的条,或者如果(iTime(Symbol,Timeframe,10)==0)返回。

在这种情况下,专家顾问将不会检测到一个新的条形图,而会等待下一个刻度。

在OnInit()中,我们已经请求了时间序列数据,从而激活了数据分页。

在OnTick()中,我们检查EA是否有最低要求的历史记录,如果还没有,我们就等待下一个tick。

而在收到专家顾问所需的所有数据之前,它将等待下一个刻度。

一旦所有必要的数据被抽出并获得,专家顾问将开始在新的条形图和所需的历史中工作。

为了保持串行数据的更新,请确保至少每两分钟访问一次。做一个大约一分半钟(90秒)的第二个计时器,在其中简单地访问所需符号的任何时间序列,例如iTime(Symbol,Timeframe,1); 不检查收到的数据 - 只是 "移动 "历史。那么符号上的所有数据将始终是最新的。

当然,我将尝试使用所有的TFs来检查新的条形图,但它不是同步的,这不是MT4。问题不在于条形图,而在于从指标中调用的指标的不性能,而指标又是从专家顾问中调用的。

我是按会议记录工作的,所以历史记录应该永远是最新的。

而且,所有这些检查都是为测试而做的,它们只会减慢真实账户的工作速度,因为那里的一切工作都比在测试者的固定条件下要慢,我重申,在真实账户 上,该指标工作正常。

 

到目前为止,我已经通过检查在主代码开始工作之前失败的指标的准备情况来解决这个问题

//При появлении нового бара проверяем корректность расчета индикаторов
      if(isNewBar_Predv_Calc_Ind()==true)Predv_Calc_Ind=true;
      if(Predv_Calc_Ind==true)
      {
      double arr_DonUp=ZZ_Vibor(0,2,0);
      double arr_DonDown=ZZ_Vibor(0,3,0);
      double arr_DonUp_m2=ZZ_Vibor(1,2,0);
      double arr_DonDown_m2=ZZ_Vibor(1,3,0);
      double arr_DonUp_m5=ZZ_Vibor(2,2,0);
      double arr_DonDown_m5=ZZ_Vibor(2,3,0);
      double arr_DonUp_m15=ZZ_Vibor(3,2,0);
      double arr_DonDown_m15=ZZ_Vibor(3,3,0);
      if (arr_DonUp<1     || arr_DonDown<1    ||
          arr_DonUp_m2<1  || arr_DonDown_m2<1 ||
          arr_DonUp_m5<1  || arr_DonDown_m5<1 ||
          arr_DonUp_m15<1 || arr_DonDown_m15<1
         )return;
      else{Predv_Calc_Ind=false;}      
      }
//Операции выполняются только при появлении следующего бара   
   if(!isNewBar()) return;

但这种方法并不通用,因为你需要列出所有的指标,是否有另一种更通用的方法来使测试器环境正确工作?

 
Artyom Trishkin:

在OnTick()中,我们检查专家顾问是否有最低要求的历史记录,如果还没有,我们就等待下一个刻度。

而在获得专家顾问所需的所有数据之前,它将等待下一个刻度。

一旦所有必要的数据被抽出并获得,专家顾问将开始使用新的条形图和所需的历史数据。

你建议如何检查历史的可用性,我不明白...

 
fxsaber:

在MQL4函数前添加这一行

并能在MT5中工作。

这是个天才。非常感谢您!

 
你好,我是一个年轻的退休人员,想在MT5中制作这样的按钮。

你能告诉MT5能实现这样的按钮吗,也许已经有一个了,分享一下代码吧...


按钮"开始"和按钮"关闭所有订单"。MT5,所有货币对,所有时间段,4/5标志。初始手数0.01,包括美分。
为滑移和重新报价做准备。

开始 "按钮的功能
一旦你手动解开了Fibo,你应该在BAY或SELL中按当前价格一次性开出1到11个订单。
如果你之前在设置中选择了多少个和哪些订单(1、2、5、7或全部11个)应该在展开的菲波方向开仓。
在设置中,可以指定每个订单的手动手数,或动态地增加/减少手数。

TP - 止盈 是按升序设置的,从1到11个订单,在61.8;78.6;100.0的费波水平。
161.8; 185.4; 200.0; 261.8; 285.0; 423.6; 561,8; 685.4

SL - 止损 的大小为-2个点差(自动计算),从菲波零线开始

TS - 跟踪止损 将所有订单拉到它后面。
1.如果价格已经达到61.8水平,跟踪止损将所有订单的SL移至38.2+2价差。
2.如果价格达到100.0水平,跟踪止损将所有剩余订单的SL移至50.0水平+2个点差。
3. 如果价格达到161.8水平,所有剩余订单的追踪SL为78.6+2的价差。
4.当价格达到261.8水平时,所有剩余订单的追踪SL到100.0+2价差水平。
5.当价格达到423.6水平时,所有剩余订单的追踪SL到200.0+2价差水平。
6.如果价格已经达到561.8,则将所有剩余订单的SL追踪到423.6+2价差水平。

关闭所有订单 "按钮的功能 是强行关闭所有订单。
 

你好,如果CSymbolInfo类中 的Ask和Bid价格或多或少是清楚的,那么如何获得例如SessionInterest或SessionBuyOrdersVolume或SessionPriceLimitMin,它给出了零,我不明白为什么...

 
Александр Юрин:

你好,如果从CSymbolInfo类中 的Ask和Bid价格或多或少是清楚的,如何获得例如SessionInterest或SessionBuyOrdersVolume或SessionPriceLimitMin,它给出了零,我不明白为什么...

如果交易服务器广播了这一信息,你就会收到它。

通常情况下,这种信息是由经纪商为股票符号广播的(不要混淆经纪商和交易中心)。

 
Vladimir Karputov:

如果一个交易服务器广播了这一信息,你将会收到它。

这种信息通常由经纪人为交易所符号广播(不要混淆经纪人和交易中心)。

经纪人Otkritie,RTS指数期货,我假设必须至少广播SessionPriceLimitMin和SessionPriceLimitMax(因为据我了解,它们是市场订单中使用的开盘价)。开头不是翻译了...例如,我开的处方。

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - 来自你的EA

我在日志中只得到了Ask价格

附加的文件:
y2a4cgbfjw.png  63 kb
 

请帮助编写一段代码,以正确地确定任何TF中的最后一个条形图的日期,精确到当前TF。

int              N_bar=iBarShift(Symbol(),PERIOD_CURRENT,iTime(Symbol(),PERIOD_H1,0));//номер текущего бара
datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,N_bar+1);//только для минуток и то может быть не корректно!

Print("StopDt_Shift=",TimeToString(StopDt,TIME_DATE|TIME_MINUTES));

这段代码通常是有效的,但只有在当前条形图的开始时间与实际条形图(四舍五入到分钟)相吻合的情况下,因为我当前的图表是M1。而如果它不吻合,那么就会发生各种意外,这取决于不同的TFs。例如,我需要知道最近一个小时的M1小节的开始日期,如果是12点没有问题,时间将是12:59,但如果是13点,将是13:58,因为小时小节是在14:05打开的,而不是在14:00,iBarShift 函数返回离14:00最近的小节,即13:59。

新增内容: 做了这个,似乎可以用

datetime         StopDt=iTime(Symbol(),PERIOD_CURRENT,Bars(Symbol(),PERIOD_CURRENT,iTime(Symbol(),TF_iDeltaP,_Shift-1),iTime(Symbol(),PERIOD_CURRENT,0)));
 
Александр Юрин:

Otkritie经纪商,RTS指数期货,我假设它至少应该广播SessionPriceLimitMin和SessionPriceLimitMax(据我所知,它们是按开盘价 用于市场订单的)。开头不是翻译了...例如,我开的处方。

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - 来自你的EA

我在日志中只得到了Ask价格

该服务器是真实的还是演示的?