MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1877

 
Maksim Emeliashin 静的に 配列し、この配列の中で文字列検索を行うなどの自転車操業が必要です。

MQLの場合、この機能は正しく動作しません

template<typename T>
bool StringToEnum(const string i_str, T &o_val)
{
   for(int i = 0; i < 256; i++)
      {
         o_val = (T)i;
         if(StringCompare(EnumToString(o_val), i_str, false) == 0)
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}

https://www.mql5.com/ru/docs/strings/stringcompare

パラメータ

ストリングス1

[in] 最初の文字列。

ストリングス2

[in] 2番目の文字列。

case_sensitive=true

[in] 大文字・小文字を区別するモード。真であれば、"A">"a "となる。 偽の 場合、"A"="a " となる。デフォルトはtrueである。

enumに2つの定数、例えばENUM1とenum1がある場合、i_str:"enum1" 関数で定数ENUM 1の値を返すことができます。なぜStringCompare なのか?もし、それが次のような方法で可能なら。

template<typename T>
bool StringToEnum(const string i_str, T &o_val)
{
   for(int i = INT_MIN; i <= INT_MAX && !IsStopped(); i++) // перебор всех возможных значений int
      {
         o_val = (T)i;
         if(i_str == EnumToString(o_val))
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}
 
Amon1953 ポジションのクローズ 理由の取得方法がわかりません。

次に何をすべきかを判断するために必要なのです。

MT5端末の履歴ウィンドウで、取引、注文、ポジションを選択することができます。

取引履歴から、DEAL_REASONとDEAL_REASON_SLが等しい取引を探す必要があります。


追加:それは単純化することができます - OnTradeTransactionでちょうどトランザクションTRADE_TRANSACTION_DEAL_ADDをキャッチし、取引履歴にこのトランザクションを作成したDEALを 探すために呼び出すことです。そして、同じレシピ:...DEAL_REASONイコールDEAL_REASON_SL

 
Mihail Matkovskij #:

この関数は、MQLでは正しく動作しません

https://www.mql5.com/ru/docs/strings/stringcompare

enumに2つの定数、例えばENUM1とenum1がある場合、i_str:"enum1" とすると、関数は定数ENUM 1の値を返すかもしれません。ところで、なぜStringCompareが 必要なのでしょうかもし、それが次のような方法で可能なら。

そして、より高速なバリアント。

template<typename T>
bool StringToEnum(const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for(int i = i_min_enum; i <= i_max_enum && !IsStopped(); i++) 
      {
         o_val = (T)i;
         if(i_str == EnumToString(o_val))
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
 
Alexey Viktorov #:

これは何のためにあるのでしょうか?ENUM_TIMEFRAMESの数値を独自のものに置き換えるか?それとも何?

さて、今はインジケータの設定やEAのパラメータをデータベースに書き込む必要があります。同時に、私も欲しいと思っています。

1. 人間が読める記録

2. 機械読み取り可能な記録

3.カスタムenumで新しい値を追加できる安定性(必ずしも最後でなくてもよい)。

record - EnumToStringは問題ないのですが、他の型と違って逆関数を作っていないのが残念です。

 
Mihail Matkovskij #:

そして、より高速なバージョン。

大文字小文字を区別しない比較については同感です。私は自分自身のenumについて、小文字を使用しないより一般的なバイクを書きました。

しかし、ENUM_TIMEFRAMESの場合は、このバリアントを実行します。

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
PERIOD_MN1 :) の間、コーヒーを飲む時間を作ることができます。
 
Valeriy Yastremskiy #:

各バー上の直線から価格を求め、比較したり、交差する差の符号が変わるところで、差を求めたりする)ちなみに、バー上に等差がない場合もあります。

その際、どのような機能が使われているのでしょうか?MqlRates?また、ObjectGetを使用する場合、オブジェクトのプロパティを指定する必要がありますが、OBJPROP_PRICEを取る場合、現在のバーより前の価格を取得するようにするにはどうすればよいでしょうか。
 
12345678902003 #:
助けてください。2本のGann線を描き、ある点で交差します。これらの線の交点の座標を知りたいのです。
ギャンラインの2点目の価格を判断できれば、KimIVは さらにお役に立てます
 
Maksim Emeliashin #:

大文字小文字を無視した比較については同感です。私は自分自身のenumについて、小文字を使用しない、より一般的な自転車を書きました。

しかし、ENUM_TIMEFRAMES の場合は、このバリアントが実行されます。

PERIOD_MN1 :) のために、ピックアップする前にコーヒーを飲む時間があるかもしれません。

さて、ENUM_TIMEFRAMESでは最小値と最大値が既知で ある。そのため、明示的に指定することができるのです。

残りのenumについては,おおよその値の範囲を知っていれば十分である。enum 宣言で定数が指定されていない場合は、通常0からとなる。i_max_enumには、2桁または3桁の任意の数値(50、100、255)を指定することができる。

 
Maksim Emeliashin #:

今現在、インジケータの設定やEAのパラメータをデータベースに書き込む必要があります。同時に、私も欲しいと思っています。

1. 人間が読める記録

2. 機械読み取り可能な記録

3.そのカスタムenumに新しい値を追加する安定性、必ずしも最後でなくてもよい。

record - EnumToStringについては問題ありませんが、他の型と異なり、開発者は逆関数を作りませんでした。

列挙を印刷しようとしたことがありますか?

Print(PERIOD_M5);

何が印刷されると思いますか?


しかし、プログラムで列挙を作成するのは...そうです。それはそれで面白いかもしれませんね。

 
x572intraday #:
なぜ、入力パラメータを ループさせることができないのでしょうか?なぜ、こんな仕打ちをするのですか?
もちろんこれは松葉杖ですが、私は使っています。必要なデータをすべて文字列入力変数に所定のセパレータを介して入力し、StringSplitを使って 配列にオーバーフローさせるのです。