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

 
Василий:
是的,我问的是MQL 5? 是的,应该访问当前符号的数据。EA代码中需要这些数据。因此,我需要,例如,知道当前酒吧之前的收盘价
看一下CopyTime的例子
 
Karputov Vladimir:
请看CopyTime的例子
知道了,我会努力想办法的。谢谢你!
 
Василий:
是的,我问的是MQL5? 是的,应该访问当前符号的数据。我们在专家顾问代码中需要的数据。因此,举例来说,我需要知道当前条形图之前的收盘价。

你应该多读一下文档。

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

下面是一个获得收盘价和指标缓冲区的例子

ENUM_ORDER_TYPE indicator_01()
  {
   double ma[2];
   double close[2];
   static int h_ma=INVALID_HANDLE;
   if(Bars(_Symbol,PERIOD_CURRENT)<ma_period+1)return(WRONG_VALUE);
   if(h_ma==INVALID_HANDLE || h_ma==0)
     {
      h_ma=iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price);
      return(WRONG_VALUE);
     }
   if(CopyBuffer(h_ma,0,1,2,ma)<2) return(WRONG_VALUE);
   if(CopyClose(_Symbol,PERIOD_CURRENT,1,2,close)<2) return(WRONG_VALUE);

   if(close[1]>ma[1]&&close[0]<ma[0])return(ORDER_TYPE_BUY);
   if(close[1]<ma[1]&&close[0]>ma[0])return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Sergey Gritsay:

...

下面是一个获得收盘价以及指标缓冲区的例子

坏的例子。在MQL5中存储指标句柄的变量必须在 "头 "中声明--在全局变量 区域,并且句柄应该在OnInit()中获得。只有这样,你才能参考指标句柄,从程序的任何地方获取数据。
 

大家好!

我正在使用OnTrade事件在测试器中获得交易历史数据。

  for(int i=0;i<HistoryDealsTotal();i++){
       ulong deal_ticket=HistoryDealGetTicket(i);
       Print("ticket=",deal_ticket);
       Print("price=",HistoryDealGetDouble(deal_ticket,DEAL_PRICE));
       Print("time=",TimeToString(HistoryDealGetInteger(deal_ticket,DEAL_TIME)));

这就是我在日志中得到的东西。

0 22:58:16.487 核心 1 2016.04.01 00:00 目前符号周期GBPUSD的终端历史条数=7729。
JR 0 22:58:16.487 核心 1 2016.04.01 03:00:00 尝试交易 0,手数0.01。
EL 0 22:58:16.487 核心 1 2016.04.01 03:00:00 市场买入 0.01 GBPUSD sl: 1.43033 tp: 1.44034 (1.43646 / 1.43654 / 1.43646)
GO 0 22:58:16.487 Core 1 2016.04.01 03:00:00 交易#2在1.43654买入0.01英镑兑美元完成(基于订单#2)。
GE 0 22:58:16.487 核心 1 2016.04.01 03:00:00 交易执行 [#2在1.43654买入0.01英镑兑美元]
NK 0 22:58:16.487 核心 1 2016.04.01 03:00:00 订单执行 在1.43654买入0.01 [#2在1.43654买入0.01 GBPUSD]
HI 0 22:58:16.487 核心 1 2016.04.01 03:00:00 ticket=1
HM 0 22:58:16.487 核心 1 2016.04.01 03:00:00 价格=0.0
HH 0 22:58:16.487 核心 1 2016.04.01 03:00:00 时间=2016.04.01 00:00
CR 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=2
ID 0 22:58:16.487 核心 1 2016.04.01 03:00:00 价格=1.43654
OP 0 22:58:16.487 核心 1 2016.04.01 03:00:00 时间=2016.04.01 03:00

第一笔零价格的交易从何而来?我不这样做:-)。

我不这样做:-) 解释一下吧。

Z.P. 我想我明白了。第一笔交易的利润为10K。我不知道该怎么做,但它仍然很奇怪。为什么?

这里还有一个问题。该交易(在1.43654买入)还没有被打开。它在历史上是如何出现的?

我需要像MQL4那样在数组中只获得已关闭交易的数据。如何做到这一点?

P.S. 按DEAL_ENTRY_OUT 过滤

 
Alexandr Saprykin:
你有没有试着重新安装终端?
是的,谢谢你。那是唯一有帮助的事情。
 
Karputov Vladimir:
坏的例子。在MQL5中存储指标句柄的变量必须在 "头 "中声明 - 在程序的全局变量 区,在OnInit()中获得句柄。只有这样,你才能参考指标的句柄,从程序的任何地方获取数据。

我不太同意你关于获取句柄的说法,因为OnInit()函数只执行一次,而且不能100%保证指标会从第一次就被创建。关于声明变量,你可能是对的,但我想知道下面的文档是否说了一些比用静态变量的变量更糟糕的事情

只要函数存在,用static关键字声明的局部变量就会保存其值。在函数的每次后续调用中,这些局部变量包含了它们在前一次调用中的值。

 
<br / translate="no">

DEAL_ENTRY_OUT 过滤

 
Sergey Gritsay:

我不太同意你关于获取句柄的说法,因为OnInit()函数只执行一次,而且不能100%保证指标会从第一次就被创建。关于变量的声明,你可能是对的,但我想知道在文档中,静态变量的选项有多糟糕

...

我们将在创建指标句柄 时在OnInit()中检查这一点。如果指标句柄没有被创建,onOnit()我们将返回INIT_FAILED也就是说,指标句柄只被创建一次,而且只在OnInit()中创建。这不是 "4"--混乱和徘徊,并在程序的各个角落宣布手柄。
 
Karputov Vladimir:
为此,OnInit()检查是否创建了指标句柄。如果指标句柄没有被创建,OnOnit()应该返回INIT_FAILED也就是说,指标句柄只被创建一次,而且只在OnInit()中创建。这不是 "4"--它不是在程序的各个角落里混乱和徘徊并声明句柄。
我不会在我的声明中如此断然。不是衣柜里乱,是脑袋里乱 (c)