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

 
Slava:

あるのでしょうか?本当にあるんですか?どのような経路をたどっているのでしょうか?

どうすれば再現できるのでしょうか?

スクリプトをナビゲータのお気に入りに 登録します。

void OnStart() {}


間違ったバージョンをコンパイルしている。

void OnStart() {} 123


Terminalを再起動し、Favoritesからスクリプトを編集してみてください。

 
Vladimir Simakov:

デベロッパー説明が必要である。どちらを信じるか?ドキュメントか実装か?今のところ未定義の動作が表示されています。

@fxsaber さん、公式の説明の前に使うのはおすすめしません、もしかしたら修正されるかもしれません。

ドキュメントが滞っている、直そう。

静的変数を式で初期化することはお勧めしません。可能であれば、定数を使用してください。

なぜなら、定数でない式を使うと、コンパイラは次のようなコードを生成するからです。

//--- исходная функция
int func(int value)
  {
   static int myStaticVar=value;    
   
   myStaticVar += value;
   return(myStaticVar);
  }

//--- то, что будет сгенерировано 
bool __Implicit_myStaticVar_initialized=false;
int  __Implicit_myStaticVar=0;

//--- исходная функция
int func(int value)
  {
   if(!__Implicit_myStaticVar_initialized)
     {
      __Implicit_myStaticVar_initialized=true;
      __Implicit_myStaticVar=value;
     }

   __Implicit_myStaticVar += value;
   return(__Implicit_myStaticVar);
  }


オーバーヘッドがあり、各コールは __Implicit_myStaticVar_initialized フラグをチェックします。

定数の場合、以下のようなコードになります。

//--- исходная функция
int func(int value)
  {
   static int myStaticVar=10;

   myStaticVar += value;
   return(myStaticVar);
  }

//--- то, что будет сгенерировано 
int  __Implicit_myStaticVar=10;

int func(int value)
  {
   __Implicit_myStaticVar += value;
   return(__Implicit_myStaticVar);
  }

オーバーヘッドがない。

 
Ilyas:

ありがとうございます、オーバーヘッドについて理解できました。

 
正規化されていない価格値をカスタム文字に 簡単に書き込むことができます。以下は簡単な確認です。
bool IsNorm( const double Price )
{
  return(NormalizeDouble(Price, _Digits) == Price);
}

#define  TOSTRING(A) #A + " = " + DoubleToString(A, 16) + " "
#define  PRINT(A) Print(TOSTRING(A) + TOSTRING(NormalizeDouble(A, _Digits)))
#define  ISNORM(A) if (!IsNorm(A)) PRINT(A);

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    ISNORM(Tick.bid)
    ISNORM(Tick.ask)
    ISNORM(Tick.last)
  }
}


結果

2019.12.11 06:46:56.458 2019.10.09 23:59:00   Tick.last = 1.8151900000000002 NormalizeDouble(Tick.last,_Digits) = 1.8151900000000000 
2019.12.11 06:46:56.458 2019.10.09 23:59:11   Tick.bid = 1.8151100000000003 NormalizeDouble(Tick.bid,_Digits) = 1.8151100000000001 
2019.12.11 06:46:56.458 2019.10.09 23:59:11   Tick.ask = 1.8153800000000003 NormalizeDouble(Tick.ask,_Digits) = 1.8153800000000001 
2019.12.11 06:46:56.458 2019.10.09 23:59:17   Tick.bid = 1.8151200000000002 NormalizeDouble(Tick.bid,_Digits) = 1.8151199999999999 
2019.12.11 06:46:56.458 2019.10.09 23:59:17   Tick.ask = 1.8153800000000003 NormalizeDouble(Tick.ask,_Digits) = 1.8153800000000001 
 
このトピックに関係のないコメントは、「MQL5 MT5 MetaTrader5初心者からの質問」に移動しました。
 
RickD:
...質問が違う。おそらくMQL5にはバグがあり、それに対処する必要があるのでしょうが、初心者向けのトピックに先送りしても、すぐに解決できるわけではありません。

トピックのタイトルをお読みください。

 
Artyom Trishkin:

スレッドのタイトルをお読みください。

そして、どこに矛盾があるのか?記述されている状況は、言語の特徴 である場合もあれば、バグである場合もあります。それが知りたかったのでしょう。

 
RickD:

そして、どこに矛盾があるのか?説明されている状況は、言語の特徴かも しれないし、バグかもしれない。それが知りたかったのでしょう。

いや、まずバグなのかクセなのかが判明してから、正確に、クセだけを掲載するのです。話題はあくまでも機能に関するものです。

 

Ilyas@Slava@Renat Fatkhullin

mql は、文書化されていない関数のキーワードをサポートしています。

__inline
__forceinline

使うのは合理的か?
もしそうなら、コンパイラーはいつそれを受け入れるのでしょうか?

 

ArrayReverseのヘルプにあります。

ArraySetAsSeries()関数は配列の要素を物理的に移動させるのではなく、インデックスの方向を逆に し、時系列のように要素へのアクセスを整理するのみ である。 ArrayReverse()関数は、配列の項目を物理的に移動させ、配列を「反転」させるものです。

しかし、このコードはその逆を証明している。

  MqlRates rt[];
  CopyRates(Symbol(), 0, 0, 5, rt);
  ArraySetAsSeries(rt, true);
  ArrayResize(rt, 6); // добавляет элемент в конец массива
  //ArraySetAsSeries(rt, true);
  for (int x = 0; x < ArraySize(rt); x++) {
      Print(rt[x].time);
  }
  Print("=================");
(EURUSD,H1)     2019.12.13 02:00:00
(EURUSD,H1)     2019.12.13 01:00:00
(EURUSD,H1)     2019.12.13 00:00:00
(EURUSD,H1)     2019.12.12 23:00:00
(EURUSD,H1)     2019.12.12 22:00:00
(EURUSD,H1)     1970.01.01 00:00:00 - последний элемент
(EURUSD,H1)     =================
  MqlRates rt[];
  CopyRates(Symbol(), 0, 0, 5, rt);
  //ArraySetAsSeries(rt, true);
  ArrayResize(rt, 6); // добавляет элемент в конец массива
  ArraySetAsSeries(rt, true);
  for (int x = 0; x < ArraySize(rt); x++) {
      Print(rt[x].time);
  }
  Print("=================");
(EURUSD,H1)     1970.01.01 00:09:19 - последний элемент
(EURUSD,H1)     2019.12.13 02:00:00
(EURUSD,H1)     2019.12.13 01:00:00
(EURUSD,H1)     2019.12.13 00:00:00
(EURUSD,H1)     2019.12.12 23:00:00
(EURUSD,H1)     2019.12.12 22:00:00
(EURUSD,H1)     =================
理由: