MT4 Build 610 编程问题,请高手解决。

 

问题说明:MT4 Build 610 图表与函数不同步,函数无法识别图表更新,请高手解决帮忙解决。

//+------------------------------------------------------------------+
//|                                                            1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


datetime OT=iTime(_Symbol,PERIOD_D1,0);
double Spread=MarketInfo(_Symbol,MODE_SPREAD);
double O0=iOpen(_Symbol,PERIOD_D1,0);
double H1=iHigh(_Symbol,PERIOD_D1,1);
double L1=iLow(_Symbol,PERIOD_D1,1);
double H2=iHigh(_Symbol,PERIOD_D1,2);
double L2=iLow(_Symbol,PERIOD_D1,2);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
  int dt=0;

  if(TimeDay(OT)==TimeDay(TimeCurrent()))dt=1;
  
  printf("dt=%g",dt);
  printf("OT=%u,CT=%u",TimeDay(OT),TimeDay(TimeCurrent())); 
  printf("O0=%g",O0); 
  printf("H1=%g",H1); 
  printf("L1=%g",L1); 
  printf("H2=%g",H2); 
  printf("L2=%g",L2); 

  }
//+------------------------------------------------------------------+
 

一个这试试:

Print("Current bar for 0 is: ",iTime(_Symbol,PERIOD_M1,0)," OT= ",OT);

if(iTime(_Symbol,PERIOD_M1,0) == OT= ) dt=2;

你的dt=0, 已经说明, OT不是当前的时间了, 虽然它来自初始化的 m1的0, 但初始化的值 跟打开文件时的瞬时数据状态有关,那数据不一定是当前最新数据最新时间。

 
DxdCn:

一个这试试:

Print("Current bar for 0 is: ",iTime(_Symbol,PERIOD_M1,0)," OT= ",OT);

if(iTime(_Symbol,PERIOD_M1,0) == OT= ) dt=2;

你的dt=0, 已经说明, OT不是当前的时间了, 虽然它来自初始化的 m1的0, 但初始化的值 跟打开文件时的瞬时数据状态有关,那数据不一定是当前最新数据最新时间。

上面的代码稍微有一些问题,我是获取OT,Spread,O0,H1,L1,H2,L2天图的数据,现在已经更新,朋友可以重新看一下。


我想问题可能出在全局变量上面,OT,Spread,O0,H1,L1,H2,L2定义为全局变量,在tick当中全局变量就保持了初始值,不会随图表更新而更新?

 
fxdream:

上面的代码稍微有一些问题,我是获取OT,Spread,O0,H1,L1,H2,L2天图的数据,现在已经更新,朋友可以重新看一下。


我想问题可能出在全局变量上面,OT,Spread,O0,H1,L1,H2,L2定义为全局变量,在tick当中全局变量就保持了初始值,不会随图表更新而更新?


0T与TimeDay(TimeCurrent()))的值相等的话,说明图表与函数数据是一致的。

OT,Spread,O0,H1,L1,H2,L2定义为全局变量,在tick当中全局变量就保持了初始值,不会随图表更新而更新,不知道是不是这样的?

 
DxdCn:

一个这试试:

Print("Current bar for 0 is: ",iTime(_Symbol,PERIOD_M1,0)," OT= ",OT);

if(iTime(_Symbol,PERIOD_M1,0) == OT= ) dt=2;

你的dt=0, 已经说明, OT不是当前的时间了, 虽然它来自初始化的 m1的0, 但初始化的值 跟打开文件时的瞬时数据状态有关,那数据不一定是当前最新数据最新时间。


这样是不是可以解决,把全局变量改为局部变量

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
  int dt=0;

  if(TimeDay(D0T())==TimeDay(TimeCurrent()))dt=1;
  
  printf("dt=%g",dt);
  printf("OT=%u,CT=%u",TimeDay(D0T()),TimeDay(TimeCurrent())); 
  printf("O0=%g",SJ("O0")); 
  printf("H1=%g",SJ("H1")); 
  printf("L1=%g",SJ("L1")); 
  printf("H2=%g",SJ("H2")); 
  printf("L2=%g",SJ("L2")); 

  }
//+------------------------------------------------------------------+
datetime D0T()
   {
    datetime OT=iTime(_Symbol,PERIOD_D1,0);
    return(OT);
    }
//+------------------------------------------------------------------+
double SJ(string sj)
  {
   double sjj=0;
   double Spread=MarketInfo(_Symbol,MODE_SPREAD);
   double O0=iOpen(_Symbol,PERIOD_D1,0);
   double H1=iHigh(_Symbol,PERIOD_D1,1);
   double L1=iLow(_Symbol,PERIOD_D1,1);
   double H2=iHigh(_Symbol,PERIOD_D1,2);
   double L2=iLow(_Symbol,PERIOD_D1,2);
   
   if(sj=="Spread")sjj=Spread;
   if(sj=="O0")sjj=O0;
   if(sj=="H1")sjj=H1;
   if(sj=="L1")sjj=L1;
   if(sj=="H2")sjj=H2;
   if(sj=="L2")sjj=L2;
   return(sjj);
   }
//+------------------------------------------------------------------+
 

可以,但我不明白你要这信息干什么,隔24小时才变化的信息,需要在OnTick()每次价格变化就检查一次?

全局变量到不是问题,在返回前:

OT=iTime(_Symbol,PERIOD_D1,0);

就可以更新OT为最新的值。

原因: