皆さんこんにちは、
コードの達人が私をこれについて正しい方向に向けるのを助けることができるのではないかと思います。私はプログラミングの専門家とは正反対ですが、非常にうまくやってくるトレーディングパネルに数え切れないほどの時間を費やしてきました。そして、どうやって乗り越えればいいのかわからないいくつかのバグにぶつかっています。この投稿は最初のバグに対処します。長さは事前に申し訳ありません。
このスレッドのコードブロックを見つけて使用し、独自のカスタムUIからインジケーターをオンデマンドで追加できるようにしました。
https://www.mql5.com/en/forum/73391/page3(Krayによる投稿#27)。 Sleepとkeybdコマンドの使用に関しては、微調整を行う必要がありましたが、通常は機能しています。 (以下で認めているように、私はハックです。したがって、これらのコマンドの使用が本質的に重複していて愚かであると思われる場合は、あなたが正しいと確信しています-しかし、機能するコンボを見つけたとき、私は望んでいませんでしたそれは私にとってもろいので、それを台無しにする。)
以下の鉱山:
挿入されたコード#importuser32.dllint GetAncestor(int、int); int RegisterWindowMessageW(string MessageName);/開始カスタムインジケーターの場合intPostMessageW(int hwnd、int msg、int wparam、uchar Name#91;#93;);/開始カスタムインジケーターの場合intFindWindowW(string lpszClass、string lpszWindow);/カスタムインジケーターの開始//intkeybd_event(int bVk、int bScan、int dwFlags、int dwExtraInfo);/カスタムインジケーターの開始#import#defineVK_RETURN 13/ENTER key#import//カスタムインジケーターの開始voidStartCustomIndicator(int hWnd、string IndicatorName、bool AutomaticAcceptDefaults = true)//true =インジケーターダイアログボックスをスキップ{Sleep( 100); uchar name2#91;#93 ;; StringToCharArray(IndicatorName、name2,0、StringLen(IndicatorName)); Print(IndicatorName = IndicatorName); Print(ArraySize(name2)= ArraySize(name2)); for(int i = 0; i lt; ArraySize(name2); i ){Print(name2#91; i #93; = name2#91; i#93;); } int MessageNumber = RegisterWindowMessageW(MetaTrader4_Internal_Message); Sleep(100); int r = PostMessageW(hWnd、MessageNumber、15、name2);スリープ(200); if(AutomaticallyAcceptDefaults){keybd_event(13、0、0、0); int ind_settings = FindWindowW(NULL、カスタムインジケーター- IndicatorName); PostMessageW(ind_settings、0x100、VK_RETURN、name2); keybd_event(13、0、0、0); }}
初期の問題はそれが失敗していたことです。ファイルを開くことができません'パス'エラーが発生します。これは早い段階でブロッカーでしたが、インジケーターのファイル名を正確に15文字にすると、ブロックが解除されることがわかりました。これは、一般的に数日間、場合によっては1、2週間も成功裏に続きました。しかし、断続的に、PostMessageW関数であるとしか判断できないものによってインジケーターとパス文字列が誤って解釈されるという問題が発生します。それが失敗したとき、それはそれが開こうとしているファイル名の余分なまたはそうでなければ意味のない文字を報告していました。したがって、「ファイルを開くことができません」「MyIndies \ MyIndicator.ex4」ではなく、「ファイルを開くことができません」「MyIndies \ MyIndicator?L.ex4」と表示されます。そのため、1〜2週間は通常、インジケーターは正常に読み込まれますが、断続的にインジケーターのパスと名前が正しく解釈されませんでした。そのような場合(おそらく、チャートフレームを変更した後、他のタブをクリックした後、またはしばらく離れた後)、通常はテンプレートまたはEAをリロードして、元の状態に戻すことができます。興味深いことに、すべての場合において、上記のコードブロックのPrintステートメントは常に一貫した結果を返します。これらは、インジケーターが正常に呼び出されたときと、誤ったファイル名の複数のバリアントが解釈されたときの点で一貫しています。 PostMessageWコマンドでエラーが発生したと推測することしかできませんが、オンデマンドでエラーを再現するように強制することはできませんでした。その理由は確かにわかりません。
最後の1、2日で、突然エラーメッセージが表示されていました。試行錯誤の結果、インジケーター名の長さを15文字から14文字に短縮すると、元の状態に戻ることがわかりました。 15は以前は明らかにマジックナンバーでしたが、現在は14です。1、2日前の時点で明らかに明確に変更された理由は言うまでもなく、なぜマジックナンバーになるのかわかりません。私はこれを理解するのに完全に行き詰まっており、このWindows APIがどのように機能するかを知らないので、ucharの操作に関しても初心者です。私は何時間もグーグルしてそれを整理しようとしましたが、成功しませんでした。
誰かがこれを説明したり、私が解決するのを手伝ったり、私が自分自身を助けることができるリソースを私に指摘したりすることができれば、私は最も感謝するでしょう。
ここまで読んでくださった方、本当にありがとうございました。
FtN