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

 
Mihail Matkovskij #:

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

他のenumでは、おおよその値の範囲を知っていれば十分である。i_max_enum には,2桁または3桁の任意の数値(50,100,255)を指定することができる。

また、実験的に enum の最小値と最大値を取得することができます。それらを書き出し、StringToEnumで指定することで、最適な速度が得られます。

int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
  int min, max;
  min = INT_MAX; max = INT_MIN;
  nEnum = 0;
  for(int i = _minEnum; i <= _maxEnum && !IsStopped(); i++) {
    enum_ = (T)i;
    if(StringFind(EnumToString(enum_), "::", 0) >= 0)
      continue;
    if (i < min)
      min = i;
    if (i > max)
      max = i;
    nEnum++;
  }
  if (min != INT_MAX && max != INT_MIN) {
    __min = min;
    __max = max;
    return true;
  }
  return false;
}

template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN, INT_MAX); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  int min, max;
  if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))
    printf("enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d", min, max, nEnum);
  else
    Print("enumFindMinMax Error!");
}

スクリプトの結果。

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37, max: 52, Count: 14

ENUM_ACCOUNT_INFO_DOUBLEを開いて見て ください。定数の数はCount(14)である。このように、アプリケーションの開始時に、必要なenumをすべて扱い、その最小値と最大値を書き、それに対応するStringToEnumを使うことで、最高のスピードで 処理することができるのです。

追伸:INT_MINとINT_MAXを使ったenumFindMinMaxの2番目のバリエーションは、本当にとても遅いです。最初はやってみたんです。その後、enumFindMinMaxが 終了するのを待つのに疲れ、-500から500までの値を設定しました。

if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))

したがって、intの範囲を全部使う必要は全くないという結論に達しました。

ファイル:
 

端末の挙動がおかしいのですが。

あるチャートでExpert Advisorが動作しており、ある瞬間に別のチャートを開き、新しいチャートにある寺院を設定する、というような状況です。後者のテンプレートは、新しいチャートで2つ目のEAを起動するために定義されています。

週の半ばはすべてうまくいくのですが、マーケットが閉じている週末は、新しいチャートで新しいテンプレが開始されますが(チャートの外観を変更するとわかります)、そこでは2番目のEAが開始されないのです。2つ目のExpert Advisorを「押す」唯一の方法は、任意のチャート、任意のスクリプト、完全に空のものであっても、手動で起動することです。その後、2つ目のExpert Advisorが新しいチャートで作業を開始します。

最初の Expert Advisor で ChartOpen とChartApplyTemplate 関数を使用し、CChart クラスを使用してこのコードを書きましたが、いつも同じ結果になり、市場が閉じている場合、新しいチャートの 2 番目の Expert Advisor は、ターミナルを手動で「押す」まで起動しません。

このような状況に直面したことがある方はいらっしゃいますか?どう対処するか、どう "掘る "か。

 
akskarabey ChartApplyTemplate 関数を使用し、CChart クラスを使用してこのコードを書きましたが、いつも同じ結果になり、市場が閉じている場合、新しいチャートの 2 番目の Expert Advisor は、ターミナルを手動で「押す」まで起動しません。

このような状況に直面したことがある方はいらっしゃいますか?どう対処するか、どんな方法で「掘る」のか?

どうして起動しないとわかるの?

追伸

このように試してみてください。

int OnInit()
{
....
....

 ChartRedraw();
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij #:

enumの定数をEnumToStringで変換し、目的の定数と比較することで、ブルートフォース関数 同じ原理)で見つけることができます。あとは結果を返すだけです。

何も思い浮かばないので、例(せめてキーライン)を教えてください。また、膨大な価値観のリストから、左利き用をすべてふるいにかけるか、それとも有用なものだけを探すか?今のところ、左利きのものが入っていないので、ふるいにかけることはないと思うのですが......。が、その発想がつかめない。

 
x572intraday #:

思いつかないので、例(せめてキーライン)を教えてください。また、左側の値の中から正しいものをふるいにかけて、あるいは有用なものだけを集めた巨大な値のリストになるのでしょうか。今のところ、左利きのものが入っていないので、ふるいにかけることはないと思うのですが......。が、その発想がつかめない。

可能なすべてのenumの値を調べるのを避けるために(本当に長いので)、以下の準備をする必要があります(キャッシュのようなもの)。そして、この関数 助けを借りて、必要なすべての列挙型の範囲を知っている列挙型に簡単に変換することができます。あるいは、比較的小さな範囲のenumを検索することもできます.

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);
}


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

起動してないって、どうやって判断したんだ?

追伸

このように試してみてください。

OnInitセクションの2番目のエキスパートがログに結論を出し、ログメッセージはありません。ログには、Expert Advisorの起動に関する端末からのメッセージも含まれていません。また、右上のチャートにExpert Advisorの名前が表示されない。

 
12345678902003 #:
また、そのためにどのような機能が使われているのでしょうか。MqlRates?また、ObjectGetを使う場合、そこでオブジェクトのプロパティを指定する必要があります。OBJPROP_PRICEを取る場合、現在のバーまでの価格をどのようにフェッチさせればよいのでしょうか?

GetはGet。また、オブジェクトの名前や種類、名前からバー上の価格や時間を取得する機能があり、オブジェクトの特定のプロパティを取得することができます。小節番号ではなく、ゼロからのオフセットが使用されます。

 
Valeriy Yastremskiy #:

GetはGet。また、オブジェクトの名前や種類、名前からバー上の価格や時間を取得する機能があり、オブジェクトの特定のプロパティを取得することができます。小節番号ではなく、ゼロからのオフセットが使用されます。

これは、ObjectGetValueByTime()関数を使用して行うことができます。

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
TerminalMQL4 の Indicators フォルダにはインジケータがありますが、MQL4 自身にはそのリストにインジケータがなく、そこからインジケータをチャートにドラッグします。これらのインジケータをターミナルリストに表示させ、MQL4 ターミナルのチャートで使用できるようにするにはどうすればよいですか?スクリーンショットの右側はMQL4 ターミナルで 利用できるインジケーターで、左側はMQL44Indicators フォルダーにある同じターミナルのインジケーターです (例として)。
ファイル:
 
Halina Okopna-Pecuch #:
TerminalMQL4 Indicatorsフォルダーにあるインジケーターのリストにはインジケーターが含まれていますが、ターミナルMQL4では、これらのインジケーターがチャートにドラッグされるそのリストには含まれていないのです。これらのインジケータをターミナルリストに表示させ、MQL4 ターミナルのチャートで使用できるようにするにはどうすればよいですか?スクリーンショットの右側はMQL4 ターミナルで 利用可能なインジケーター、左側はMQL44Indicators フォルダーにある同じターミナルのインジケーターです (例として)。

これらは、おそらく指標にはならない。