mql4言語の特徴、微妙なニュアンスとテクニック - ページ 8

 
  1. iCustomを使用したExpert Advisorによるインジケータの最初の呼び出しは、インジケータのOnInitとOnCalculateの開始を引き起こします。
  2. インジケータは、次にiCustomを呼び出すまで、そのOnCalculateを呼び出しません。
  3. Expert Advisor を終了すると、インジケータ 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());  
}


週末、テスター、リアルタイムだけでなく、サードパーティのデータにも対応できる点が良いアプローチだと思います。つまり、MT以外から引用されたGMTの引用が決定される。

 
fxsaber:

代わりにTimeCurrent() の場合は 楽器の最後のティックの時間は、計算が邪魔されないのでしょうか?

 
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};
また、ticketypesは配列に格納することができます。
 
Alexey Viktorov:

謎はない。長年使っていて、mql5でもそうなのですが、明示的にint型に 渡す必要があるのです。

そこでは、意味がまったく違ってくる。