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