Własne EA, czyli poszukiwanie Złotego Grala
Prawdę mówiąc powiedziałem wszystko co do idei - reszta to szczegóły techniczne.mike_05 pisze:Ciekawie, powiedz cos o tym więcej.
To coś takiego jakbyś zrobił tak:
for (int i=0;i<maxInstances;i++) doEA();
Tyle że trzeba uporządkować cały kod tak, aby dało się to prawidłowo powtarzać w pęti.
Inaczej mówiąc aby kod był na tyle uniwersalny aby dawał się wielokrotnie wykorzystywać. W języku obiektowym zrobiłbym sobie klasę i metody, a powielanie robiłoby się automatycznie. Tutaj trzeba było zrobić nieco więcej pętelek dla każdej sekcji oddzielnie (to taki uproszczony szablon):
start() {
for (int i=0;i<maxInstances;i++) doInventory(); // zbierz info o otwartych pozycjach
for (i=0;i<maxInstances;i++) checkMarketConditions(); // tutaj sobie reguluję parametry
for (i=0;i<maxInstances;i++) manageOpenPositions(); // Profit/Loss i inne takie
for (i=0;i<maxInstances;i++) doTrading(); // Nowa pozycja? Dodać do pozycji?
for (i=0;i<maxInstances;i++) report(); // jak już wszystko się przemieliło, dobrze wiedzieć co się aktualnie dzieje ;-)
return (0);
}
Wsadzenie wszystkiego do jednego wora nie dawało zbyt dobrych rezultatów.
W języku obiektowym każdy obiekt miałby swoją wyizolowaną wirtualną postać wraz z prywatną pamięcią, a tutaj… mnożenie tabelek. Nie ma nawet wskaźników

Musisz umieć rozróżniać owieczki w stadzie zleceń. Są różne metody, Ja przyjąłem identyfikator zawarty w komentarzu. Chodziło mi o to, żeby nie prowadzić własnej bazy danych transakcji bo ta łatwo może się rozjechać z rzeczywistością, Lub w ogóle może ją trafić szlag.
Chodziło mi również o to, żeby robot mógł wywalić się w dowolnym momencie i kontynuować pracę po ponownym uruchomieniu. Lub na drugim komputerze pracującym w trybie hot standby. Tak więc podstawą dla mnie jest prawidłowa inwentaryzacja robiona od nowa co tik. A z tego potem wynika co robot będzie robił dalej.
Dodano po 6 minutach:
Akurat te sobie dobrałem w optymalizacji. A właściwie w całej serii optymalizacji.matka pisze:Zwróć uwagę, że w ten sposób dodajesz parametrów, wartości 3 i 30 też mogą mieć zmienną skuteczność. Pytałem jak konkretnie, bo oprócz przedstawionej przez Ciebie metody można np. cyklicznie optymalizować (to też dodaje parametrów). A może ktoś ma jeszcze inny pomysł?259 pisze:Ja np. biorę sobie ATR(3) z ramki 30 minutowej i to mi wystarcza do automatycznej regulacji prognozowanych poziomów oporu/wsparcia, a to z kolei reguluje pozostałe parametry.
Nie było łatwo, zabrało ze trzy tygodnie ale akurat te mi się najlepiej sprawdzają.
Poza tym pasowały mi tak zwyczajnie po ludzku - chodziło o to, że normalny czas życia mojej pozycji odpowiada mniej więcej temu szeregowi.
Przyjąłem je więc jako bazę wyjściową do dalszego rozwoju - w końcu musisz coś kiedyś założyć, inaczej nie pozbierasz się w ilości kombinacji.
Nie twierdzę, że to jest uniwersalne rozwiązanie - po prostu pewien przykład.
Dodałem: wiesz, ta automatyzacja wzięła się właśnie z tego, że miałem już dosyć cotygodniowej optymalizacji parametrów tego robota

Ale masz rację - za każdym razem gdy dodajesz nowy parametr/warunek, mnożysz kombinacje. Nie ma lekko.
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
W normalnej pracy nie jest to problemem.mike_05 pisze:Duzo pętli, to i zasoby pożera pewnie? Znaczy rozumiem, ze w jednym mq4 masz kilka roboli i zmuszasz je do pracy przemiennie wg aktualnej sytuacji?
Ale test idą powolnie mimo, że bardzo zoptymalizowałem kod ;-|
Czy ktoś z was zastanawiał się kiedyś, ile razy niepotrzebnie liczone jest coś takiego jak np. SL*Point czy TP*Point? (to jest przykład).
A można to przecież liczyć tylko wtedy gdy jest to absolutnie niezbędne…
Alokacja pamięci zabiera strasznie dużo czasu. Zmiany rozmiaru tabelki… Lepiej stworzyć tablekę statyczną niż dynamicznie zmieniać jej wielkość. Ale nie zawsze się tak daje.
Na razie mam jednego robota i uruchamiam kolejne postacie jeżeli jest taka potrzeba i mam na to miejsce.
Mam zamiar dodać następnego pracującego odwrotnie to tego pierwszego - jego zadaniem będzie wykorzystywać sytuacje w których ten pierwszy robi DD i na odwrót. Ale na razie to jest w powijakach...
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
w jednej z EA taki kod zapisany
;
ta pętelka powodowała, ze zwykły test, nie optymalizacja, z 2 miesięcznych danych szedł 5,5 godziny( 8-procesorowy PC)
Czego to ludzie nie wymyślą.
;
Kod: Zaznacz cały
int MakeMagicNumber(int ai_0) {
int li_4 = 0;
int li_ret_8 = 0;
if (Symbol() == "AUDCAD" || Symbol() == "AUDCADm") li_4 = 1000;
else {
if (Symbol() == "AUDJPY" || Symbol() == "AUDJPYm") li_4 = 2000;
else {
if (Symbol() == "AUDNZD" || Symbol() == "AUDNZDm") li_4 = 3000;
else {
if (Symbol() == "AUDUSD" || Symbol() == "AUDUSDm") li_4 = 4000;
else {
if (Symbol() == "CHFJPY" || Symbol() == "CHFJPYm") li_4 = 5000;
else {
if (Symbol() == "EURAUD" || Symbol() == "EURAUDm") li_4 = 6000;
else {
if (Symbol() == "EURCAD" || Symbol() == "EURCADm") li_4 = 7000;
else {
if (Symbol() == "EURCHF" || Symbol() == "EURCHFm") li_4 = 8000;
else {
if (Symbol() == "EURGBP" || Symbol() == "EURGBPm") li_4 = 9000;
else {
if (Symbol() == "EURJPY" || Symbol() == "EURJPYm") li_4 = 2100;
else {
if (Symbol() == "EURUSD" || Symbol() == "EURUSDm") li_4 = 1100;
else {
if (Symbol() == "GBPCHF" || Symbol() == "GBPCHFm") li_4 = 1200;
else {
if (Symbol() == "GBPJPY" || Symbol() == "GBPJPYm") li_4 = 1300;
else {
if (Symbol() == "GBPUSD" || Symbol() == "GBPUSDm") li_4 = 1400;
else {
if (Symbol() == "NZDJPY" || Symbol() == "NZDJPYm") li_4 = 1500;
else {
if (Symbol() == "NZDUSD" || Symbol() == "NZDUSDm") li_4 = 1600;
else {
if (Symbol() == "USDCAD" || Symbol() == "USDCADm") li_4 = 1700;
else {
if (Symbol() == "USDCHF" || Symbol() == "USDCHFm") li_4 = 1800;
else {
if (Symbol() == "USDJPY" || Symbol() == "USDJPYm") li_4 = 1900;
else li_4 = 1111;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Czego to ludzie nie wymyślą.
Jeżeli chcesz odnieść sukces, naucz się cenić ludzi.

Ja mam np. w init():
symbol = Symbol();
period = Period();
Ludzie nawet nie zdają sobie sprawy ile czasu zabiera niepotrzebne wywoływanie tych samych funkcji w MQL. Przecierz jeżeli EA jest restartowane za każdym razem jak zmieniasz ramkę czasową to nie ma sensu sprawdzać jej z każdym tikiem? To samo z walutą...
A co dopiero te historie z Math? MathArccos w którymś momencie kładł mi optymalizację EA - trwała ponad tydzień.
Wsadziłem co się dało do dll i nagle okazało się, że można zrobić to samo w trzy dni ;-)
Ktoś może pamięta programowanie w Basic na Z80?
Ascetyzm kodu wymuszony brakiem pamięci i optymalizacja szybkości wykonywania: zamiast 2*x zrób x+x, zamiast x/2 zrób x*0.5... bo dodawanie jest szybsze niż mnożenie, a mnożenie jest szybsze niż dzielenie... pow(x,3)? x*x*x...
MQL działa bardzo podobnie...
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
I TO JEST CENA ZA GRAALA!mike_05 pisze:Jak masz wolną bańkę, tu jest super-oferta
http://www.ebay.com/itm/PRT4490-Institu ... 4aab25c5ff
Choć niekoniecznie Graal się za nią skrywa ;-)
Ilu z was wyszydzało, że nie można dostać nic porządnego za $97?
A za bańkę?
I zobacz - wystarczy jeden głupi co kupi

Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
Ale się przyczepiłeś... za bańkę nikt nie będzie na to patrzył. A za $97 każdy wybrzydza....mike_05 pisze:Zastanawia mnie jedna sprawa po lekturze tej oferty. Czy BigBanki używają MT4?
Ja uważam, że to świetny pomysł na Graala. Dla tego co sprzedaje

Dodano po 20 minutach:
Choć muszę powiedzieć, że koleś tym razem naprawdę przegiął - nawet nie potrafi kłamać za bańkę.
Zobacz co on ma jeszcze do sprzedania;
http://www.ebay.com/sch/cowbear2009/m.h ... rom=&_ipg=
To nawet nie jest budka na skraju bazaru, to łóżko polowe poza bazarem...
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)