Vấn đề với PostMessageW trong MQL4
Trang 1 trên 622 12 CuốiCuối
Results 1 to 10 of 13

Thread: Vấn đề với PostMessageW trong MQL4

  1. #1
    Chào mọi người,

    Tôi đang tự hỏi liệu bất kỳ chuyên gia mã nào có thể giúp chỉ cho tôi đi đúng hướng về vấn đề này. Tôi đối lập với một chuyên gia lập trình, nhưng tôi đã dành vô số giờ trên một bảng giao dịch đang diễn ra rất tốt và tôi đang gặp phải một số lỗi mà tôi không thể tìm ra cách vượt qua. Bài đăng này giải quyết lỗi đầu tiên. Xin lỗi trước về độ dài.

    Tôi đã tìm thấy và sử dụng khối mã từ chuỗi này để cho phép tôi thêm các chỉ báo từ giao diện người dùng tùy chỉnh của riêng mình theo yêu cầu:
    https://www.mql5.com/en/forum/73391/page3(bài # 27 của Kray). Tôi đã phải thực hiện các chỉnh sửa nhỏ về cách sử dụng Sleep và các lệnh keybd, và nhìn chung, nó đã hoạt động. (Lưu ý như tôi thừa nhận bên dưới, tôi là một kẻ hack, vì vậy nếu bạn nghĩ rằng việc sử dụng các lệnh này của tôi là trùng lặp về bản chất và ngu ngốc, tôi chắc chắn rằng bạn đúng - nhưng khi tôi tìm thấy một tổ hợp hoạt động, tôi không muốn để gây rối với nó, vì nó rất giòn đối với tôi.)
    Của tôi bên dưới:

    Đã chèn Mã #import user32.dll int GetAncestor (int, int); int RegisterWindowMessageW (string MessageName);/Đối với chỉ báo tùy chỉnh Bắt đầu int PostMessageW (int hwnd, int msg, int wparam, uchar Tên # 91; # 93;);/Đối với chỉ báo tùy chỉnh Bắt đầu int FindWindowW (string lpszClass, string lpszWindow);/Đối với chỉ báo tùy chỉnh Bắt đầu/int keybd_event (int bVk, int bScan, int dwFlags, int dwExtraInfo);/Đối với Bắt đầu chỉ báo tùy chỉnh #import #define VK_RETURN 13/Phím ENTER # nhập/Đối với Bắt đầu chỉ báo tùy chỉnh void StartCustomIndicator (int hWnd, string IndicatorName, bool AutomaticallyAcceptDefaults = true)/true = bỏ qua hộp thoại chỉ báo {Sleep ( 100); uchar tên2 # 91; # 93 ;; StringToCharArray (IndicatorName, name2,0, StringLen (IndicatorName)); In (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); Ngủ (100); int r = PostMessageW (hWnd, MessageNumber, 15, name2); Ngủ (200); if (AutomaticallyAcceptDefaults) {keybd_event (13, 0, 0, 0); int ind_settings = FindWindowW (NULL, Chỉ báo tùy chỉnh - Tên chỉ báo); PostMessageW (ind_settings, 0x100, VK_RETURN, name2); keybd_event (13, 0, 0, 0); }}
    Vấn đề ngay từ đầu là nó đã thất bại. Tôi gặp lỗi Không thể mở tệp 'đường dẫn'. Đây là một trình chặn sớm nhưng sau đó tôi phát hiện ra rằng nếu tôi đặt tên tệp chỉ báo của mình chính xác 15 ký tự, thì tôi đã được bỏ chặn. Điều này thường diễn ra thành công trong nhiều ngày, thậm chí có thể một hoặc hai tuần. Nhưng đôi khi, tôi sẽ gặp sự cố trong đó chỉ báo và chuỗi đường dẫn của tôi được diễn giải không chính xác bởi những gì tôi chỉ có thể xác định là hàm PostMessageW. Khi không thành công, nó đã báo cáo lại các ký tự thừa hoặc vô nghĩa trong tên tệp mà nó đang cố mở. Vì vậy, thay vì nói Không thể mở tệp 'MyIndies \ MyIndicator.ex4', nó sẽ nói Không thể mở tệp 'MyIndies \ MyIndicator? L .ex4.' Vì vậy, trong một hoặc hai tuần thuận lợi, thường thì chỉ báo sẽ tải tốt, nhưng đôi khi đường dẫn và tên chỉ báo của tôi sẽ được diễn giải không chính xác. Trong những trường hợp đó (có lẽ sau khi tôi thay đổi khung biểu đồ, hoặc nhấp vào các tab khác, hoặc đã bỏ đi trong một thời gian), tôi thường có thể tải lại mẫu hoặc EA của mình và trở lại bình thường. Điều thú vị là trong mọi trường hợp, các câu lệnh Print của tôi trong khối mã trên luôn trả về kết quả nhất quán. Chúng nhất quán về thời điểm chỉ báo được gọi thành công cũng như khi nhiều biến thể của tên tệp không chính xác được diễn giải. Tôi chỉ có thể đoán rằng lỗi xảy ra trong lệnh PostMessageW, mặc dù tôi không thể buộc nó tạo lại lỗi theo yêu cầu và tôi chắc chắn không biết tại sao.

    Trong một hoặc hai ngày qua, đột nhiên tôi luôn nhận được thông báo lỗi. Tôi đã phát hiện ra thông qua một số thử nghiệm và sai sót rằng nếu tôi giảm độ dài tên chỉ báo của mình từ 15 ký tự xuống 14 ký tự, tôi sẽ trở lại bình thường. 15 là con số kỳ diệu trước đây rất rõ ràng, và bây giờ con số kỳ diệu là 14. Tôi không biết tại sao bất kỳ con số nào cũng là một con số kỳ diệu, hãy nói đến lý do tại sao nó đã thay đổi rõ ràng và dứt khoát kể từ một hoặc hai ngày trước. Tôi hoàn toàn không hiểu về bất kỳ điều gì trong số này và mù mờ về cách thức hoạt động của công cụ Windows API này và tôi cũng là một người không có kinh nghiệm khi làm việc với uchars. Tôi đã dành hàng giờ để tìm kiếm và cố gắng sắp xếp nó nhưng không thành công.

    Nếu ai đó có thể giải thích điều này, giúp tôi giải quyết, hoặc thậm chí chỉ tôi đến một nguồn mà tôi có thể tự giúp mình, tôi sẽ đánh giá cao nhất.

    Nếu bạn đã đọc đến đây, cảm ơn bạn rất nhiều.
    FtN

  2. #2
    2 (Các) tệp đính kèm Đã được kiểm tra bằng tiếng Anh, Đức, Nga, Ả Rập và Trung Quốc. Đối với tôi, nó hoạt động ở mọi nơi (MT4MetaEditor 5.00 bản dựng 2318 mới nhất). Đính kèm là tập lệnh thử nghiệm phù hợp với tôi.
    https://www.forexibroker.com/attachm...1979508731.mq4
    https://www.forexibroker.com/attachm...1931182141.ex4

  3. #3

    Quote Originally Posted by ;
    {quote} Hộp thoại chỉ báo mở ra nhưng thiếu nhấp chuột OK - vì vậy cửa sổ hộp thoại chỉ báo vẫn mở mãi mãi và tôi nhận được Lỗi: Không tìm thấy hộp thoại chỉ báo (Hàm FindWindowW () không tìm thấy cửa sổ hộp thoại - hWnd vẫn 0)
    Tôi thay thế toàn bộ cách nhấp vào nút bằng thông báo cửa sổ thích hợp. Tôi có thể đã tìm kiếm OK nhưng sau đó nó sẽ lại thất bại nếu người dùng chuyển đổi ngôn ngữ đầu cuối. Và bây giờ tôi đã thử nghiệm trước khi tải lên :-) Nó có hiệu quả với bạn không? Phiên bản làm việc đã sửa: Đã chèn Mã #import user32.dll int RegisterWindowMessageW (string lpString); int FindWindowW (string lpClassName, string lpWindowName); int GetDlgItem (int hDlg, int nIdDlgItem); int SetActiveWindow (int hWnd); bool PostMessageA (int hWnd, int msg, int wParam, uchar lParam # 91; # 93; bool PostMessageW (int hWnd, int msg, int wParam, int lParam); #import #define MAX_PATH 260/ví dụ: tối đa. đường dẫn trên ổ đĩa D là D: \ some-256-chars-path-stringlt; NULgt; #define MT4_LOAD_CUSTOM_INDICATOR 15 #define IDC_CUSTOM_INDICATOR_OK 1/id điều khiển của nút Ok trong hộp thoại Custom Indicator #define BM_CLICK 0x00F5 uchar buffer # 91; MAX_PATH # 93 ;;** * *void StartCustomIndicator (int hWnd, string indicatorName, bool autoCloseDlg = true) {StringToCharArray (indicatorName, buffer); int WM_MT4 = RegisterWindowMessageW (MetaTrader4_Internal_Message); PostMessageA (hWnd, WM_MT4, MT4_LOAD_CUSTOM_INDICATOR, bộ đệm); if (autoCloseDlg) {string className, title = Custom Indicator - indicatorName; int i = 0; while (i lt; 5) {Ngủ (200); int hWndDlg = FindWindowW (className, title); if (hWndDlg! = 0) {int hWndOk = GetDlgItem (hWndDlg, IDC_CUSTOM_INDICATOR_OK); if (hWndOk! = 0) {SetActiveWindow (hWndDlg); PostMessageW (hWndOk, BM_CLICK, 0, 0); } else Print (Lỗi: không tìm thấy nút \ OK \); phá vỡ; } i ; if (i gt; = 5) Print (Lỗi: Hộp thoại \ tiêu đề \ không tìm thấy); }}

  4. #4

    Quote Originally Posted by ;
    {quote} Vâng, đó là MQL5 vô nghĩa. Để giải quyết vấn đề này, tôi đã phải thêm một lần nhập hàm thứ hai. Điều này có khắc phục được không? Cảm ơn :-)
    Hộp thoại chỉ báo mở ra nhưng không có nhấp chuột OK - vì vậy cửa sổ hộp thoại chỉ báo vẫn mở mãi mãi và tôi nhận được lỗi: Lỗi không tìm thấy hộp thoại chỉ báo (Hàm FindWindowW () không tìm thấy cửa sổ hộp thoại - hWnd vẫn là 0)

  5. #5

    Quote Originally Posted by ;
    {quote} Gặp lỗi này khi tôi cố gắng biên dịch (MT4MetaEditor 5.00 build 2302) {image}
    Vâng, đó là MQL5 tốt nhất của nó. Để giải quyết vấn đề này, tôi đã phải thêm một lần nhập hàm thứ hai. Khởi chạy VirtualBox và thử nghiệm với trình biên dịch MT5. Có vẻ như để sửa chữa nó. Cảm ơn :-)

  6. #6
    1 (các) tệp đính kèm
    Quote Originally Posted by ;
    Ai đó có kiến ​​thức MQL4.5 có thể xác nhận rằng các chuỗi cục bộ được khởi tạo rõ ràng bằng con trỏ NULL không? Chuỗi toàn cầutĩnh được khởi tạo bằng gì? Một con trỏ NULL? Một chuỗi trống? Cảm ơn
    Gặp lỗi này khi tôi cố gắng biên dịch (MT4MetaEditor 5.00 build 2302)

  7. #7
    Ai đó có kiến ​​thức về MQL4.5 có thể xác nhận rằng các chuỗi cục bộ được khởi tạo rõ ràng bằng con trỏ NULL không? Chuỗi toàn cầutĩnh được khởi tạo bằng gì? Một con trỏ NULL? Một chuỗi trống? Cảm ơn

  8. #8

    Quote Originally Posted by ;
    Điều này thật tuyệt vời ...
    Có nhiều lỗi hơn trong tập lệnh của bạn. (1) keybd_event () không nên được sử dụng. Nó cồng kềnh và dễ xảy ra lỗi. Bạn có hai lần một câu lệnh giống hệt nhau trong mã của mình và nó không hoạt động. Điều đó một mình chứng minh quan điểm của tôi. (2) Lệnh gọi FindWindowW () không hợp lệ. Bạn truyền NULL làm tham số đầu tiên mà trên thực tế là một int (không). Vì chữ ký nhập của bạn mong đợi một chuỗi, số nguyên 0 được chuyển đổi thành chuỗi 0 và được chuyển dưới dạng tên lớp. FindWindow () sẽ không bao giờ tìm thấy bất cứ thứ gì như vậy vì một lớp có tên 0 không tồn tại trong hệ thống. Hãy thử đoạn mã đính kèm trong mã của bạn. Tôi đã xóa những thứ liên quan đến keybord và thay vào đó nhấp trực tiếp vào nút OK của hộp thoại. Tốt hơn nhiều so với xử lý bằng mã khóa ảo. Có thể có cảnh báolỗi trình biên dịch vì tôi chỉ có thể kiểm tra nó bằng trình biên dịch ANSI MQL. Phiên bản bị hỏng, phiên bản đã sửa tại bài đăng # 11 Đã chèn Mã #import user32.dll int RegisterWindowMessageW (string lpString); bool PostMessageA (int hWnd, int msg, int wParam, uchar lParam # 91; # 93; bool PostMessageW (int hWnd, int msg, int wParam, int lParam); int FindWindowW (string lpClassName, string lpWindowName); #import #define MAX_PATH 260/ví dụ: tối đa. đường dẫn trên ổ đĩa D là D: \ some-256-chars-path-stringlt; NULgt; #define MT4_LOAD_CUSTOM_INDICATOR 15 #define WM_COMMAND 0x0111 #define IDC_CUSTOM_INDICATOR_OK 1/id điều khiển của nút Ok trong hộp thoại Chỉ báo tùy chỉnh #define IDC_CUSTOM_INDICATOR_CANCEL 2/uNDICATOR_INDT_CADN # 9321/IDPATH # 9321/IDPATH # 93 ;** * *void StartCustomIndicator (int hWnd, string indicatorName, bool autoCloseDlg = true) {StringToCharArray (indicatorName, buffer); int WM_MT4 = RegisterWindowMessageW (MetaTrader4_Internal_Message); PostMessageA (hWnd, WM_MT4, MT4_LOAD_CUSTOM_INDICATOR, bộ đệm); if (autoCloseDlg) {string className, title = Custom Indicator - indicatorName; int i = 0; while (i lt; 5) {Ngủ (200); hWnd = FindWindowW (className, title); if (hWnd! = 0) {PostMessageW (hWnd, WM_COMMAND, IDC_CUSTOM_INDICATOR_OK, 0); phá vỡ; } i ; if (i gt; = 5) Print (Lỗi: Không tìm thấy hộp thoại chỉ báo); }}} Như bạn có thể thấy, tôi truyền một con trỏ NULL thực (một chuỗi không được khởi tạo) làm tham số đầu tiên cho FindWindow (). Tại sao mã của bạn đôi khi hoạt động và đôi khi không? Vì sử dụng keybd_event (). Việc ném tổ hợp phím vào hệ điều hành của bạn hiếm khi hoạt động. Đôi khi nó làm. Lệnh gọi PostMessage () thứ hai của bạn không bao giờ thành công vì xử lý được sử dụng luôn không hợp lệ. chỉnh sửa: biến sửa lỗi đã được xác định chỉnh sửa: thông số sửa lỗi được truyền dưới dạng tham chiếu, biến được mong đợi

  9. #9
    Điều này đã được tuyệt vời. Tôi đã thực hiện các bản cập nhật và hoàn toàn không bị chặn về vấn đề đó. Cảm ơn bạn rất nhiều vì sự giúp đỡ! Trong bài viết trước của tôi, tôi đã đề cập rằng đó chỉ là một lỗi. Những người khác ít nghiêm trọng hơn nhưng tôi vẫn đang cố gắng giải quyết. Điều tiếp theo là hai trong số các chỉ báo tùy chỉnh của tôi từ chối tự động đóng hộp thoại chỉ báo khi tôi cố gắng tự động bật chúng bằng cách sử dụng mã từ bài đăng trước của tôi; đối với hai chỉ báo này, cửa sổ xuất hiện và ở đó cho đến khi tôi nhấp vào OK. Điểm chung duy nhất mà tôi có thể thấy giữa chúng là chúng thực sự vẽ các đường trên biểu đồ - một người vẽ nhiều đường thẳng đứng; các ô còn lại có nhiều đường ngang. Đây dường như không phải là một lý do đủ tốt để các hộp thoại chỉ báo của họ không tự đóng khi tất cả những người khác làm, nhưng đó là điều duy nhất tôi thấy làm cho những hộp thoại này khác với những hộp thoại khác. Có bất kỳ lý do rõ ràng hoặc hợp lý nào mà nhiều chỉ báo sẽ tự động đóng hộp thoại thành công bằng cách sử dụng mã của tôi ở trên, nhưng hai chỉ báo cứng đầu này thì không? Cảm ơn một lần nữa trước, FtN

  10. #10
    Chuyển đổi chuỗi thành mảng chỉ nên là: Đã chèn mã StringToCharArray (IndicatorName, name2); Điều này sẽ sao chép chuỗi và bao gồm một số 0 kết thúc.

Quyền đăng bài

  • Bạn không thể đăng bài viết mới
  • Bạn không thể đăng trả lời
  • Bạn không thể đăng tệp đính kèm
  • Bạn không thể chỉnh sửa bài đăng của bạn
  •  
Chính sách Cookie
Chính sách Cookie: Website forexibroker sử dụng cookies và khi tiếp tục sử dụng website bạn chấp thuận với điều này. Để có thêm thông tin, vui lòng đọc 'Thông tin Cookie'.