IsConnected() - ページ 4

 
7bit:

チェックは可能で、無限ループでチェックを実行すればよい。接続が切れたときに端末を起動するときに、このループをどのように起動 するかは、まったく別の問題である。一度ループを走らせれば、期待通りの動作をするはずです。

あなたの問題は IsConnected() 関数とは関係ありません。同じ引数で、Print() や Alert() など、まったく別の 理由でコード全体を最初に開始 できなかったために呼び出すことができない関数についても、文句を言うことができるのです。


OK, Let me explain something Because I'm using a lot Terminlas All along my cpu useage is rising up to 100 prcent that is why I need to turn off a few terminals.私は多くのターミナルを使用しているので、私はいくつかのターミナルをオフにする必要があります。

そして、私がそれらをオンにしたとき(もちろん自動的)、私はそれらが接続されていないことを数回見ましたし、それらの上で実行されているEAが接続されていないことを報告しませんでした。

このトピックを始めたのはそのためで、今のところ、私が見つけた唯一の方法は、上で言ったように、外部プログラムを白くすることです。

 

おそらく、Windows XP SP2で初めて導入された、ネットワークを多用するアプリケーションを使用する人を困らせるために、常に半分以上開いている接続を 拒否する「機能」と関係があるのでしょう。AFAIKは、この迷惑な「機能」にパッチを当て、通常の操作性を回復する方法があります: http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php

Windowsのイベントログで、4226のイベントを探してください。

 
7bit:
これは、EAのinit()内からstart()を強制的に実行させる唯一の正しい方法 です。インジケータでは、start()がGUIスレッドで実行されるため、これを行うことはできません。

これは良いことですが、initi()が戻る前にティックが消えてしまう可能性があり、その場合ティックは破棄されるため、常に機能するとは限りません。このことを強調するために、次のように5ミリ秒の休止を追加します。

PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return

を実行すると、start()は実行されません。

ブローカーからの実際のティックを 必要とせずに、エキスパートアドバイザーのロード時にstart()が実行されるようにするためのより良い解決策はありますか?

 

私は少し古いですが、 私が この トピックで 得た のと 同じ問題の 解決策を探して います。

実際、qjolの主張である「これを行う唯一の方法は、スクリプトがロードされた状態で端末を開く方法がないことが問題です」は、部分的に正しいです。スクリプトでOKですが、クライアントターミナルでスクリプトを起動する方法があります。これはメタトレーダーのヘルプ(F1、Tools、Configuration at Startup)に記載されています。このトピックを立ち上げた時点では違うかもしれませんが。

そこで、この作業を行うための小さなスクリプトを開発しました。これをスタートアップスクリプトで使用します。

  ; open chart and run expert and/or script
  Symbol=EURUSD
  Period=H4
  Template=popular.tpl
  Expert=
  ExpertParameters=
  Script=CheckConnection
  ScriptParameters=

といった感じでターミナルを立ち上げます。

"...\Metatrader 4\terminal.exe" config\start.ini

ファイル:
 

こんにちは、みんな。

あなたの いずれかを知っていますか なぜ 仕事スクリプト偽ティック -https://www.mql5.com/en/forum/128803/page2#373539(ページ2)ビルド600 +のためのこのスレッド?

私のOSはVistaです。ありがとうございます。

 
endy5:

こんにちは、みんな。

あなたの いずれかを知っていますか なぜ 仕事スクリプト偽ティック -https://www.mql5.com/en/forum/128803/page2#373539(ページ2)ビルド600 +のためのこのスレッド?

私のOSはVistaです。ありがとうございます。

ビルド> 600以来、あなたはunicodeのための "W "でansiの "A "を交換する必要があります

int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
 

なぜパラメータに 2と1があるのか

PostMessageA(hwnd, msg, 2, 1)
 
iamsuman2:

なぜパラメータで2と1を使うのか

MQLの範囲外なので、こちらで 関数を確認してください。

 

IsConnected()関数に関する 情報を探している人がいるかもしれないので。

そうです、この関数は start() 関数や OnTick() 関数の下では動作しません。なぜなら、接続がなければ新しいティックが到着しないので、どのみちこの関数は起動しないからです...。

では、どうすればよいのでしょうか?

OnTimer()関数を使用して、ティックの受信に関係なく、定期的に接続をチェックします。

int timer = 60;   //60 seconds, for example
int OnInit()
  {
//--- create timer
   EventSetTimer(timer);  //could use EventSetMillisecondTimer(timer) for millisecond resolution
//---
   return(INIT_SUCCEEDED);
  }

// Metatrader self-triggered function, will be called regularly
void OnTimer()
  {
    if(!IsConnected())
      Alert("Problem, not connection to the server!");
  }

void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
      
 

fridayda13:

そう、この関数は start() 関数や OnTick() 関数の下では動作しません。なぜなら、接続がなければ新しいティックが到着しないので、どのみちこの関数は起動しないからです。

では、どうすればよいのでしょうか?

OnTimer()関数を使用して、ティックの受信に関係なく、定期的に接続をチェックします。

あなたは何もしない方がいいです。ネットワークがタイムアウトして関数が 値を変えるまで30秒以上かかります。何も変化がなく、接続がないときにどうするつもりですか?

これは、start/OnTickから 決して戻らない場合(OrderSendの 前にチェックする)、またはOrderSendの 後に同じティックの中で再試行する場合にのみ有効です。

その代わり、もしOrderSendが 失敗したら、それを記録し、戻り、次のティックでテスト/再試行してください。完了です。