如何在程序中得到实时的当前价格

 

如题,但是用如下的代码,拿到的c_close却是当前柱的open price(开盘价),我用的H1的周期,为什么呢?,怎么拿到实时的价格,股票里我们就用close就是当前价格了,

MqlRates mrate[];

ArraySetAsSeries(mrate,true);

if(CopyRates(_Symbol,TIMEFRAMES,0,3,mrate)<0)
     {
      Alert("Error copying rates/history data - error:",GetLastError(),"!!");
      ResetLastError();
      return;
     }

   p_close=mrate[1].close;  // bar 1 close price
   c_close=mrate[0].close;  // bar 0 close price     

 
   MqlRates mrate[];

   ArraySetAsSeries(mrate,true);

   if(CopyRates(_Symbol,PERIOD_H1,0,3,mrate)<0)
     {
      Alert("Error copying rates/history data - error:",GetLastError(),"!!");
      ResetLastError();
      return;
     }

   double p_close=mrate[1].close;  // bar 1 close price
   double c_close=mrate[0].close;  // bar 0 close price   
   Print(c_close);                
应该没错的,你打印观察一下就知道了。
 

从图中看就是open的价格,而不是close

 代码和你上面的代码一模一样的,下面的是程序test时我让它print出来的c_close 和p_close的值,发现c_close多数时候是和open价格一样,但和data windows窗口的close价格不等,所以非常奇怪,到底是哪里的问题呢? 

 
是否因为tick的原因,我的周期是H1,一小时一根柱线,看它print的语句,一小时才print一句,是否print的时候只有open价,tick不知道是怎么在H1周期跳的,一个小时跳一下吗?
 
king1898:
是否因为tick的原因,我的周期是H1,一小时一根柱线,看它print的语句,一小时才print一句,是否print的时候只有open价,tick不知道是怎么在H1周期跳的,一个小时跳一下吗?
很有可能,要看你print语句在什么时候打印了。比如你的逻辑是当有新的1小时柱线出现时,做XX操作,包括打印,那么肯定就打印当前价格即开盘价了,呵呵。
 
 版主,能确定下在H1周期,tick是一个小时跳一下,还是一分钟跳一下,如果是一小时跳一下,那肯定都只有开盘价了,因为只有跳完了才会有close价格出来,如果是一分钟跳的,那也是一分钟完了才有close价格,是这样吗,那我怎么拿到实时的价格呢?
 
luenbo:
很有可能,要看你print语句在什么时候打印了。比如你的逻辑是当有新的1小时柱线出现时,做XX操作,包括打印,那么肯定就打印当前价格即开盘价了,呵呵。
那我应该把print或者判断程序放在哪个位置才能打最新价格呢?请斑主赐教,多谢了
 
king1898:
那我应该把print或者判断程序放在哪个位置才能打最新价格呢?请斑主赐教,多谢了
void OnTick()
{ 
   MqlRates mrate[];
   ArraySetAsSeries(mrate,true);

   if(CopyRates(_Symbol,PERIOD_H1,0,3,mrate)<0)
     {
      Alert("Error copying rates/history data - error:",GetLastError(),"!!");
      ResetLastError();
      return;
     }

   double p_close=mrate[1].close;  // bar 1 close price
   double c_close=mrate[0].close;  // bar 0 close price   
   Print(c_close); 
}   

每个ticks都会打印当前价格。

 

 

要获取实时报价为何非要用数组呢?

Print(“Bid: ”,SymbolInfoDouble(_Symbol,SYMBOL_BID), " Ask: ",SymbolInfoDouble(_Symbol,SYMBOL_ASK));

 

单独测试那段程序,可以每个tick都打印,但放到我的程序里,就只打印一次,是否我的程序太长,导致反应不过来,其实是有打印呢?或者说是显示不过来,就显示了一次?

 
king1898:

单独测试那段程序,可以每个tick都打印,但放到我的程序里,就只打印一次,是否我的程序太长,导致反应不过来,其实是有打印呢?或者说是显示不过来,就显示了一次?

我不是说了,要看你的程序里面是不是有检测新柱形到来的代码逻辑。。。。如果打印是在这块中的,当然一个周期只打印一次,那就是该周期的第一个tick到来的时候的价格。。
原因: