Cześć wszystkim,
Zastanawiam się, czy jakiś guru kodu może pomóc mi wskazać właściwy kierunek w tej sprawie. Jestem przeciwieństwem profesjonalnego programisty, ale spędziłem niezliczone godziny na panelu handlowym, który bardzo ładnie się układa i trafiam na kilka błędów, przez które po prostu nie mogę wymyślić, jak się przez to przedostać. Ten post dotyczy pierwszego błędu. Z góry przepraszam za długość.
Znalazłem i użyłem bloku kodu z tego wątku, aby umożliwić mi dodawanie wskaźników z mojego własnego niestandardowego interfejsu użytkownika na żądanie:
https://www.mql5.com/en/forum/73391/page3(post #27 autorstwa Kray). Musiałem dokonać drobnych poprawek w zakresie korzystania z poleceń Sleep i klawiszy i ogólnie działało. (Zauważ, jak przyznaję poniżej, jestem hackiem, więc jeśli uważasz, że moje użycie tych poleceń jest duplikatem i głupie, jestem pewien, że masz rację - ale kiedy znalazłem kombinację, która zadziałała, nie chciałem zadzierać z nim, ponieważ jest dla mnie kruchy.)
Kopalnia poniżej:
Wstawiono kod #import user32.dll int GetAncestor(int, int); int RegisterWindowMessageW(ciąg NazwaWiadomości);/Dla niestandardowego wskaźnika Start int PostMessageW(int hwnd,int msg,int wparam,uchar Name#91;#93;);/Dla niestandardowego wskaźnika Start int FindWindowW(string lpszClass,string lpszWindow);/Dla niestandardowego wskaźnika Start/int keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);/Dla niestandardowego wskaźnika Uruchom #import #define VK_RETURN 13/ENTER key#import/Dla niestandardowego wskaźnika Uruchom void StartCustomIndicator(int hWnd,string IndicatorName,bool AutomaticallyAcceptDefaults=true)/true = pomiń okno dialogowe wskaźnika { Sleep( 100); nazwa uchar2#91;#93;; StringToCharArray(NazwaWskaźnika,nazwa2,0,StringL en(NazwaWskaźnika)); Print(NazwaWskaźnika= NazwaWskaźnika); Print(Rozmiar tablicy(nazwa2)= Rozmiar tablicy(nazwa2)); for (int i = 0; i lt; Rozmiar tablicy(nazwa2); i ){ Print(nazwa2#91; i #93;= nazwa2#91;i#93;); } int MessageNumber=RegisterWindowMessageW(MetaTrader4_I nternal_Message); sen (100); int r=PostMessageW(hWnd,MessageNumber,15,name2); sen (200); if(Automatycznie AkceptujDomyślne) { keybd_event(13, 0, 0, 0); int ind_settings = FindWindowW(NULL, wskaźnik niestandardowy — nazwa_wskaźnika); PostMessageW(ind_settings,0x100,VK_RETURN,name2); keybd_event(13, 0, 0, 0); } }
Problem na początku polega na tym, że zawodził. Otrzymałbym błąd „Nie można otworzyć ścieżki” pliku. To był bloker na początku, ale potem zdałem sobie sprawę, że jeśli nadałem nazwę pliku wskaźnika dokładnie 15 znaków, zostałem odblokowany. Trwało to na ogół pomyślnie przez kilka dni, może nawet tydzień lub dwa. Ale sporadycznie miałbym problem, w którym mój wskaźnik i ciąg ścieżki były interpretowane niepoprawnie przez to, co mogę określić tylko jako funkcję PostMessageW. Kiedy to się nie powiodło, zgłaszał dodatkowe lub w inny sposób bezsensowne znaki w nazwie pliku, który próbuje otworzyć. Więc zamiast mówić Cannot open file 'MyIndies\MyIndicator.ex4', zostanie napisane Cannot open file 'MyIndies\MyIndicator?L .ex4'. Tak więc przez dobry tydzień lub dwa zwykle wskaźnik ładowałby się dobrze, ale sporadycznie ścieżka i nazwa wskaźnika byłyby niepoprawnie interpretowane. W takich przypadkach (być może po tym, jak zmieniłem ramki wykresów, kliknąłem na inne zakładki lub nie było mnie przez jakiś czas), zwykle mogłem po prostu ponownie załadować mój szablon lub EA i wrócić do stanu dobrego. Co ciekawe, we wszystkich przypadkach moje instrukcje Print w powyższym bloku kodu zawsze zwracają spójne wyniki. Są one spójne pod względem pomyślnego wywołania wskaźnika, a także interpretacji wielu wariantów nieprawidłowej nazwy pliku. Mogę się tylko domyślać, że błąd występuje w poleceniu PostMessageW, chociaż nie udało mi się zmusić go do odtworzenia błędu na żądanie, a na pewno nie mam pojęcia, dlaczego.
W ciągu ostatniego dnia lub dwóch nagle zawsze otrzymywałem komunikaty o błędach. Odkryłem metodą prób i błędów, że jeśli skróciłem długość nazwy wskaźnika z 15 do 14, wróciłbym do porządku. 15 było wcześniej bardzo wyraźnie magiczną liczbą, a teraz magiczna liczba to 14. Nie wiem, dlaczego jakakolwiek liczba byłaby magiczną liczbą, nie mówiąc już o tym, dlaczego wyraźnie i definitywnie zmieniła się dzień lub dwa temu. Jestem całkowicie skazany na zrozumienie tego wszystkiego i ślepy na to, jak działa ten interfejs API Windows, a także jestem noobem, jeśli chodzi o pracę z ucharami. Spędziłem godziny googlując i próbując to rozwiązać, ale bez powodzenia.
Jeśli ktoś może to wyjaśnić, pomóc mi rozwiązać, a nawet wskazać mi źródło, w którym mogę sobie pomóc, byłbym bardzo wdzięczny.
Jeśli doczytałeś tak daleko, bardzo dziękuję.
FtN