mql4语言的特点、微妙之处以及技巧 - 页 8

 
  1. 通过使用iCustom的Expert Advisor第一次调用指标,导致指标的OnInit和OnCalculate开始。
  2. 在下一次调用iCustom之前,该指标不会调用其OnCalculate。
  3. 退出专家顾问时调用指标OnDeinit。
iCustom指标并不完整。而且,使用MQL4工具,不可能从手动启动的指标中接收指标缓冲 值。
 
fxsaber:
iCustom指标并不完整。

什么是不完全性?事件没有得到处理?

 
Andrey Khatimlianskii:

什么是不完全性?事件没有被处理?

是的。

 
#property strict

#define  HOUR 3600
#define  DAY (24 * HOUR)
#define  WEEK 7

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M1 )
{
  if (Symb == NULL)
    Symb = _Symbol;
    
  return(iTime(Symb, TimeFrame, iBarShift(Symb, TimeFrame, time) - (NextBar ? 1 : 0)));
}

datetime GetTimeDayOfWeek( const int Shift = 0, const ENUM_DAY_OF_WEEK Day = SUNDAY )
{
  const datetime Res = TimeCurrent() / DAY * DAY;
  
  return(Res - (((WEEK + (TimeDayOfWeek(Res) - Day)) % WEEK) + Shift * WEEK) * DAY);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
int TimeServerGMTOffset( void )
{
  const datetime Sunday = GetTimeDayOfWeek();
  
  return(((int)MathRound((double)MathMin(Sunday - DAY - GetBarTime(Sunday), Sunday + DAY - GetBarTime(Sunday, true)) / HOUR) - 3) * HOUR);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmt
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
datetime TimeServerGMT( void )
{
  return(TimeCurrent() + TimeServerGMTOffset());
}


应用

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  PRINT(TimeGMT());
  PRINT(TimeServerGMT());  
}


这个方法很好,它不仅适用于周末、Tester和实时,也适用于第三方数据。也就是说,从MT以外的其他地方抽取的GMT引文是确定的。

 
 
fxsaber:

如果不使用TimeCurrent(), 而是使用仪器上的最后一个tick的时间,那么计算就不会受到干扰?

 
Vitaly Muzichenko:

如果你不使用TimeCurrent(),而是 使用仪器的最后一个刻度的时间,那么计算就不会被破坏?

不会的。TimeCurrent 对算法的影响非常间接。你可以把酒吧的时间,等等。

只需以任何方式计算最后一次通过(在酒吧的历史上)星期天的日期--在星期天之前和星期天之后有酒吧。你至少可以用TimeLocal来做这个。

 
很难不喜欢一种允许你写这种代码的语言
double Lots[] = {0, 0, 0, 0, 0, 0};

for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    Lots[OrderType()] += OrderLots();

我相信开发人员在编写语言时并没有计划到这种事情。为什么MQL4会有这么多方便的东西,这是一个谜。

 
fxsaber:
很难不喜欢一种能让你写出这样的代码的语言

我相信开发人员在编写语言时并没有计划到这种事情。为什么MQL4会有这么多方便的东西,这是一个谜。

没有什么神秘的。我在mql5中也使用了很多年,但我们必须明确地将位置类型和订单类型转换为int类型

我只是像这样声明一个数组

double  Lots[6] = {0.0};
你也可以在一个数组中存储票种。
 
Alexey Viktorov:

没有什么神秘的。我已经用了很多年了,在mql5中也是如此,但你必须明确地把它传给int类型

那里的含义会有很大的不同。

原因: