// this is an EA#import "user32.dll"int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
#importint init(){
int hwnd=WindowHandle(Symbol(), Period());
int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() returnreturn(0);
}
int start(){
while (!IsStopped()){
// do your stuff hereSleep(1000);
}
return(0);
}
// this is an EA#import "user32.dll"int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
#importint init(){
int hwnd=WindowHandle(Symbol(), Period());
int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() returnreturn(0);
}
int start(){
while (!IsStopped()){
// do your stuff hereSleep(1000);
}
return(0);
}
init () から start() を呼び出すだけで、tick が来なくても start() に入ります。
ありがとうございました。
上のリンクから発展させると...私は接続状態を監視するために別のEAを走らせています。それは基本的に、私のテストのためのすべてのコードは、最後にスリープを持つ開始の中にコード化されています。Startは基本的に大きなループで、終了すると最初に戻る。しかし、開始のトリガーとなるtickを待つのではなく、init()の中でstart()を呼び出しています。この方法では、start()はスリープしながらループを続け、init()は終了しないので、コードはtickを待つのではなく、スリープからの時間間隔に基づいて実行されます... 上のリンクはその原理を表しています...
hth
V
init() から start() を呼び出せば、tick が来なくても start() に入ることができます。
init() も接続がない場合は開始されないので、どちらも問題解決にはなりません。
これをやるにはスクリプトを書くしかないのですが、問題はスクリプトがロードされた状態でターミナルを開く方法がないことです。
init()も接続がないと起動しないので、どちらも問題解決にはなりません。
問題は、スクリプトがロードされた状態でターミナルを開く方法がないことです。
MT4i.comのツールを見てみましょう。私は、接続を監視し、メールやSMSで警告を送るためにそれらを使用しています。
http://www.mt4i.com/mtdashboard.aspx
init()からstart()を呼び出せば...ティックが来なくてもstart()の中にいることになる!
いけません! init()は2秒後に返されることになっています。 initはブロックしてはいけないのです! そこからあらゆる種類の問題が発生する可能性があります(そして発生するでしょう)。
EAをロードした後、次の利用可能なティックで自動的に開始が呼び出されることを期待して、開始でループを実行するだけです。接続が切れる前に ティックがあったので、このイベントが発生したとき、あなたのループはすでに実行されているはずです。
週末に実行する必要があるために init() の中で start() を実行する必要がある場合、唯一の正しい方法は PostMessage() を使用して tick を強制的に実行することです。メッセージを投稿し、initが戻る のを待つのです。MT4は通常の方法でstart()を呼び出し、init()はブロックされません。
例については、次の投稿を参照してください。
これは上記のスクリプトと同じ ですが、EAとして実装されて おり、1つのEAで両方のコンセプトを実証しています。
init()では、最初のstart()のトリガーとなる最初のティックを待ち受け、start()では無限ループでさらにティックを生成します。これらのティックは、同じチャートのすべてのインジケータによってピックアップされます。
これは、EAのinit()内でstart()を強制的に実行する唯一の正しい方法 です。インジケータでは、GUIスレッドでstart()が実行されるため、これを行うことは許されません。
このEAをチャート上に配置し、ターミナルを閉じて、インターネット接続を無効にしてからターミナルを起動してみてください(インターネットへの接続はオフのまま)、うまくいかないことがわかると思います。
このEAをチャート上に置いてみてください。ターミナルを閉じて、インターネット接続を無効にし、ターミナルをオンにします(インターネットへの接続がオフの間)&あなたはそれが動作しないことがわかります。
しかし、それは通常の条件下で開始されると実行し続ける 必要があります(これは通常のユースケースであるべきです)。起動した後に切断してみてください。
そして、init()のブロッキングを回避し、スクリプトではなくEAとして実行する方法の例となります。
しかし、それは通常の条件下(通常のユースケースであるべき)で一度開始されると実行し続ける はずです。それが開始された後、切断してみてください。
そして、init()のブロッキングを回避し、スクリプトの代わりにEAとして実行する方法の例として役立ちます。
あなたの言うとおりですが、私はあなたが説明する状況に対する解決策を探しているのではなく、私が説明する状況に対する解決策を探しています。今、私が見つけた唯一の解決策は、外部ソフトウェアが、スクリプトを実行することです。