エニュメレーションを一貫して行うにはどうしたらいいですか? - ページ 5

 
Sergei Vladimirov:
なぜ、そんなことをするのだろう?
MIXのTickSizeは25、Digitsは0です。25の倍数でない整数の価格を正規化すると、OrderSend エラーが発生します。
 
fxsaber:
MIXのTickSizeは25、Digitsは0です。25の倍数でない整数の価格を正規化すると、OrderSendエラーが発生します。
ちょうど今、隣のスレッドでコンピュータを浴槽に沈めることを助言し、その後、すべてがさらに不信感を抱くだろう。
 
Dmitry Fedoseev:
ちょうど今、隣のスレッドでコンピュータを浴槽に沈めることを助言している、その後、すべてがさらに信用されなくなる。
残念なことに、あなたはボキャブラリー豊富な方です。私は何も作らないが、批判する権利はある。
 
fxsaber:
MIXのTickSizeは25、Digitsは0です。25の倍数でない整数の価格を正規化すると、OrderSendエラーが発生します。
まあ、その理屈だと、0.25ステップの正規化でも誤差が出ますね。正規化の目的は、価格をあるエキゾチックな価格ステップに合わせることではなく、浮動小数点数を所定の精度に丸める ことである。エラーが発生することはありません。
 
Sergei Vladimirov:
まあ、その理屈だと、0.25ステップの場合でも、正規化すると誤差が生じますね。正規化の目的は、価格をあるエキゾチックな価格ステップに合わせることではなく、浮動小数点数を所定の精度に丸める ことである。エラーにつながらない。
正規化は、もともとたった一つのこと(ヘルプにも書いてあります)のために導入されたもので、取引機能です。
 
Vladimir Batrudinov:

入力が必要な関数は2つでしょう。1 - enumの要素数を返す、2 - 要素を番号で返す...。


enumでは、例えば以下のように、要素に任意の値を割り当てることができる。enumは配列ではありません。

enum crazy
{
    e1 = 100500,
    e2 = -200,
    e3 = -100500,
    e4 = 0
};


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
    int z10 = e2;
    int z1 = e4;
  
}

C#などの言語ではenum名を指定する必要がありますが、C++やそれ故にMQL4/5ではenumを自由に扱うことができます。念のため、このくだらないものはMQL5でもC++でもコンパイルできます。

 
Alexey Volchanskiy:

enumでは、以下のように、要素に任意の値を割り当てることができます。enum は配列ではありません。

だから何って、宣言順に要素を突き詰めていくことだったんです。
 
Alexey Navoykov:
だからなんだ、その要素を申告順に見ていくってことだったんだ。
あ、そうか、質問を読み間違えたんだ、と価値観で思いました。
 

プログラマーへの注意点

#define  ENUM_QQ             \
  ENUM_QQ_HELPER(el_1, 3)   \
  ENUM_QQ_HELPER(el_2, 9)   \
  ENUM_QQ_HELPER(el_3, 38)  \
  ENUM_QQ_HELPER(el_4, 1)   

enum Enum_qq
{
#define  ENUM_QQ_HELPER(el, val) el = val,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
};

void get_enumqq_array(int &ar[])
{
  int temp[] = {
#define  ENUM_QQ_HELPER(el, val) el,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
  };
  ArrayResize(ar, ArraySize(temp));
  for(int i = 0;  i < ArraySize(temp);  ++i)
    ar[i] = temp[i];
}

void OnStart()
{
  int q[];
  get_enumqq_array(q);
  for(int i = 0;  i < ArraySize(q);  ++i)
    Alert(q[i]);
}


これで、列挙を編集する必要がある場合、一度に一箇所で編集する必要があります。新しい要素を追加する必要があります。例えば、element_new = 56の場合、次のように追加します。

ENUM_QQ_HELPER(element_new , 56)

そして、わざわざget_enumqq_array()を編集する必要はないでしょう。その手法は「Xマクロ https://en.wikipedia.org/wiki/X_Macro 」と呼ばれています。開発者が望めば、このように標準的な列挙を簡単に変更することができる。

すぐにはわからないかもしれないが、列挙するとこのようになった。

enum Enum_qq
{
   el_1 = 3
   el_2 = 9
   el_3 = 38
   el_4 = 1   
};
 
Vasiliy Sokolov:

仮に列挙があるとしよう。この列挙の可能な値を一つずつ、例えばループの中で取得するにはどうしたらよいでしょうか。

すなわち、tf1++はPERIOD_M1, PERIOD_M2, PERIOD_M5...を順次返す必要があります。これは言語ツールではできないことだと思います。

しかし、もしENUM_MYENUMがあれば、(ENUM_MYENUM)INT_MAXはその列挙型の最大値を与えるはずである。そうでなければ、これは型変換のバグです。それは、型変換演算子がまさにこの型の値を返さなければ ならないからに他ならない。文脈上必ずしも有効ではないが、型としては有効である。