W załączeniu nowsza wersja EA oraz plik z przewidywaną średnią do wrzucenia do ...tester\files
To nadal jest bardzo wstępne coś co prawdopodobnie będzie dawać różne wyniki w zależności od brokera choćby dlatego, że słupki dzienne są wrażliwe na strefę czasowa. Ja to ćwiczę na IC Markets, GMT+2 plus DST w/g schematu USA.
Generalnie sygnał jest generowany w momencie otwarcia nowego dnia ale potem jest zapamiętany jako lastSignal i ważny tak długo aż otwarte zostanie zlecenie albo skończy się dzień.
Idea generowania sygnału jest ta sama: jeżeli prognozowana wartość MA jest większa niż wczorajsza to BUY, jeżeli mniejsza to SELL, a jeżeliby wypadła bez zmian to nie ma sygnału.
Plik z prognozą zaczyna się od 2017.11.23 i jest w nim przewidziana wartość na poniedziałek 16 kwietnia - wychodzi BUY
Ale choć u mnie ładnie to wychodzi to EA mało zarabia - zaledwie 10 pips dziennie w takiej postaci jak jest obecnie przy 90 SL. Przy liniowym lot jedną stratę kryje w dziesięć dni.
Głównie dlatego, że ten kod nie sprawdza żadnych warunków rynkowych.
Jedyne co w nim zrobiłem żeby poprawić wejście to opóźnienie o 25 minut i wymóg, że rynek musi się cofnąć 8 pips zanim będzie można wejść.
Czyli takie proste i ślepe jednocześnie warunki.
W okresie pliku prognozy mam dwie wpadki - jedna 18 grudnia 2017, druga 21 marca 2018.
Obie można było łatwo odfiltrować: pierwsza jest w okresie przedświątecznym, druga w dniu posiedzenia FMOC kiedy podniesione zostały stopy procentowe. Wystarczy prosty filtr kalendarzowy.
Jest też jeszcze jeden BUY na minusie z zeszłego czwartku ale dajmy mu jeszcze szansę
Ale tak naprawdę to wolałbym coś bardziej dopasowanego do bieżących warunków rynkowych niż ślepe równanie w dół z TP i w górę z SL żeby się wszędzie zmieścić.
I dlatego w funkcji filterSignal() jest taki fragment:
Kod: Zaznacz cały
// some other filter?
if (finalSignal != 0)
{
// any ideas?
}
Inaczej mówiąc jest to miejsce gdzie można odroczyć sygnał jeżeli warunki rynkowe nie sprzyjają otwarciu zlecenia lub można by uzyskać lepszą cenę za jakiś czas.
-- Dodano: ndz 15-04-2018, 23:08 --
PS: Jeżeli to komuś coś pomoże mogę dołożyć polskie komentarze w kodzie.
-- Dodano: pn 16-04-2018, 1:02 --
Aha, zapomniałem dodać:
kod filtru taki jak teraz jest potwierdza lub odracza sygnał do kolejnego tiku gdy ponownie sprawdzane są jego warunki.
Ale może się zdarzyć, że sygnał trzeba całkowicie anulować zamiast czekać na lepszy moment.
W takim przypadku nie wystarczy tylko ustawić finalSignal = 0 (czyli brak sygnału) ale trzeba też wygasić zapamiętany sygnał ustawiając lastSignal = 0 i lastSignalExpiration = 0 tak jak jest to w funkcji start() po otworzeniu zlecenia:
Kod: Zaznacz cały
// new trade opened, reset the saved signal
lastSignal = 0;
// lastSignalTime = 0; // leave it as a flag that the signal was already used to prevent signal multiplication
lastSignalExpiration = 0;
if (!backtesting)
{
GlobalVariableSet(lastSignalGvName, lastSignal);
GlobalVariableSet(lastSignalTimeGvName, lastSignalTime);
GlobalVariableSet(lastSignalExpirationGvName, lastSignalExpiration);
}
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
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 ;-)