Sunday 10 December 2017

Kb multi system trading


MetaTrader 5 - przykłady. Przygotowanie Multi-Currency Multi-System Expert Advisor. Uważam, że jest sporo przedsiębiorców, którzy handlują więcej niż jednym symbolem handlowym i używają wielu strategii. To podejście nie tylko pozwala zwiększyć zyski, ale również zminimalizować ryzyko znacznego wyeliminowania efektywnego zarządzania pieniędzmi Podczas tworzenia Doradcy ds. Ekspertów, pierwszym naturalnym krokiem w celu sprawdzenia skuteczności strategii programu jest optymalizacja w celu określenia najlepszych parametrów wejściowych. Z wyszczególnionymi parametrami eksperci Techniczni byliby gotowi dla handlu Jednak to pozostawiłoby jedno ważne pytanie bez odpowiedzi Co by testowało wyniki, gdyby przedsiębiorca mógł umieścić wszystkie jego strategie razem w jednym Doradca eksperta Uświadomienie sobie, że wycofanie kilku symboli lub strategii może się w pewnym momencie pokrywać i spowodować straszne sumy wypłaty, a nawet wezwanie do uzupełnienia depozytu zabezpieczającego może czasami stanowić nieprzyjemną niespodziankę. W tym artykule wprowadzono koncepcję stworzenie wieloetapowego wielofunkcyjnego doradcy eksperta, który pozwoli nam znaleźć odpowiedź na to ważne pytanie.1 Struktura doradcy eksperta. Ogólnie rzecz biorąc, struktura doradcy eksperta wygląda następująco. Fig 1 Struktura Multi-currency multi-system Expert Advisor. Jak widać, program oparty jest na pętli for Każda strategia jest ułożona w pętli, w której każda iteracja jest odpowiedzialna za handel każdym symbolem osobno Tu można zorganizować w pętli nieograniczoną liczbę strategii Ważne jest, aby komputer dysponował wystarczającymi zasobami, aby przetworzyć taki program. Pamiętaj, że w MetaTrader 5 może występować tylko jedna pozycja dla każdego symbolu handlowego. Pozycja ta reprezentuje sumę poprzednio wykonanych zakupów i sprzedaży wynik wielokryterialnego testowania dla jednego symbolu nie będzie identyczny z sumą oddzielnych wyników testowania tych samych strategii dla tego samego symbolu. Aby zbadać strukturę eksperta A doradca podejmiemy 2 strategie, z których każda ma dwa symbole. Będziemy pytać ceny docierają do niższego pasma wskaźnika Bollinger Bands obliczonego na podstawie niskiej ceny Zamknięcie Ceny ofertowej docierają do dolnego pasma wskaźnika Bollinger Bands obliczonego na podstawie wysokiej ceny. cena osiąga górną granicę wskaźnika Bollinger Bands, obliczoną na podstawie wysokich cen Zamknięcie Zapytaj cenę, osiągając górny pas wskaźnika Bollinger Bands, obliczony na podstawie niskiej ceny. niedźwiedzię zamknij otwórz i zapytaj cenę osiągnie poprzedni pasek s wysoki zamknięcie przez stop loss lub zejście z zysku. Powtórz poprzedni pasek jest uproszczony zamknięty otwarty i cena oferty osiąga poprzedni próg niskie zamknięcie przez stop loss lub take profit. Restriction tylko jedna transakcja może być wykonywane na dowolnym pasku. Aby być niezależnym od nowych kleszczy dla symbolu, na którym zostanie przetestowany doradca eksperta lub który będzie handlował, zaleca się korzystanie z zabawy OnTimer w celu wprowadzenia trybu handlu wieloma walutami. W tym celu inicjując Doradcę Specjalistycznego, określamy częstotliwość generowania zdarzenia dla wywołania obliczania programu za pomocą funkcji EventSetTimer, a po deinicjalizacji używamy funkcji EventKillTimer, aby poinformować terminala o zatrzymaniu generowania zdarzeń. W przypadku EventSetTimer można również użyć EventSetMillisecondTimer, gdzie częstotliwość jest ustawiona na dokładność milisekundy, ale nie należy jej używać zbyt często przez zbyt częste wywołania funkcji obliczania programu. Aby uzyskać dostęp do ustawień konta, pozycji i symbolu, a także funkcji handlowych, będziemy używać Obiekty CAccountInfo CPositionInfo CSymbolInfo i CTrade, a następnie włącz je do Expert Advisor. Ponieważ Expert Advisor opiera się na pętlach, musimy stworzyć macierze dla swoich parametrów zewnętrznych. Let s najpierw stwórz stałe, równe liczbie symboli dla każdego strategia. Następnie tworzymy parametry zewnętrzne Używając stałych, określamy rozmiary tablic, z którymi będą współpracować pied Ponadto tworzymy uchwyty wskaźników i inne zmienne globalne. Poniżej przedstawiono przykład dla jednego symbolu strategii. Aby wyłączyć transakcję dla określonego symbolu, stworzyliśmy zmienną Boolean IsTradeA0, która zostanie umieszczona na samym początku dla pętli.2 Inicjalizacja Expert Advisor. First, niech s uzyskać wartości wymagane dla wszystkich strategii, np. dźwigni finansowej Ponieważ dźwignia jest stosowana do konta handlowego i nie ma nic wspólnego ze strategią lub symbolem, nie ma potrzeby skopiuj wartość do tablic. Następnie skopiujemy zewnętrzne zmienne do tablic. Jeśli jakikolwiek parametr zewnętrzny zostanie określony przez typ, który wymaga konwersji na inny, można to zrobić w wygodniejszy sposób podczas kopiowania na tablice. W takim przypadku, możemy zobaczyć, że BBPeriodA0 został utworzony jako uint, aby uniemożliwić użytkownikowi ustawienie wartości ujemnej Tutaj konwertujemy ją na int i skopiuj ją do tablicy, która została również utworzona jako int Jeśli nie, kompilator da ostrzeżenie, jeśli spróbujesz wstaw parametr typu uint w uchwycie wskaźnika. Zobacz dalsze informacje, czy w Market Watch jest dostępny symbol Market Market i czy został on użyty nie więcej niż jeden raz w ramach jednej strategii. Jeśli symbole zostały wybrane prawidłowo, sprawdź błędy w parametrach wejściowych dla każdy z nich, tworzyć uchwyty wskaźników, uzyskać dane potrzebne do obliczania partii, aw razie konieczności wykonać inne czynności zdefiniowane w danej strategii. Wykonamy powyższe czynności wewnątrz pętli for. Następnie ustawiamy parametry dla transakcje handlowe strategii A przy użyciu obiektu TradeA klasy CTrade. Ta sama procedura jest powtarzana dla każdej strategii, i. Kopiuj zewnętrzne zmienne do tablic. Sprawdź, czy symbole są prawidłowo zaznaczone. Sprawdź błędy, ustaw wskaźniki uchwytów, oblicz dane dla partia i wszystko, co jest wymagane w danej strategii. Ustaw parametry operacji handlowych. Na koniec dobrze byłoby sprawdzić, czy w kilku strategiach jest używany jeden i ten sam symbol, na przykład Poniżej podano dwie strategie. Trading For Loops. Struktura pętli wewnątrz funkcji OnTimer jest następująca. Jeżeli jeden z symboli Expert Advisor oparty na jednej strategii ma warunek, dzięki któremu wszystkie kolejne obliczenia muszą zostać zakończone, używamy operator zwrotu W takim przypadku musimy tylko zakończyć bieżącą iterację i przejść do następnej iteracji symbolu. W tym celu najlepiej użyć operatora continue. Jeśli chcesz zwiększyć wielojęzyczny ekspercki doradca, dodając strategię z pętlą for, która zawiera warunek zakończenia wszystkich kolejnych obliczeń, można użyć następującego wzoru. After tworzenia ram dla pętli for po prostu wstawimy do niej kody z innych EA i zastąpimy niektóre zmienne elementami tablic. na przykład zmieniamy predefiniowaną zmienną Symbol na SymbolA i lub Point to PointA i Wartości tych zmiennych są typowe dla danego symbolu i dlatego zostały skopiowane do tablic przy inicjalizacji. e, niech s znajdzie wartość wskaźnika. Aby zaimplementować zamykanie pozycji kupna, napiszemy następujący kod. Otwarcie pozycji Buy. Zarejestruj się, aby zakończyć generowanie zdarzenia timera i usunąć uchwyty wskaźników przy deinicjowaniu.4 Wyniki testu. Kiedy Expert Doradca jest gotowy, testujemy każdą strategię i każdy symbol oddzielnie i porównujemy wyniki testów z wynikami uzyskanymi w trybie testowym podczas równoczesnego handlu wszystkimi strategicznymi i symbolicznymi. Zakłada się, że użytkownik zidentyfikował już optymalne wartości parametrów wejściowych. Poniżej są ustawieniami strategii Tester. Fig 2 Ustawienia strategii testera. Reatures dla strategii A, EURUSD. Fig 3 Wyniki testów dla strategii A, EURUSD. Wyniki dla strategii A, GBPUSD. Fig 4 Wyniki testów dla strategii A, GBPUSD. Results for strategia B, AUDUSD. Fig 5 Wyniki testów dla strategii, AUDUSD. Results dla strategii B, EURJPY. Fig 6 Wyniki testów dla strategii, EURJPY Wyniki testu dla wszystkich strategii i symboli. Fig 7 Wyniki testów dla wszystkich strategii i symboli W rezultacie mamy wygodną i prostą strukturę wieloetapowego wielofunkcyjnego doradcy ekspertów, w którym można umieścić praktycznie dowolną strategię. Jest to Expert Advisor pozwala lepiej ocenić efektywność handlu przy użyciu wszystkich Twoich strategii Może to również okazać się użyteczne w przypadku, gdy tylko jeden Doradca Specjalisty może pracować na danym koncie. Kod źródłowy Doradcy ds. Ekspertów jest dołączony do artykułu w celu ułatwienia zbadania powyższych informacji. 14. października 2017. Dodano 29 lutego 2017 r. warto rozważyć1 Ten system zależy od dokładnego wypełnienia po cenie otwarcia Aby uzyskać takie napełnienia wymaga jakości danych o minimalnym opóźnieniu i zaawansowanych umiejętności programowania w celu wdrożenia automatyzacji handlu.2 Przy ustalaniu ceny wejścia nieznacznie poniżej ceny otwarcia próby aby poprawić wydajność systemu nie powiodła się Nawet poprawa ceny o jeden cent zabija system To sugeruje, że większość zysku pochodzi z dni, w których cena otwarta była równa t o Daily Low, tj. cena wzrosła z Open i nigdy nie spadła poniżej tego Oczywiście jest to oczywiste By to potwierdzić, dodałem ten warunek testowy, który wyklucza dni, w których Open Low. Buy Kup i nie O L . To zabija system i dowodzi, że większość zysku pochodzi z dni, kiedy OL Aby jeszcze to potwierdzić, dodałem przeciwny warunek. Kupuj i O. To daje prawie nieskończone zyski i dowodzi, że większość zysków pochodzi z dni, w których cena porusza się natychmiast z poziomu Otwórz i nigdy nie zwraca się poniżej. Próbuje poprawić cenę wejścia jest pomyłką, którą należy wprowadzić na zestawie Stop 1-2 ct powyżej ceny otwarcia, co eliminuje dni, kiedy cena spadnie i nigdy się nie zawróci. wydajność znacząco3. System ten obsługuje reguły odpowiedzi na przedsiębiorców z kolanem - takie wzorce są zazwyczaj utopione przez duże transakcje, dzięki czemu system ten działa znacznie lepiej, gdy wybierasz tickerzy z woluminami od 500 000 do 5 000 000 akcji. formalnie znacząco. Dodanie powyższych dwóch funkcji skutkuje krzywą kapitału własnego znacznie lepszą niż pokazana poniżej. Przepraszam, nie mam czasu na dokumentowanie powyższego szczegółu. Powodzenia. To post przedstawia bardzo prosty pomysł na długą sesję, że Kupuje na podany procent poniżej wczoraj s Niski i kończy się następnego dnia s Open Chociaż czasami trudno uzyskać dokładną cenę otwartą, wysoka rentowność tego systemu sprawia, że ​​jest dobrym kandydatem do dalszych eksperymentów System działa dobrze z Watchlists jak N100, SP500, SP1500, Russel 1000 itd. Wydajność na Russel 1000, przy maksymalnej otwartej pozycji ustalonej na 1, na okres 12 10 2003 do 12 10 2017, wygląda jak ten. Niektóre z innych Watchlists dają mniejsze zyski z ekspozycji, ale to przychodzi z niższymi stawkami DDs Prowizje zostały ustalone na 0 005 na akcję Brak marginesu. Nie wyraźny ranking wykorzystywany jest tickers na podstawie ich alfabetycznego sortowania na liście obserwowanych Może to wydawać się dziwne, ale znaczące odwrócenie tego rodzaju systemu niepowodzenie To może oznaczać, że z powodu problemów z skanowaniem w czasie rzeczywistym, symbole wymienione na górze tego rodzaju mogą być wymieniane inaczej niż wymienione na dole. Zwróć uwagę na płynność, z jaką chcesz handlować więcej niż jedną pozycją i poślizgiem raczej wolny od ryzyka, ale wyjścia mogą być problematycznymi DD są znaczne, ale mogą być zrekompensowane poprawionymi wpisami i wyjściami w czasie rzeczywistym W przypadku automatycznego obrotu może być możliwe umieszczenie zleceń OCA DAY-LMT dla wszystkich sygnałów i poczekaj i zobacz co wypełnienia Ponieważ wyjścia są trudniejsze niż wpisy, które można chcieć zbadać inne strategie wyjścia. Wartości domyślne wartości domyślnych są wybierane tylko z kapelusza Prawie z pewnością można je zoptymalizować lub wyregulować dynamicznie dla poszczególnych tickerów Krótko testowałem ten system w trybie Walk-Forward a wyniki były opłacalne przez wszystkie lata testowane Z wyjątkiem liczby parametrów dotyczących obrotu udziałami nie są zbyt krytyczne Nadmierne optymalizowanie nie wydaje się problemem w tym przypadku. Kod poniżej i jest bardzo prosty i wymaga niewiele wyjaśnień Jednak ważne jest, aby zrozumieć, że ten system ma małą przewagę poprzez handel na Open, a obliczanie TrendMA przy tej samej cenie otwarcia Niektóre mogą interpretować to jako przyszły wyciek, jednak w przypadku handlu tym systemie w czasie rzeczywistym, nie Wielu ludzi nie zdaje sobie sprawy, że jeśli sprzedajesz Open na tej platformie, możesz użyć tej ceny w obliczeniach tak długo, jak będziesz je wykonywać w czasie rzeczywistym, gdzie AmiBroker i technologia mogą dać Ci przewagę Jeśli Refback TrendMA przez jeden pasek system jest nadal bardzo opłacalne, ale wzrost DD dla niektórych Watchlists Jeśli używasz inwestycji stałych różnica jest znikoma. Procedury handlowe byłoby rozpocząć skanowanie przed otwarciem rynku i usunąć tickers, które są wycenione tak że są mało prawdopodobne, aby spełnić OpenThresh W ten sposób można rozpocząć skanowanie 1000 symboli, ale bardzo szybko skanowany numer zmniejszy się do kilkunastu tickerów Kiedy zbliżasz się do 9:30 rano, ime skanowanie będzie bardzo szybkie i będziesz mógł umieścić swoje zamówienie LMT bardzo blisko Open, może nawet poprawić cenę Open. Mimo że kilka osób patrzyło na poniższy kod i nie znalazło nic złego, zyski wydaje się być dość wysoki dla takiego prostego systemu Proszę zgłaszać błędy, które możesz zobaczyć. Filed przez Herman o godz. 7 03 w ramach pomysłów Komentarze eksperymentalne wyłączone w systemie portfela handlowego Gap-Trading EOD. Wrzesień 1, 2017. Pomysł został opublikowany 161332 na głównej liście AmiBroker w dniu 3 lipca 2017 r. Było wiele doskonałych komentarzy na tej liście, a jeśli jesteś zainteresowany pracą nad tym systemem, dobrze czy później przeczytasz je przed rozpoczęciem Po opublikowaniu postów znalazłem wiele postów w internecie omawiając ten pomysł handlowy, niektóre twierdzą aby handlować podobnym systemem z dobrym sukcesem. Odwołałem się do tego systemu systemu Gap Trading, ale może to być błąd, a średnia zmiana może być lepszą klasyfikacją Googling, ponieważ dostanie się o wiele więcej trafień do podobnych systemów kilka li nks. Jest to dość szeroko omawiany pomysł na handel i sugeruję, abyś sam zrobił sam Googling, aby nauczyć się najnowszego użytkownika As a Amibroker, masz lepsze narzędzia niż większość sprzedawców i masz większą szansę niż większość, aby wymyślić odmiana, która działa Prawdopodobnie przy nieco mniejszym zysku, a przy znacznej ilości dodatkowego kodu to nie jest szybki projekt. Niektórzy ludzie komentowali, że ten system nie będzie działał w prawdziwym obrocie, a mogą być słuszne, że inni mówią takie systemy praca Nie wykończyłem systemu i nie mogę twierdzić, czy jest to zbywalne czy nie. System kupuje w pewnym procentie poniżej wczoraj s Low, na zamówienie LMT i kończy się tego samego dnia na Close. Filed przez Herman o 6 po południu w ramach Pomysłów Eksperymentalne komentarze wyłączone na Long-only EOD Pomysł na luki w systemie EOD. Użyj małych kryteriów konfiguracji, aby skanować moje zapasy. MACD domyślnie, szukać pasków z listy Histogram 4 i paska 1 do wyświetlenia sygnału kupna histogram ustawiony na czerwony na dół i niebieski na górę, więc c wyraźnie widać wyraźnie MACD powyżej Zero Line RSI Powyżej 30 System ten bazuje na trendzie handlowym Kupowanie na pullback, gdy rynek kontynuuje swój trend. Aby skanować ustawienia MACD Trend 1. Wstaw następującą formułę do wykresu 2. Uruchom Skanowanie w AA przy użyciu SMACDTrend z wszystkimi symbolami n ostatnimi dniami n 1 i wykresem Synchronizuj wybranymi ustawieniami. Akcje spełniające kryteria zostaną zgłoszone na liście Wyniki. Uwaga Niektóre warianty reguł konfiguracji mogą definiować sygnały dość rzadkie iw małych bazach danych możliwe jest, że w danym dniu nie będą ustawiane żadne dane, więc nie będzie to raportowane przez skanowanie.3 Kliknij dowolny symbol w okienku Wyniki, aby wyświetlić ten wykres, dla tego symbolu w tle. Uwaga W tym przykładzie a Baza szkoleniowa, zawierająca tylko dane do 5 11 2007 r. Pomysł na reklamowanie przez protraderencje i formułę Bill WaveMechanic. filed przez brianz o godz. 11.00 w ramach pomysłów Komentarze eksperymentalne wyłączone na temat systemu MACD Trend Trend 14 października 2007 r. brianz o godzinie 10.00 w ramach Pomysłów Eksperymentalne komentarze wyłączone z 15-dniowego systemu handlowego wykonawców. 19 sierpnia 2007 r. Jest to pierwszy w serii KISS, który utrzymuje proste, głupie pomysły handlowe, które można odtwarzać za pomocą wszystkich pomysłów systemowych prezentowanych tutaj są niesprawdzone, niedokończone i mogą zawierać błędy Mają one pokazać możliwe wzorce do dalszej eksploracji Jak zawsze jesteście proszeni o komentarze i dodać własne pomysły do ​​tej serii. Preferuję systemy w czasie rzeczywistym, które szybko działają, są zautomatyzowane i pozbawione są tradycyjnych wskaźników. nie powinny mieć optymalnych parametrów, może nie zawsze być w stanie osiągnąć ten cel Nie wszystkie systemy będą takie proste, że niektóre proste funkcje uśredniania lub HHV LLV Pierwszym systemem pokazanym poniżej jest kopia systemu demo Używam, aby rozwinąć procedury Trade-Automation gdzie indziej na tej stronie. Real-Time Gap-Trading Aby zobaczyć, jak to działa, należy wykonać test Backtest w 1-minutowych danych z okresem 5-60 minutowym. że zyski te są po prostu spowodowane wzrostem rynku, jednakże fakt, że długie i krótkie zyski są niemal równe, sugeruje, że jest to więcej. Ponieważ 98 wszystkich transakcji mieści się pomiędzy 9:30 a 10:30, ten typ system jest miły, jeśli chcesz handlować krótkim czasem każdego dnia To zmniejsza ryzyko w odniesieniu do ekspozycji na rynku i daje więcej czasu na inne aktywności. Odzyskanie to na liście obserwacyjnej NASDAQ-100 indywidualnych testów wstecznych, 15-minutowych okresów daje zyski pokazane poniżej dla okresu od 1 marca 2007 do 17 sierpnia 2007 r. Oznaczniki Ticker są pomijane w celu zachowania wykresu kompaktowego na wykresie po prostu pokazuje pasek zysku netto dla każdego testowanego testera Średni poziom ekspozycji dla tego systemu wynosi około 15, dlatego możesz mieć możliwość obrotu portfelami zwiększanie zysków i łagodzenie krzywych kapitału Należy zachować ostrożność, że w swojej pierwotnej formie wypłaty są nie do przyjęcia i że mogą występować ograniczenia ilościowe dla wielu tickerów. Ponieważ ten system ma niewielką ekspozycję, może to być kandydatem na rynek sc anionowe i rankingowe RAR transakcji handlowych wskazują na bezwzględne maksymalne zyski, które mogłyby zostać osiągnięte, jeśli uda się zwiększyć ekspozycję do bliskiej 100 Niemniej jednak ruch cen z różnych rynków może być skorelowany, a transakcje z różnych tickerów mogą się pokrywać Jeśli wiele sprzedawców akcji w tym samym czasie trudno byłoby zwiększyć ekspozycję systemową. Zgłoszone przez Al Venosa. Filed przez Herman o godzinie 1 49 pm w ramach pomysłów Komentarze eksperymentalne wyłączone na KISS-001 Transaplikacja w intraday Godziny 17 sierpnia 2007.You jesteś zaproszony do zgłoszenia linków do pomysłów systemowych w komentarzach do tego postu. Strategie handlowe na giełdach Stockcharts Intraday Moving Średnia przecięcie z pozycją Określanie NeoTicker Zmienność-Breakout-Systems Traders Log Dziesięć dni High Low system StockWeblog Reversion Systems SzukamAlpha Systems Trader Club Trader Club Bulletins. July 16, 2007.This kategoria jest zarezerwowana dla rzeczywistych systemów wymiany handlowej, tzn. w danym momencie miała miejsce transakcja lub rozważyłby handel Ponieważ kryteria tr adability różni się w zależności od osoby, a ponieważ systemy mogą działać lub nie, w zależności od sposobu ich sprzedaży, trudno będzie skontrolować tutaj wkłady W odniesieniu do tego, co zostało opublikowane, zachowaj otwarty umysł i uważaj, że plakat uważa, że ​​system można dokupić . Możesz przyczynić się przez zamieszczanie jako autor wymaga rejestracji lub w komentarzu do tego postu. Film przez Hanna w 11 14 am w Praktykowane zyskiem Komentarze Off na temat wprowadzania do systemów obrotu Practical. To gdzie można dzielić systemy handlowe, które są marginalnie zyskiem , tzn. tych, które nie powinny być przedmiotem obrotu, ale są to takie, które wykazują potencjał Zwykle byłby to podstawowy system, który jest opłacalny, a doświadczenia wynoszą 50. Takie systemy często można poprawić, dodając punkty końcowe, cele, zarządzanie pieniędzmi, techniki portfela itp. Rzeczywistość polega na tym, że chociaż nie masz wiedzy, aby mogło działać ktoś inny. Prawie każdy z nas znajdzie pomysły na systemach handlowych w książkach i czasopismach, które następnie kodujemy AFL do oceny Niektóre z tych systemów mogły być od wielu lat, podczas gdy inne są nowymi pomysłami Po ich kodowaniu prawie zawsze jesteśmy rozczarowani i chwycimy pracę w systemie Zamiast wyrzucić swoją pracę, zostaniesz poproszony o umieszczenie systemu w tym miejscu daj innym programistom szansę na naprawienie. Zaproszono Cię do wniesienia wkładu w życie, ponieważ autor wymaga rejestracji lub komentarza do tego wpisu. Sporządzono przez Hermana na 11 04 w ramach Pomysłów Eksperymentalne komentarze off na temat wprowadzania do systemów handlowych Systems. MetTrader 5 - przykłady Interfejsy graficzne IV Tryb wielozadaniowy i system priorytetów Rozdział 2. Pierwszy artykuł Graficzne interfejsy I Przygotowanie struktury bibliotecznej Rozdział 1 wyjaśnia szczegółowo, co ta biblioteka jest dla Znajdziesz listę artykułów z łączami na końcu każdy rozdział Tutaj można także pobrać pełną wersję biblioteki na obecnym etapie rozwoju Pliki muszą być umieszczone w tych samych katalogach, które znajdują się w archiwum. I n poprzedniego rozdziału, omówiliśmy pasek stanu i elementy informacyjne o narzędziu interfejsu graficznego W tym rozdziale rozszerzymy implementację bibliotek na możliwość tworzenia interfejsów wielu okien dla aplikacji MQL Dodatkowo opracujemy system priorytetów dla lewego przycisku myszy kliknij na obiekty graficzne, ponieważ bez tego może się zdarzyć, że kontrole nie odpowiadają na działania użytkownika. Tryb Multi-Window. Za rozważymy tryb wielo-okienkowy graficznego interfejsu biblioteki w trakcie opracowywania Do tej pory enumeracja ENUMWINDOWTYPE zawierała dwa identyfikatory głównego okna WMAIN i okna dialogowe WDIALOG Jedyny tryb był używany w trybie jednokolumnowym Po wprowadzeniu pewnych dodatków, włączenie trybu wielu okien spowoduje jedynie utworzenie i dodanie wymaganej liczby form kontrolnych do bazy. W klasie głównej do obsługi zdarzeń CWndEvents tworzy się pole do przechowywania indeksu aktualnie aktywnego window. Zobacz, jak indeks aktywnego okna zostanie zidentyfikowany Na przykład użytkownik przypisuje otwarcie okna dialogowego WDIALOG do pewnego przycisku Po naciśnięciu przycisku, zdarzenie niestandardowe ONCLICKBUTTON jest generowane To zdarzenie może być śledzone w procedurze obsługi zdarzeń CProgram OnEvent klasy niestandardowej Użyjemy również metody CWindow Show w formularzu, który ma być pokazywany Nie wystarczy w bieżącej implementacji biblioteki i wprowadzimy konieczne dodatki. Zdarzenie niestandardowe będzie musiało być wysłane z metody CWindow Show, która wskaże, że okno zostało otwarte, więc wartości parametrów interfejsu graficznego muszą być aktualizowane. To wydarzenie wymaga oddzielnego identyfikatora. Załóżmy, że to ONOPENDIALOGBOX i umieść go w pliku, w którym znajdują się inne identyfikatory biblioteki znajduje się na końcu linii CWindow Show, jak pokazano w poniższym kodzie Jest to skrócona wersja metody Aby jednoznaczna identyfikacja parzystej t inicjator, identyfikator elementu i nazwa programu muszą być dodawane do identyfikatora zdarzenia. Zdarzenie to będzie obsługiwane w klasie CWndEvents Przed wdrożeniem metody obsługi, musimy utworzyć trzy dodatkowe metody w klasie CWindow Są to dwie metody przechowywania i uzyskiwania indeksu formularza, z którego zostanie otwarte okno dialogowe, oraz sposób zarządzania stanem formularza. Indeks poprzednio aktywnego okna musi być zapisany w kilku oknach jednocześnie otwieranych dlaczego podczas zamykania okna dialogowego ważne jest, aby znać, które z nich będą musiały zostać przywrócone do stanu aktywnego. Do zarządzania stanem formularza, deaktywowane formularze będą miały inny kolor nagłówka, który może zostać zmieniony przez użytkownik Kolor koloru nie zmieni się, gdy kursor myszy unosi się nad nimi, gdy formularz zostanie zablokowany Dodając do tego, w chwili dezaktywacji formularza zostanie wygenerowane zdarzenie niestandardowe To będzie współpraca mmunicate, że formularz jest zablokowany, a kolory i kolory jego elementów muszą być zerowane Gdy formularz jest zablokowany, skupienie na elementach nie jest śledzone W chwili otwarcia okna dialogowego, kolor elementu, który podniósł okno będzie tak, jakby kursor myszy nadal wisiał nad nim. Identyfikator ONRESETWINDOWCOLORS jest tworzony w pliku takiego zdarzenia. Metoda zarządzania stanem formularza jest przedstawiona w poniższym kodzie. Pozwól nam powrócić do obsługi Zdarzenie ONOPENDIALOGBOX W głównej klasie do obsługi zdarzeń interfejsu graficznego CWndEvents utworzy metodę OnOpenDialogBox CWndEvents, która zostanie wywołana w CWndEvents ChartEventCustom wspólna metoda obsługi wszystkich zdarzeń niestandardowych. Metoda OnOpenDialogBox CWndEvents rozpoczyna się od dwóch kontroli jednego dla identyfikatora zdarzenia a drugi dla nazwy programu Jeśli zostały przekazane, iteruj przez wszystkie okna, aby dowiedzieć się, jakie okno wygenerowało zdarzenie Identyfikator elementu, który jest c w tym komunikacie lparam ułatwi to Formularze, które nie mają pasujących identyfikatorów zostaną zablokowane wraz ze wszystkimi elementami przyłączonymi do nich Priorytety wszystkich obiektów zostaną zerowane przy pomocy metody ResetZorders i nie będą reagować na lewy klawisz myszy Po przejściu do formularza, który ma identyczne identyfikatory, należy zachować indeks aktywnego okna jako indeks poprzednio aktywnego okna Uaktywnić ten formularz i przywrócić priorytet lewym przyciskiem myszy do wszystkich jego obiektów Zapisz indeks tego okna jako aktualnie aktywny Następnie, aby wszystkie elementy tego formularza były widoczne i przywracać priorytety lewego kliknięcia myszą, pomijając element formularza, ponieważ jest to już widoczne i rozwijane elementy. Okno dialogowe jest otwarte, gdy widoczny jest podpowiedź, a następnie tooltip musi być ukryty Nie zniknie sam, gdy formularz, do którego jest dołączony został już zablokowany Prywatna tablica podręcznych etykietek została stworzona wcześniej, aby zaspokoić takie przypadki A odpowiadające metodom dowolnych elementów bazy można uzyskać w głównej klasie CWndEvents w celu obsługi zdarzeń. Teraz zajmiemy się identyfikatorem ONRESETWINDOWCOLORS, który został utworzony wcześniej w tym artykule Przed zapisaniem metody obsługi tego zdarzenia, jeszcze jeden standard wirtualna metoda musi zostać dodana do klasy bazowej klasy CElement wszystkich elementów, które zostaną wyznaczone do zerowania koloru Załóżmy, że to jest CElement ResetColors. Metody ResetColors z cechami charakterystycznymi dla każdego elementu muszą być tworzone we wszystkich klasach pochodnych Poniższy kod przedstawia przykład dla elementu przycisku ikon CIconButton Metoda ResetColors dla wszystkich innych elementów znajduje się w plikach dołączonych do tego artykułu. W związku z tym metoda wirtualna w klasie bazowej elementów i własnych wersjach w klasach pochodnych daje możliwość zerowania kolorów wszystkie elementy w jednej pętli z obsługi zdarzeń głównej klasy biblioteki CWndEvents. Write metodę CWndEvents OnResetWindowColors do obsługi w przypadku zdarzenia ONRESETWINDOWCOLORS Jest dość prosty Szukaj formularza, który został właśnie dezaktywowany przez identyfikator elementu, który został właśnie odebrany w wiadomości Jeśli jest jeden, zapisz indeks Jeśli indeks został zapamiętany, zerowe kolory wszystkich elementów w tym formularz Szczegóły tej metody można znaleźć w poniższym kodzie. Sprecyzowaliśmy otwarcie okien Teraz musimy wdrożyć metody zamykania i przywracania poprzednio aktywnego okna Aby obsłużyć to zdarzenie, musimy utworzyć identyfikator ONCLOSEDIALOGBOX w plik. W klasie CWindow używamy metody CWindow CloseWindow do zamykania formularza i programu wraz z nim W tej metodzie sekcja, która zamyka okno dialogowe WDIALOG nie jest jeszcze zaimplementowana Proszę napiszmy dodatkową metodę, która wygeneruje zdarzenie dla zamykanie okien dialogowych Oprócz 1 identyfikatora zdarzenia, wiadomość zawiera również 2 identyfikator elementu, 3 indeks poprzednio aktywnego okna i 4 tekst h eader Pozwól nam zadzwonić do tej metody CWindow CloseDialogBox Później posłużymy się tym także w złożonych kontrolkach, w których zamykanie okna będzie przeprowadzane przez elementy inne niż przycisk zamykania. W klasie CWindow należy wywołać metodę CWindow CloseDialogBox metoda CWindow CloseWindow, jak pokazano w skróconą wersję kodu poniżej Kompletna wersja można znaleźć w plikach dołączonych do tego artykułu. Po wysłaniu wiadomości z identyfikatorem ONCLOSEDIALOGBOX musi być śledzone i obsługiwane w obsłudze klasa CWndEvents W tym celu napiszmy metodę CWndEvents OnCloseDialogBox Iterowanie na wszystkich oknach w bazie i poszukaj tego z identyfikatorem pasującym do identyfikatora w wiadomości Jeśli takie okno zostanie znalezione, to ma być dezaktywowana Następnie ukryj wraz ze wszystkimi dołączonymi do niej elementami i aktywuj formularz przez indeks przekazany w wiadomości Następnie przechowuj indeks aktualnie aktywnego okna i przywróć priorytety lewym przyciskiem myszy dla elementów. Naw, wszystko jest gotowe do testowania trybu wielo-okienkowego. Którka trybu Multi-Window. Utwórz dwie instancje klasy CWindow w EA, które wykorzystaliśmy do testowania elementów interfejsu informacyjnego Wynikiem będzie trzy formy w graficznym interfejsie EA Pierwszy formularz będzie główny WMAIN, a dwa inne będą miały okna dialogowe WDIALOG Dołącz pierwsze okno dialogowe do jednego z przycisków w głównej formie Utwórz trzy przyciski w pierwszym oknie dialogowym i przyłączamy drugie okno dialogowe do jednego z nowo utworzonych przycisków W ten sposób otworzymy trzy formy jednocześnie, a tylko jeden z nich będzie aktywny. Poniższy kod pokazuje, co należy dodać do niestandardowego programu CProgram klasa aplikacji na obecnym etapie rozwoju. Zadzwoń do tych metod w głównym sposobie tworzenia graficznego interfejsu aplikacji w trakcie rozwoju Poniżej znajduje się skrócona wersja tej metody od. Rozważemy metodę tylko dla pierwszego okna dialogowego drugiego formularza Jak pamiętasz, musisz użyć metody CWndContainer AddWindow do dodawania formularza do bazy Proszę zwróć uwagę, jak współrzędne formularza są zdefiniowane w poniższym kodzie Ponieważ domyślne współrzędne są zero, gdy program zostanie załadowany do wykresu, zostaną ustalone odpowiednie współrzędne. W tym przykładzie wartości są równe x 1, y 20 Po tym formularzu można przenieść, a następnie można określić czas lub symbol wykresu włączony Poniższy kod pokazuje, że formularz pozostanie tam, gdzie był ten ostatni raz Jeśli chcesz, aby formularz znajdował się w miejscu pierwszego załadowania programu do wykresu, usuń poniższe warunki W tym przykładzie wszystkie trzy formularze the graphical interface of the program will have the same conditions. Let us arrange that the dialog forms can be moved over the chart The window type should be set as dialog WDIALOG , otherwise you will encounter incorrect work of the graphical interface Th e window icon can be redefined using the CWindow IconFile method In case of dialog windows, same icon can be used as the one of the element that brings up this window. Let me remind you about some details of how to attach controls to a certain dialog window As an example, let us consider one of the button methods designated for this form I would like to highlight only two things. You need to remember that. The element must be passed the pointer to the form to which it is to be attached. When the element pointer is saved in the base, specify the index of the form to which the element is to be attached In this case it is index 1.It is up to the developer of the application to manage the display of windows Track the pressing on any control in the event handler of the CProgram custom class and show the relevant window Assign the call of the first dialog window to the button on the main window of the EA second form , and the call of the second dialog window to the button on the first dialog win dow third form. Desired result is shown in the screenshot below Please note the ellipsis in the button names Icon Button 1 and Icon Button 6 This is a usual way of letting the user know that pressing of this element will open a dialog window. Fig 1 Testing of the multi-window mode. If you switch the symbol or the timeframe of the chart when several forms are open, you will encounter a problem Dialog windows will disappear as they are supposed to but the management will not be passed over to the main window The form will not respond to the user s actions The solution to this is simple As you remember, the CWndEvents Destroy method is called in the CProgram OnDeinitEvent method for uninitialization of the custom class The graphical interface of the application is deleted in this method The management has to be given to the main window at the moment of deleting the graphical interface Therefore, some additions must be introduced to the CWndEvents Destroy method. Set the index of the main wind ow as active. Activate the main window and deactivate the rest. Below is the code of the current version of the CWndEvents Destroy method. The first version of the multi-window mode is implemented Everything turned out to be less complicated than it could have seemed initially. Enhancement of the System of Priorities of the Left Mouse Button. Up until now, the management of priorities of the left mouse click on the interface elements has been carried out by the events with the ONOPENDIALOGBOX and ONCLOSEDIALOGBOX identifiers The reason for that was that when the next drop-down element was developed, it was up to the user to assign the priority value for each object of this element Priorities of other elements that could happen to be beneath it were taken into account However, when it came to creating complex compound controls, this system was awkward and easy to confuse To make things easier, let us create two more identifiers for such events. ONZEROPRIORITIES zeroing priorities. ONSETPRIORIT IES restoring priorities. Add them to the file. Generation of events with these identifiers must be located in the classes of the elements that are or can be drop-down ones At the current stage of development, in the present interface set, context menu is such an element Therefore, add the code to the Show and Hide methods of the CContextMenu class as shown below in the shortened versions of the code. We will receive these messages in the main class for handling all messages CWndEvents For that, we will write a separate handling method for each identifier These methods will be called in the main method for handling custom events CWndEvents ChartEventCustom. In the CWndEvents OnZeroPriorities method, iterate over all elements of the active window and zero priorities of all of them except the one with the element identifier contained in the message lparam - parameter as well as except menu items and context menus The reason why we exclude menu items and context menus is that several context m enus can be opened at the same time one from another. If the received message contains the ONSETPRIORITIES event identifier, then restore priorities of the left mouse button click for all the elements of the active window. The library for creating graphical interfaces at the current stage of development looks like in the schematic below. Fig 2 Library structure at the current stage of development. This is the final article of the fourth part of the series about graphical interfaces In the first chapter of this part, the status bar and tooltip informational interface elements were realized In the second chapter, the multi-window mode and a priority system of the left mouse click were discussed. You can find and download all the material of the first part or the series in the attached files so you can test how it works If you have questions on using the material presented in those files, you can refer to the detailed description of the library development in one of the articles from the list below or ask your question in the comments of this article. List of the articles chapters of the fourth part.

No comments:

Post a Comment