新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 580

 
你好!请帮助我解决一个问题。我需要从一个EA获取不同符号/TF的数据。手册说:"访问服务器获取数据的机制并不取决于请求是如何发起的--由用户在浏览图表时或由MQL4中的程序发起 的"。然而,在实践中,如果在实时,例如,如果我们跟踪一个 不同于EA运行的符号/TF的条数,会发生以下情况新的符号在第一次访问时加载了少量的条形图(M1约为1000条),这个数字不会改变。我试着用不同的函数来访问时间序列,我试着在历史上指定比现在加载的更深的条形和时间的位移,我试着移动ChartNavigate(_ID, CHART_BEGIN)--新的数据没有被加载,条形的数量也没有变化。然而,如果我从同一个专家顾问中以编程方式打开一个窗口(我之前已经为ChartNavigate()函数打开了它),并使用箭头/Home/PgUp按钮将图表向左移动,会导致时间序列数组的增加,条数实时增加,即数据被加载。要以编程方式加载历史记录而不按键盘上的物理键,需要做什么?谢谢)
 
Ihor Herasko:

就这样做吧。该代码几乎是正确的。只缺一个字。

谢谢你!
 
Alexandr Mordashov:
你好!帮我解决这个问题。我需要从一个EA获取不同符号/TF的数据。帮助说:"访问服务器获取数据的机制并不取决于请求是如何发起的--由用户在浏览图表时或由MQL4中的程序发起 的"。然而,在实践中,如果在实时,例如,如果我们跟踪一个 不同于EA运行的符号/TF的条数,会发生以下情况新的符号在第一次访问时加载了少量的条形图(M1约为1000条),这个数字不会改变。我试着用不同的函数来访问时间序列,我试着在历史上指定比现在加载的更深的条形和时间的位移,我试着移动ChartNavigate(_ID, CHART_BEGIN)--新的数据没有被加载,条形的数量也没有变化。然而,如果我从同一个专家顾问程序性地打开一个窗口(我已经为ChartNavigate()函数打开了它),并使用箭头/主页/PgUp按钮向左移动图表,它导致了时间序列数组的增加,条数实时增加,即数据被加载。要以编程方式加载历史记录而不按键盘上的物理键,需要做什么?谢谢)

你必须对这个问题更加明确。如果不提出问题,就无法解决。

 
Galim_V:
你能告诉我如何从猫头鹰盘旋的时间框架以外的时间框架获得底部指标吗?
double iRev()
{
 static int wtf;
 static int tf;  
 int xtf =Period();       // таймфрейм текущего графика 
 
                          //PERIOD_CURRENT;
 if(xtf != PERIOD_CURRENT)
 {
 Print("xtf  ",xtf);
   switch(xtf)
   {
    case 1: tf = PERIOD_H1;
    break;
    case 5: tf = PERIOD_H4; wtf = PERIOD_H1;
    break;
    case 15: tf = PERIOD_D1;
    break;
   }
     
 }
Print("tf == ",tf,"wtf ==",wtf);
 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
   if(iRa != 0) ObjectCreate("Ra",OBJ_HLINE,0,Time[0],iRa,0,0);
     
     ObjectSet("Ra",OBJPROP_TIME1,Time[0]);
     ObjectSet("Ra",OBJPROP_PRICE1,iRa);
   
   if(wRa != 0) ObjectCreate("weRa",OBJ_HLINE,0,Time[0],wRa,0,0); 
     ObjectSet("weRa",OBJPROP_TIME1,Time[0]);
     ObjectSet("weRa",OBJPROP_PRICE1,wRa); 
    
     
  Print("iRa   ",iRa,wRa);
 return(iRa);
}  
可以使用,但不一定正确。我附上了物体,以便进行视觉评估。有什么提示或去哪里找。
 
Galim_V:
它是有效的,但并不总是正确的。我附上了这些物体,以便进行视觉评估。请告知或到哪里去找。

DRAW_LINE是用来做什么的?

 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 
Alexey Viktorov:

DRAW_LINE是用来做什么的?

我纠正了代码。但它没有正确工作,甚至不是因为代码中的错误。我在我的经纪人的终端上做测试,我并不总是观察与服务器的连接。在这种情况下,它是非常关键的。谢谢你。
 

你好。如果EA是在H1图表上,我如何知道M30的收盘价

Close_M30= iClose(Symbol(),PERIOD_M30,1);
 
bij:

你好。如果EA是在H1图表上,我如何知道M30的收盘价

我喜欢人们在提出问题后自己回答问题 ))

基本上,一切都很正确。只有一个微妙的问题:在使用从另一个时间段获得的数据之前,我们必须确保这些数据根本就存在。

因此,完整正确的代码应该是这样的

ResetLastError();
Close_M30= iClose(Symbol(),PERIOD_M30,1);
if (GetLastError() != ERR_NO_ERROR)
{
  // Значение Close_M30 использовать нельзя
}
 
Ihor Herasko:

我喜欢人们提出问题,然后自己回答问题 ))

总的来说,一切都很正确。只有一个细微的差别:在使用另一个TF的数据之前,你需要确保这个数据根本就存在。

因此,完整正确的代码应该是这样的。

谢谢你,只在H1收盘后采取行动,但在H1收盘前30分钟满足条件。

 ResetLastError();
   niz_=NormalizeDouble(iCustom(NULL,PERIOD_M30,"mand v.1",2,1),Digits);
   Close_M30=iClose(Symbol(),PERIOD_M30,1);
   if(GetLastError() != ERR_NO_ERROR)return;
   if(Close_M30>niz_)//условие
     {
      //действие
     }
 
bij:

谢谢你,行动只是在H1收盘后,但条件是在H1收盘前30分钟满足。

如果你想把与上次H1收盘价一起收盘的M30蜡烛,它不仅可以是指数为1的蜡烛,也可以是指数为2的蜡烛。另一件事是,那就不清楚为什么M30的收盘价 与前一个H1蜡烛的收盘价是一样的,而要取它。也就是说,在这种情况下,询问另一个TF的收盘价是没有意义的,因为它与当前TF的收盘价相吻合。

原因: