エラー、バグ、質問 - ページ 1622 1...161516161617161816191620162116221623162416251626162716281629...3185 新しいコメント Alexey Navoykov 2016.07.30 05:42 #16211 fxsaber:ビジュアルテストから、時々閉まらない窓があることについてのようです。再現できないんですけどね。今は動いています。テストや最適化を行っていますか? 後者であれば、確かに問題がありますね。 削除済み 2016.07.30 06:25 #16212 Karputov Vladimir:以下は、「ファイル」メニュー - 「取引口座に接続」 - 「OK」ボタンをクリック - このようにターミナルは、最後にオーサリングされた取引口座に接続するスクリプトを表示します。#ifndef _IsX64 #define HWND long #define HMENU long #define HBITMAP long #define ULONG_PTR long #else #define HWND int #define HMENU int #define HBITMAP int #define ULONG_PTR int #endif IsX64は、この方法では使用できません。 実行時にのみ関係します。 fxsaber 2016.07.30 09:26 #16213 Alexey Navoykov:テストや最適化を行っていますか? 後者であれば、確かに問題がありますね。 シングルランでは、最適化を含めなかった。 Vladimir Karputov 2016.07.30 10:14 #16214 Koldun Zloy: IsX64は、この方法では使用できません。 実行時のみの問題 です。ご指摘ありがとうございます。修正し、インクルードファイルとして作成しました。//+------------------------------------------------------------------+ //| LoginToTradeAccount.mqh | //| Copyright © 2016, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2016, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" #property description "Library for clicks on the MetaTrader 5 menu \"File\" item \"Login to trading account\"" #property description "Библиотека для кликов по меню MetaTrader 5 \"Файл\" пункт \"Подключиться к торговому счёту\"" int number_menu=1; //menu "File"; меню "Файл" int item_menu=14; //item "Login to trading account"; пункт "Подключиться к торговому счёту" #define GA_ROOT 0x00000002 // Retrieves the root window by walking the chain of parent windows #define WM_COMMAND 0x00000111 #define BM_CLICK 0x000000F5 #import "user32.dll" int GetLastError(); //+------------------------------------------------------------------+ //| GetAncestor. Retrieves the handle to the ancestor of the | //| specified window. Возвращает хендл предка заданного окна | //+------------------------------------------------------------------+ //--- x64 long GetAncestor(long hwnd,int gaFlags); //--- x86 int GetAncestor(int hwnd,int gaFlags); //+------------------------------------------------------------------+ //| GetMenu. Retrieves a handle to the menu assigned to the | //| specified window. Возвращает хендл меню, | //| назначенного указанному окну. | //+------------------------------------------------------------------+ //--- x64 long GetMenu(long hWnd); //--- x86 int GetMenu(int hWnd); //+------------------------------------------------------------------+ //| GetSubMenu. Retrieves a handle to the drop-down menu or submenu | //| activated by the specified menu item. Возвращает хендл | //| выпадающего меню или подменю указанного пункта меню. | //+------------------------------------------------------------------+ //--- x64 long GetSubMenu(long hMenu,int nPos); //--- x86 int GetSubMenu(int hMenu,int nPos); //+------------------------------------------------------------------+ //| GetMenuItemID. Retrieves the menu item identifier of a menu item | //| located at the specified position in a menu. Возвращает | //| идентификатор пункта меню, расположенного в | //| указанной позиции в меню. | //+------------------------------------------------------------------+ //--- x64 int GetMenuItemID(long hMenu,int nPos); //--- x86 int GetMenuItemID(int hMenu,int nPos); //+------------------------------------------------------------------+ //| PostMessageW. Places (posts) a message in the message queue | //| associated with the thread that created the specified window | //| and returns without waiting for the thread to process the | //| message. Размещает (публикует) сообщение в очереди сообщений, | //| связанной с потоком, который создал указанное окно и | //| возвращается, не дожидаясь потока, чтобы обработать сообщение. | //+------------------------------------------------------------------+ //--- x64 bool PostMessageW(long hWnd,int Msg,int wParam,int lParam); //--- x86 bool PostMessageW(int hWnd,int Msg,int wParam,int lParam); //+------------------------------------------------------------------+ //| GetLastActivePopup. Determines which pop-up window owned by the | //| specified window was most recently active. Определяет, какое | //| всплывающее окно, принадлежащие указанному окну, совсем недавно | //| было активным. | //+------------------------------------------------------------------+ //--- x64 long GetLastActivePopup(long hWnd); //--- x86 int GetLastActivePopup(int hWnd); //+------------------------------------------------------------------+ //| GetDlgItem. Retrieves a handle to a control in the specified | //| dialog box. Возвращает хэндл элемента управления в | //| указанном диалоговом окне. | //+------------------------------------------------------------------+ //--- x64 long GetDlgItem(long hDlg,int nIDDlgItem); //--- x86 int GetDlgItem(int hDlg,int nIDDlgItem); #import //+------------------------------------------------------------------+ //| Click on the item "Login to trading account" | //| Клик на пункте "Подключиться к торговому счёту" | //+------------------------------------------------------------------+ void LoginToTradeAccount() { long mainChartID=ChartID(); //returns the ID of the current chart; возвращает идентификатор текущего графика int hdlmainChartID=ChartWindowsHandle(mainChartID); //returns the Chart window handle (HWND); получает хэндл графика if(_IsX64) { long hdlRoot=GetAncestor((long)hdlmainChartID,GA_ROOT); long hmenu=GetMenu(hdlRoot); long hsubmenu=GetSubMenu(hmenu,number_menu); int hpos=GetMenuItemID(hsubmenu,item_menu); PostMessageW(hdlRoot,WM_COMMAND,hpos,0); Sleep(2000); long hlastPopup=GetLastActivePopup(hdlRoot); long hOK=GetDlgItem(hlastPopup,0x00000001); PostMessageW(hOK,BM_CLICK,0,0); } else { int hdlRoot=GetAncestor(hdlmainChartID,GA_ROOT); int hmenu=GetMenu(hdlRoot); int hsubmenu=GetSubMenu(hmenu,number_menu); int hpos=GetMenuItemID(hsubmenu,item_menu); PostMessageW(hdlRoot,WM_COMMAND,hpos,0); Sleep(2000); int hlastPopup=GetLastActivePopup(hdlRoot); int hOK=GetDlgItem(hlastPopup,0x00000001); PostMessageW(hOK,BM_CLICK,0,0); } } //+------------------------------------------------------------------+ //| The function gets the handle graphics | //| Функция получает хэндл графика | //+------------------------------------------------------------------+ int ChartWindowsHandle(long chart_ID) { //--- prepare the variable to get the property value //--- подготовим переменную для получения значения свойства long result=-1; //--- reset the error value //--- сбросим значение ошибки ResetLastError(); //--- receive the property value //--- получим значение свойства if(!ChartGetInteger(chart_ID,CHART_WINDOW_HANDLE,0,result)) { //--- display the error message in Experts journal //--- выведем сообщение об ошибке в журнал "Эксперты" Print(__FUNCTION__+", Error Code = ",GetLastError()); } //--- return the value of the chart property //--- вернем значение свойства графика return((int)result); } //+------------------------------------------------------------------+ ファイル: LoginToTradeAccount.mqh 7 kb Vladimir Karputov 2016.07.30 16:23 #16215 Dmitri Custurov: 残念ながら、そうとは限りません。長時間接続がない場合、端末に「Account disable」と表示され、手動でログインする必要があります。例えば、夜間はサーバーの電源を切っているようなファンドでは、このようなことが起こります。EAは定期的に取引サーバーへの接続状態(TERMINAL_CONNECTED)をチェックし、返された値が「0」であれば、(WIn APIを使って)「ファイル」メニューの「取引口座に接続」項目を呼び出します。メニュークリック機能が実装されているインクルードファイルはこちら です。EAの一例。//+------------------------------------------------------------------+ //| TestAccountDisable.mq5 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #include <LoginToTradeAccount.mqh> //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetTimer(12); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- static bool cleaner=false; if(!cleaner) { long rezult=TerminalInfoInteger(TERMINAL_CONNECTED); Comment("TERMINAL_CONNECTED: ",IntegerToString(rezult)); if(rezult==0) LoginToTradeAccount(); } else Comment(""); cleaner=!cleaner; } //+------------------------------------------------------------------+ Advisorは12秒ごとに接続状態をチェックし、たまにコメントを消去する。 TheXpert 2016.07.30 17:48 #16216 本当に定義がないのでしょうか? Aliaksandr Yemialyanau 2016.07.31 07:40 #16217 配列ファイルをEAに接続するにはどうすればよいですか?まず、スクリプトは配列を書き込む。string filename="mas.dat"; int handle=FileOpen(filename,FILE_BIN|FILE_WRITE); FileWriteArray(handle,hol,0,4608); FileClose(handle);EAでファイルを繋いでいます。#include <mas.dat> コンパイル時にエラーが発生する。'????????????????????????' - 識別子が長すぎる mas.dat 1 1'' - 不明な記号 mas.dat 1 3015 Aleksey Vyazmikin 2016.07.31 11:04 #16218 Aliaksandr Yemialyanau:配列ファイルをEAに接続するにはどうすればよいですか?まず、スクリプトは配列を書き込む。EAでファイルを繋いでいます。コンパイル時にエラーが発生する。'????????????????????????' - 識別子が長すぎる mas.dat 1 1'' - 不明な記号 mas.dat 1 3015 配列ファイル全体をメモリに読み込んでから作業したほうが、何倍も速くなるのです。 Dmitri Custurov 2016.07.31 12:17 #16219 Karputov Vladimir:EAは定期的に取引サーバーへの接続状態(TERMINAL_CONNECTED)をチェックし、返された値が「0」であれば、(WIn APIを使って)「ファイル」メニューの「取引口座に接続」項目を呼び出します。メニュークリック機能が実装されているインクルードファイルはこちら です。EAの一例。アドバイザーは12秒ごとに接続状態を確認し、たまにコメントを消去しています。 解決策を提供していただき、ありがとうございました。すべてがうまくいっている。 fxsaber 2016.07.31 12:18 #16220 デバッギング#define i ii void OnTick() { for (int i = 0; i < 5; i++) Print(i); // отладчик по Shift+F9 показывает не ii, а i, выдавая Unknown identifier } 1...161516161617161816191620162116221623162416251626162716281629...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ビジュアルテストから、時々閉まらない窓があることについてのようです。再現できないんですけどね。今は動いています。
テストや最適化を行っていますか? 後者であれば、確かに問題がありますね。
以下は、「ファイル」メニュー - 「取引口座に接続」 - 「OK」ボタンをクリック - このようにターミナルは、最後にオーサリングされた取引口座に接続するスクリプトを表示します。
IsX64は、この方法では使用できません。 実行時にのみ関係します。
テストや最適化を行っていますか? 後者であれば、確かに問題がありますね。
IsX64は、この方法では使用できません。 実行時のみの問題 です。
ご指摘ありがとうございます。修正し、インクルードファイルとして作成しました。
残念ながら、そうとは限りません。長時間接続がない場合、端末に「Account disable」と表示され、手動でログインする必要があります。例えば、夜間はサーバーの電源を切っているようなファンドでは、このようなことが起こります。
EAは定期的に取引サーバーへの接続状態(TERMINAL_CONNECTED)をチェックし、返された値が「0」であれば、(WIn APIを使って)「ファイル」メニューの「取引口座に接続」項目を呼び出します。メニュークリック機能が実装されているインクルードファイルはこちら です。EAの一例。
Advisorは12秒ごとに接続状態をチェックし、たまにコメントを消去する。
配列ファイルをEAに接続するにはどうすればよいですか?
まず、スクリプトは配列を書き込む。
EAでファイルを繋いでいます。
#include <mas.dat>コンパイル時にエラーが発生する。
'????????????????????????' - 識別子が長すぎる mas.dat 1 1
'' - 不明な記号 mas.dat 1 3015
配列ファイルをEAに接続するにはどうすればよいですか?
まず、スクリプトは配列を書き込む。
EAでファイルを繋いでいます。
コンパイル時にエラーが発生する。
'????????????????????????' - 識別子が長すぎる mas.dat 1 1
'' - 不明な記号 mas.dat 1 3015
EAは定期的に取引サーバーへの接続状態(TERMINAL_CONNECTED)をチェックし、返された値が「0」であれば、(WIn APIを使って)「ファイル」メニューの「取引口座に接続」項目を呼び出します。メニュークリック機能が実装されているインクルードファイルはこちら です。EAの一例。
アドバイザーは12秒ごとに接続状態を確認し、たまにコメントを消去しています。