MQL4 COURSE
By Coders’ guru
www.forex-tsd.com
-13-
Twoj pierwszy Doradca Ekspertowy
Part 1
--------------------
W poprzedniej lekcji tworzyli nasz pierwszy wskaznik. Chociaz nie byl on uzyteczny dla tradera, to jednak mial ogromne znaczenie dla programisty. Wskazniki – ogolnie rzecz biorac – odgrywaja duze znaczenie w analizie technicznej rynku, przewidywania przyszlych cen.
Z ich pomoca obserwujemy wykres, by nastepnie otworzyc recznie pozycje dluga, krotka lub zmodyfikowac juz otwarta. Co sie z tym laczy, musimy siedziec przed monitorem i miec oczy szeroko otwarte. Jesli sie zmeczysz, chcesz wypic filizanke herbaty lub nawet zrobic sobie krotkie wakacje, musisz zastanowic sie i wybrac pomiedzy dwoma rozwiazaniami:
Mozesz najac kogos do obserwowania terminalu. Ta osoba bedzie do ciebie dzwonila co piec minut z informacjami o tym, co dzieje sie na rynku. Jesli pracownik, ktorego wynajales jest ekspertem, bedzie cie on kosztowal tyle pipsow, ile zdolasz zarobic, a jesli jest poczatkujacy, bedzie cie to kosztowalo caly twoj kapital.
Drugim rozwiazaniem jest uzywanie programu, ktory zautomatyzuje twoje zlecenia. Do tego wlasnie sluzy Expert Advisor (w przelozeniu na polski Doradca Ekspertowy, ale bede uzywal angielskiej nazwy, ew. skrotu EA).
Expert Advisor jest programem napisanym w MQL4 uzywajacy twoich ulubionych wskaznikow i metod handlu do automatyzacji twoich polecen.
Moze kupowac, sprzedawac i modyfikowac zlecenia. Pozwala ci na wypicie filizanki kawy i zachowania zarobkow, ktore wydalbys na pracownika lub na bukiet kwiatow dla zony pomocnika.
Dzisiaj zaczniemy tworzyc nasz pierwszy EA, do dziela wiec!
Krok pierwszy:
Jesli nie otworzyles jeszcze MetaEditor'a, mysle, ze nastal czas bys to zrobil.
Z meny Plik (file) wybieramy Nowy (new) (mozesz rowniez nacisnac ctrl+n lub kliknac na ikonke Nowy na standardowym pasku narzedziowym). Otworzy sie kreator, ktory juz widziales przy okazji tworzenia wskaznika. Tym razem wybierzemy pierwsz opcje 'Doradca Ekspertowy' (Expert Advisor program) i klikniemy 'Dalej' (next).
Krok drugi:
Kiedy kliknales przycisk 'Dalej', otrzymales kreator ogolnych wlasciwosci. Pozwoli ci on ustawic oprocz ogolnych wlasciwosci, zewnetrzne wartosci, ktorych uzyjesz w soim EA. Na tym etapie mozesz ustawic:
- Nazwa twojego EA, w naszym przykladzie My_First_EA.
- Autor, gdzie wpiszesz swoje imie (w przykladzie wpisalem swoje :>)
- Link do twojej strony internetowej
- Lista wartosci zewnetrznych:
Jest to lista wartosci twojego EA, ktore pozwalasz zmienic z poziomu okna wlasciwosci Doradcy.
By dodac nowa zmienna, kliknij na przycisk 'Dodaj' (Add), co z powoduje dodanie nowego rekordu do naszej listy. Kazdy z nich ma trzy pola:
Nazwa – kliknij dwa razy by ustawic nazwe dla danej zmiennej
Typ – kliknij dwa razy by ustawic typ (lekcja 3 - MQL4 Data types) dla danej zmiennej
Poczatkowa wartosc – kliknij dwa razy by ustawic poczatkowa wartosc dla danej zmiennej
To pole jest domyslne, co oznacza, ze mozesz pozostawic je bez zmian. W naszym przykladzie dodalismy 3 wartosci (zmienne):
Varaible _ Type _ initial value
TakeProfit _ double _ 350
Lots _ double _ 0.1
Teraz kliknij na przycisk 'Zakończ' (Finish), by zamknac kreator,a MetaEditor wyswietli nam kod stworzony za jego pomoca i zapisze go jako My_First_EA.mq4 w katalogu MetaTrader 4, folder experts.
Uwaga: EA musisz umieszczac w folderze MetaTrader 4\experts, a wskazniki w MetaTrader 4\experts\indicators w przeciwnym wypadku nie beda dzialac.
Oto kod, ktory stworzylismy za pomoca kreatora:
//+------------------------------------------------------------------+
//| My_First_EA.mq4 |
//| Coders Guru |
//| http://www.forex-tsd.com |
//+------------------------------------------------------------------+
#property copyright "Coders Guru"
#property link "http://www.forex-tsd.com"
//---- input parameters
extern double TakeProfit=250.0;
extern double Lots=0.1;
extern double TrailingStop=35.0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
Jak widzisz powyzej, kod wygenerowany przez kreator jest szablonem do ktorego mozesz dodac swoj kod, bez klopotliwego pisania glownych funkcji.
Dodaj teraz swoj kod:
//+------------------------------------------------------------------+
//| My_First_EA.mq4 |
//| Coders Guru |
//| http://www.forex-tsd.com |
//+------------------------------------------------------------------+
#property copyright "Coders Guru"
#property link "http://www.forex-tsd.com"
//---- input parameters
extern double TakeProfit=250.0;
extern double Lots=0.1;
extern double TrailingStop=35.0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
int Crossed (double line1 , double line2)
{
static int last_direction = 0;
static int current_dirction = 0;
if(line1>line2)current_dirction = 1; //up
if(line1<line2)current_dirction = 2; //down
if(current_dirction != last_direction) //changed
{
last_direction = current_dirction;
return (last_direction);
}
else
{
return (0);
}
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, ticket, total;
double shortEma, longEma;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // check TakeProfit
}
shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
int isCrossed = Crossed (shortEma,longEma);
total = OrdersTotal();
if(total < 1)
{
if(isCrossed == 1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
"My EA",12345,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
if(isCrossed == 2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,
Bid-TakeProfit*Point,"My EA",12345,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(isCrossed == 2)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
// close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-
Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(isCrossed == 1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
// close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) ||
(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
Uwaga: nie kopiuj kodu powyzej, poniewaz jest on warped i nie bedzie dzialal, uzyj kodu zawartego w lekcjach na www.forex-tsd.com.
Przestraszony? (Are you scared? You shouldn't be! Cuz you are in scare tactics :D)
Nie boj sie tych 160 linii kodu. Zapoznamy sie z nim calym, linijka po linijce, obiecuje, to bedzie latwe zadanie.
Testowanie EA:
Zanim ropozczniemy analize naszego EA, musimy sprawdzic czy jest on dochodowy, czy nie.
Uwaga: Nasz EA dziala z para EURUSDna interwale H4. Skompiluj wiec nasza strategie przy pomocy klawisza F5 i zaladuj ja w MetaTrader'ze.
Handlowanie na zywo:
Rezultaty testowania strategii na zywo jest bardziej dokladne, ale musisz poswiecic na to dni (czasami i miesiace) by okreslic, czy jest ona dochodowa.
Musisz pozwolic EA na przeprowadzanie przez niego operacji handlu.
By to zrobic, z menu Narzedzia (tools) wbierz Opcje (option) lub nacisnij kombinacje klawiszy ctrl + o. Pojawi sie okno, w ktorym nalezy przejsc do zakladki Expert Advisor i zaznaczyc opcje:
Enable Expert Advisor
Allow live trading
i kliknij OK.
Zobaczysz symbol usmiechu obok nazwy strategii, co bedzie oznaczalo, ze EA jest gotowe, by przejac twoje obowiazki.
Strategy tester:
Druga metoda na sprawdzenie twojego EA, z mniejsza dokladnoscia, ale nie zajmujaca tyle czasu, jest Strategy tester. Otworz okno od niego uzywajac klawisza F6.
Symbol: EURUSD
Okres (Period): H4
Model: Open prices only
Kliknij przycisk Start, by rozpoczac testowanie EA.
Zobaczysz pasek postepu (i dwie zakaldki Ustawienia i Dziennik), ktory zamieni sie (?) w 5 zakladek. Nas interesuje zakladka Raport. Przejdz do niej, by zobaczyc dochod.
Mamy duzo do powiedzenia i zrobienia na nastepnej lekcji. Mam nadzieje, ze jestes gotowy do tego pojedynku. Jestem otwarty na wszystkie pytania i sugestie.
Do napisania
Coders' Guru
24-11-2005
Tlumaczenie Matteo 13-10-2007