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

 
Anatoli Kazharski #:

シンボルにデータがあるかどうかを調べるにはどうすればよいですか?データがない場合、[Market Watch]ウィンドウに表示したままにしないですみますか?

SymbolInfoTick.

 
fxsaber #:

SymbolInfoTick。

このオプションを試してみた。残念ながら、うまくいきません。シンボルが [Market Watch] ウィンドウに初めて追加された場合、そのシンボルにはまだデータがなく、SymbolInfoTick は null 値を返します。

CopyXXX 関数もテストしましたが、タイムアウトがなく、サーバーからのデータを待つプロセスが約 45 秒と長すぎます。

文字が使用不可能かどうかを調べる簡単な方法が必要です。以下のようなケースです:


//---

このようなシンボルはサーバーにデータを持っていないので、[市場概要]ウィンドウに追加されないように、あるいは追加されてもリストから削除されないように識別する方法が必要です。

追伸[ Market Watch]ウィンドウのリストからシンボルを削除する際のロックを解除する方法はないでしょうか?

 
Anatoli Kazharski #:

そのオプションを試してみた。残念ながらうまくいかない。シンボルが[Market Watch]ウィンドウに初めて追加された場合、そのシンボルにはまだデータがなく、SymbolInfoTickは NULL値を返します。

手でシンボルを取得するのは簡単です。

  1. 数回クリックするだけで、すべてのシンボルを [Market Watch] に追加できます。
  2. 数秒後にティックが表示されます。
  3. ワンクリックで時間順にソート。
  4. Delキーを使って、取得したリストの末尾の1つを削除する。
この作業には最大半分かかる。
 
Anatoli Kazharski #:

そのオプションを試してみた。残念ながらうまくいかない。シンボルが[Market Watch]ウィンドウに初めて追加された場合、そのシンボルにはまだデータがなく、SymbolInfoTickは NULL値を返します。

CopyXXX 関数も試しましたが、タイムアウトがなく、サーバーからのデータを待つプロセスが約 45 秒と長すぎます。

文字が使用不可能かどうかを調べる簡単な方法が必要です。このようなケースを想定しています:


//---

このようなシンボルはサーバー上にデータがなく、[Market Watch]ウィンドウに追加されたり、追加されてもリストから削除されないように識別する方法が必要です。

追伸[Market Watch]ウィンドウのリストからシンボルを削除する際のロックを解除する方法はないでしょうか?

私は6年ほどこの問題と戦ってきたので、開発者にこの問題を解決するようお願いしています。

残念ながら、この問題は解決されておらず、現時点では、誰もが初めて金融商品にアクセスしたときにターミナルがハングする状況があります。

 
Anatoli Kazharski #:

シンボルにデータがあるかどうかを調べるにはどうすればよいですか?データがない場合、[Market Watch]ウィンドウに表示したままにしないですみますか?

私はこのようなチェックをループの中で使っています:

しかし、Expert Advisorがチャート上にある間は、[Market Watch] ウィンドウからシンボルを手動で1つずつ削除することも、一度に 削除することもできません:


最後の気配値の時刻をチェックしてみてください。

SymbolInfoInteger(name, SYMBOL_TIME);

0ならデータがない。

チャートを開いて確認しました。

2024.01.05 10:38:43.783 !00 (GBPUSD,H1) USDCAD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) NZDUSD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) USDCAD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) EURGBP 2024.01.05 09:38:49
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) GBPUSD 2024.01.05 09:38:49
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) POZ3 1970.01.01 00:00:00
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) EDH4 1970.01.01 00:00:00
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) BRZ3 1970.01.01 00:00:00
 
サーバーを切り替えることで追加データを取得することは可能だ。コードで実装できるかどうかはわからない。
 
Nauris Zukas #:
サーバーを切り替えることで追加データを取得することは可能だ。コードで実装できるかどうかはわからない。

サーバー間」が「ブローカー間」を意味するのであれば、プロファイルを弄らない限り、それは難しい。

しかし、もし本当に1つのブローカー(Openは多数、Finamは2つ)の異なるサーバー間を切り替える必要があれば、iptables/nftablesと私のbashスクリプトを使ってそれを行うだろう。でも、Linuxがあるここなら簡単だ。

 
JRandomTrader #:

サーバー間」というのが「ブローカー間」という意味であれば。


.

 
Nauris Zukas #:


はい、原理的には可能です。

しかし、MQLプログラムからサーバーの名前とipを調べる方法はないので、サーバーを切り替えて接続先のipをチェックし、手動で調べる必要がある。

それから、ファイアウォールの設定を変更することで、あるサーバーへの接続を禁止し(ここでは、タイムアウトを避けるためにパケットをドロップするのではなく、リジャックする必要がある)、MTを別のサーバーに強制的に切り替えることができる。

繰り返しますが、Linuxでこれを行うのは難しくありませんが、Windowsでこれを行う方法は想像できません。

 
Alexey Viktorov #:

最後の引用の時間をチェックしてみてください。

0ならデータがない。

オープンチャートと照らし合わせてみました。

似たようなケースにも当てはまります:

このオプションを試してみました。残念ながら、これは適合しません。シンボルが[Market Watch]ウィンドウに初めて追加された場合、そのシンボルにはまだデータがなく、 SymbolInfoTickは null値を返します

めったにティックが来ない場合、そのようなシンボルはすべて除外されます。

fxsaber#:

手作業でシンボルを取得するのは簡単です。

  1. 数回クリックするだけで、すべてのシンボルを Market Watch に追加できます。
  2. 数秒後にティックが表示されます。
  3. ワンクリックで時間順にソート。
  4. Delキーを使って、取得したリストの末尾の1つを削除する。
これだけで、最大半分かかる。

いいえ、全自動が必要です。

Vladimir Pastushak#:

私はすでに6年間この問題と戦ってきました。

残念なことに、この問題は解決されておらず、現時点では、誰もが初めて金融商品にアクセスしたときにターミナルがハングアップする状況があります。

私がこの問題に気づいたのは、以下の関数を呼び出したときだけです:

  • Bars()
  • iBars()
  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_BARS_COUNT)

//---

ターミナル開発者:

1. トレードサーバーにデータのないシンボルを追加する可能性を排除する。

2.Market Watch] ウィンドウからのシンボル削除ブロックを無効にするか、バグであれば修正する。現在はターミナルを再起動しないとできない。

3.CopyXXXの ような関数に、タイムアウト(サーバーからのデータを待つ最大時間)を設定するオプション・パラメーターを追加する。

これは今すぐには再現できません。今のところ、遅延なく動作しています。しかし、場合によっては発生することもあるようです。

4.Bars()、iBars()、SeriesInfoInteger(symbol, PERIOD_M1, SERIES_BARS_COUNT)関数を以下のような場合に使用すると、無限に待たされるバグを修正:

  • サーバーへの接続がない。
  • シンボルにデータがない。

チャートからプログラムを削除しようとすると、端末が数分間ハングすることがある。

5.サーバーへの接続がない場合に関数を使用すると無限待機になるバグを修正:

  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_FIRSTDATE)
  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_LASTBAR_DATE)
  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE)

この場合、タイムアウト(サーバーからのデータを待つ最大時間)を設定するオプションのパラメータを追加することもできます。

//---

追伸: 今のところ、私はCopyXXXの ような関数でデータをチェックする亜種に落ち着いています。しかし、上記のような問題が再び現れるかどうか、注視したいと思います。