Prosba o pomoc w podstawach napisania swojego ea

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
enjoy_xx
Stały bywalec
Stały bywalec
Posty: 37
Rejestracja: 23 maja 2010, 21:31

Prosba o pomoc w podstawach napisania swojego ea

Nieprzeczytany post autor: enjoy_xx »

Witam, jak w temacie. Chciałbym stworzyć swoje własne ea. Moja strategia opiera się wyłącznie na cenie, nie potrzebuje w niej obsługi żadnych wskaźników.
Dodam tylko, że podstawy programowania nie są mi obce. Pisałem coś tam strukturalnie pod c, jave, pascala. Ale to były naprawdę podstawy: obliczanie miejsc zerowych funkcji itp.
W każdym języku największy problem sprawiała mi składnia i najlepiej uczę się na podglądaniu gotowego kodu i próbie rozbudowywania go.

Jeśli ktoś jest skłony poświecić mi chwilkę czasu to mam prośbę na początek o takiego gotowca co to w całości wystarczy go wkleić do pliku *.mq4, który wykona następującą czynność:
1.Złóż zlecenie kupna np. 0,01 lota (bez sl ani tp) jeśli bieżąca świeca przebije maximum z poprzedniej
2. Zamknij pozycję jeśli bieżąca świeca przebije minimum z poprzedniej świecy.

Narazie to tyle ale to już prawie połowa mojej strategi :)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Wystarczą Ci klocki z których możesz to zbudować:

świece są odpowiednio liczone od 0 -obecna do 1- poprzednia 2 przed-poprzednia itd..

Wartość
HIGH[x]
LOW[x]
OPEN[x]
CLOSE[x]
gdzie x określa która świeca Cię interesuje
w takiej notacji świece są brane wg TF wykresu, jeśli potrzeba inne tf to korzystasz odpowiednio z funkcji
iHigh(...)
wystarczy wpisać w edytorze zaznaczyć i dać F1 aby mieć podpowiedz z przykładami do konkretnych funkcji

OrderSend - do wysyłania zleceni - w helpie przykład

warunki if

będzie Ci potrzebne liczenie też ile jest zleceń - aby nie otwierało więcej niż np 1
OrdersTotal - na poczatek najłatwiejsza
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
enjoy_xx
Stały bywalec
Stały bywalec
Posty: 37
Rejestracja: 23 maja 2010, 21:31

Nieprzeczytany post autor: enjoy_xx »

extern double lots = 0.5;
extern int take_profit = 30;
extern int stop_loss = 20;
extern int max_positions = 1;

bool SprawdzCzyZajete()
{
if (OrdersTotal() < max_positions)
{
return(true);
}
return(false);
}

bool SzukajWejscia()
{
if((Open[1] < Close[1]) && //
(Open[2] < Close[2]) && //sprawdzanie czy ostatnie dwie byly wzrostowe

(Close[1] > Close[2]) &&//
(High[1] > High[2])) //sprawdza czy ostatniabyla "wyzsza" od przedostatniej
{
return(true);
}
return(false);
}

int start()
{
if (SprawdzCzyZajete())
{
if (SzukajWejscia())
{
OrderSend(Symbol(), OP_BUY, lots, Ask, 0, Ask-stop_loss*Point, Ask+take_profit*Point);
}
}
return(0);
}



Robi praktycznie to co chciałem tylko mam problem. Chciałbym aby po sprawdzeniu warunków w funkcji SzukajWejscia stop_loss był ustawiany na wartość z świeczki Low[1]. W tej chwili jest globalnie ustawione 20 pips.
Ps. Podpowie ktoś do czego służą pogrubione parametry w funkcji OrderSend Ask, 0 ?

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Ask - to cena po jakiej ma wysłać zlecenie (podaje się ją dlatego że w momencie wysyłania a przyjęcia zlecenia przez serwer może się ona zmienić) , 0 - to poślizg cenowy po jakim zgadzasz się aby została zwarta transakcja. Broker może Ci takie zlecenie nie przyjąć dlatego trzeba sprawdzać czy zlecenie weszło.

Mała uwaga masz warunki ostre < lub >
powinieneś używa też <= lub >=
Bo to może Ci omijać niektore sygnały (czasami oko widzi co innego ale dokładność w EA jest np do 10 miejsc po przecinku
dlatego warto też zaokrąglać wyniki używając NormalizeDouble(zmienna,Digits) - dzięki temu unika się wielu problemów :)

Jeśli stop loss chcesz na Low[1] to po prostu wstaw to w zminną która będzie w miejscu stopLoss i sprawdź czy cenia nie jest za blisko aktualnego poziomu prze dysłaniem
minimalny poziom SL i TP jaki można ustawić to

Kod: Zaznacz cały

Cena_aktualna+/- MarketInfo(Symbol(),MODE_STOPLEVEL)*Point
jeśli cena stop będzie za blisko to musisz ją skrygować
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
enjoy_xx
Stały bywalec
Stały bywalec
Posty: 37
Rejestracja: 23 maja 2010, 21:31

Nieprzeczytany post autor: enjoy_xx »

Dzieki za podpowiedzi, jakos to zaczyna mi sie ukladac. A mozesz mi podpowiedzieć skąd wziąć order ticket(numer zlecenia) przy zamykaniu?

do otwierania mam funkcję :
OrderSend(Symbol(), OP_BUY, lots, Ask, 0, stop_loss, 0);
i teraz przydało by się:

int ticket = ?????;

Zamykanie chcę wykonać jako osobną funkcję w ten sposób

if (Close[1]<Close[2])
{
zamknij();
}

A funkcja zamknij miała by wyglądać tak

void zamknij()
{
OrderClose(ticket,lots,Ask,3,Red);
}

Tylko jak przekazać ten parametr ticket z funkcji głównej start() do funkcji zamknij()

Awatar użytkownika
enjoy_xx
Stały bywalec
Stały bywalec
Posty: 37
Rejestracja: 23 maja 2010, 21:31

Nieprzeczytany post autor: enjoy_xx »

Głupia sprawa ale mam problem z napisaniem prostej instrukcji warunkowej. Minowicie niewiem jak oprzec warunek o aktualną cenę. Chodzi mi mniej wiecej o cos takiego:

if ( "Aktualna cena" >= High[1] )
{
instrukcja
}

I jeszcze jedno pytanie. Testuje kod na danych historycznych za pomocą strategi w MT4. Ustawiam w nim wolumen np. na H4. To mój kod zrozumie wartoś High[1] jako max z ostatniej świeczki w H4? Czy może niezbędne jest napisanie w kodzie na jakim wolumenie ma pracowac?

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

Aktualna cena to

Kod: Zaznacz cały

Bid // lub
Close[0]
- ta jest na wykresie i

Kod: Zaznacz cały

 Ask
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
enjoy_xx
Stały bywalec
Stały bywalec
Posty: 37
Rejestracja: 23 maja 2010, 21:31

Nieprzeczytany post autor: enjoy_xx »

Kod: Zaznacz cały

int start()
{
  
      if((Open[1] <= Close[1]) && //
      (Open[2] <= Close[2]) && //sprawdzanie czy ostatnie dwie byly wzrostowe
      
      (Close[1] >= Close[2]) &&//
      (High[1] >= High[2])) //sprawdza czy ostatniabyla "wyzsza" od przedostatniej
      
      {
      double stop_loss = Low[1];
      OrderSend(Symbol(), OP_BUY, lots, Ask, 1, stop_loss, 0);     
      if (Bid >=High[1])
         {
         OrderClose(1, lots, Bid, 3);
         }  
      }
}
W skrócie. Skrypt po wykryciu dwóch zakończonych zielonych świec miał otworzyć pozycje kupna(z sl Low[1]) i zamknąć ją w momencie gdy trzecia świeca przebije high drugiej.
No i testuje to na danych historycznych gdzie mam trzy zielone świece z rzędu i ta trzecia przebija High drugiej a zlecenie się nie zamyka tylko trwa aż wyłapie sl.
Orderticket wpisałem ręcznie 1 bo ta sytuacja(trzech zielonych z rzędu) występuje na pierwszym zleceniu jakie otwiera strategia.
Dodatkowo wiem że OrderClose jest dobrze napisane bo dla warunku (a==a) zamyka zawsze. Coś musi być nie tak z warunkiem albo zamkniecie pozycji jest w złym miejscu w klamrach.
Loty zadeklarowane globalnie.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
enjoy_xx
Stały bywalec
Stały bywalec
Posty: 37
Rejestracja: 23 maja 2010, 21:31

Nieprzeczytany post autor: enjoy_xx »

Wszystko co powyżej jest już nieaktualne. Sam rozgryzłem jak to zrobić.

Teraz mam problem z napisaniem kodu który wykonał by następującą czynność:

Sprawdzam strategie na wolumenie H4 ale sygnałem wejścia są dwie świece z rzędu koloru zielonego z np. wzrastającymi maxami występujące na wolumenie M15.

Jak odnieść się do niższych wolumenów gdy sama strategia dotyczy np H4.

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Kod: Zaznacz cały

double iClose( string symbol, int timeframe, int shift) 
Orły nie jedzą much

ODPOWIEDZ