Najpierw jednak o strategii - strategie w ramach tematu "Pies na trend", będą skupiały się tylko na grze w trendach wyższego rzędu dzienne - tygodniowe. Myślę, iż można by to spokojnie stosować dla niższych interwałów, ale to zostawiam Wam do roboty.
Główne założenie EA, które mogą powstać dla tych strategii, to podążanie za trendem. Określam EA kierunek i kilka wartości początkowych i tyle. Pierwsze EA, który powstał dla tej strategii został zaprezentowany tutaj - http://forum.comparic.pl/viewtopic.php? ... 334#p63858
Z racji Świąt Bożego narodzenia - przekazuję Wam w prezencie zmodyfikowaną wersję tego skryptu:
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| Pies_OgarPolski.mq4 |
//| Copyright 2016,MetaQuotesSoftwareCorp. - GoldWolf - comparic.pl |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016,MetaQuotesSoftwareCorp. - GoldWolf - comparic.pl"
#property link "http://forum.comparic.pl/viewtopic.php?f=27&t=4697#p64057"
#property version "1.00"
#property strict
#property description "OgarPolski to nazwa skryptu, który działa automatycznie po wprowadzeniu opowiednich danych."
#property description "Dokładny opis skryptu znajduje się w linku wyżej. (forum - comparic.pl)"
//+---Zmienne globalne -----------------------------------------------+
//---------------------------
extern bool CzyMaDzialac = false; //Czy ma działać?
extern datetime CzasStartu = __DATETIME__; //Od kiedy zacząć grę?
extern short KorpusSwiecy = 88; //Odległość min. pozycji
//wartość domyślna powinna być zależna od ruchu na danym walorze
extern short LiczbaSwiecBrokera = 5; //Ile świec tygodnia?
extern short ProcentSL = 31; //wartość [%] SL na kapitale, nie może być niższa niż brokera
double Lot_Q = 0.0, //wielkość pozycji
SL_Kapitalu = 0.48; // odpowiada 48% obsunięcia kapitału -w lini 48 jest modyfikowana o wartośc podaną z ProcentSL
int Pozycja = 0, //przechowuje informacje o ostatnio otwartej pozycji dla D1
CzySprawdzilH1 = 0, // zmienna przechowuje informacje czy w danej H1 było już sprawdzane,
//by co tik nie sprawdzał - szczególnie, że tylko raz mogę zająć pozycję
CzySprawdzilPozycjeBezSL = 0; //przechowuje informacje dla funkcji ZamknijWszystkoCoTraci
//by w kołko nie sprawdzała jeżeli już zostało sprawdzone
short MagicznaLiczba = 0, //wprowadziłem by uszeregować zlecenia, by móc lepiej zarządzać SL i pozycjami
Kierunek = 0; //zmienna przechowuje informacje czy grać do góry 1 czy na dół 9
double KursZagrania = 0.0;
string walor = Symbol();
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
walor = Symbol();
if(ProcentSL < AccountStopoutLevel()){ //jeżeli procent jest za niski przyjmuje procent od brokera
ProcentSL = (short) AccountStopoutLevel();
SL_Kapitalu = (double) ProcentSL / 100;
}else
SL_Kapitalu = (double) ProcentSL / 100;
Print("SL kapitalu to ", ProcentSL, "%");
if(IsTesting()){
FileDelete((string)(Symbol()+"KursZagrania.txt"));
CzyMaDzialac = true;
CzasStartu = 0;
}
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick(){
//--- Sprawdza czy nie zostało przekroczone [%] depozytu początkowego dla salda operacyjnego
// i zamyka stratne pozycje -------------
if(AccountBalance() * SL_Kapitalu > AccountEquity() && CzySprawdzilH1 != iBars(NULL, PERIOD_H1) && CzySprawdzilPozycjeBezSL != iBars(NULL,PERIOD_D1)){
Print("Czyszcze stratne pozycje ...");
ZamknijWszystkoCoTraci(99);
}
if(CzyMaDzialac){
if(CzasStartu < TimeCurrent()) //zaczyna od wskazanego czasu
if(DayOfWeek() != 7) //nie zaczynamy handlu w niedziele !!!
if(Pozycja != iBars(NULL,PERIOD_D1) && CzySprawdzilH1 != iBars(NULL, PERIOD_H1)){
CzySprawdzilH1 = iBars(NULL, PERIOD_H1);
string NazwaPliku = walor+"_SlupekPozycji.txt";
int handle;
if(FileIsExist(NazwaPliku)){
handle=FileOpen(NazwaPliku, FILE_TXT|FILE_READ);
if(handle!=INVALID_HANDLE){
FileSeek(handle, 0, SEEK_SET);
Pozycja = (int) FileReadString(handle);
FileClose(handle);
}else Print("Operation FileOpen failed, error ",GetLastError());
handle = NULL;
}
//Sprawdza jak ma grać -------------------------------------------
NazwaPliku = walor+"Kierunek.txt";
if(FileIsExist(NazwaPliku)){
//int handle;
handle=FileOpen(NazwaPliku, FILE_TXT|FILE_READ);
if(handle!=INVALID_HANDLE){
FileSeek(handle, 0, SEEK_SET);
Kierunek = (short) FileReadString(handle);
//FileWrite(handle,(string)Pozycja);
FileClose(handle);
}else Print("Operation FileOpen failed, error ",GetLastError());
handle = NULL;
}else
Print("Plik ", NazwaPliku, " nie istnieje!!!");
//sprawdza jaki był ostatni kurs zagrania
NazwaPliku = walor+"KursZagrania.txt";
if(FileIsExist(NazwaPliku)){
handle=FileOpen(NazwaPliku, FILE_TXT|FILE_READ);
if(handle!=INVALID_HANDLE){
FileSeek(handle, 0, SEEK_SET);
KursZagrania = (double) FileReadString(handle);
FileClose(handle);
}else Print("Operation FileOpen failed, error ",GetLastError());
handle = NULL;
NazwaPliku = NULL;
}
if(Kierunek == 1 || Kierunek == 9){
SprawdzKursPozycji();
if(Pozycja != iBars(NULL,PERIOD_D1))
ZajmijPozycje(Kierunek);
}
}else
CzySprawdzilH1 = iBars(NULL, PERIOD_H1);
}else
CzySprawdzilH1 = iBars(NULL, PERIOD_H1);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
/* Funkcja zajmij pozycję /*/
void ZajmijPozycje(short kierunek){
double ZamkniecieD1 = iClose(NULL,PERIOD_D1, 1);
double ZamkniecieH4 = iClose(NULL, PERIOD_H4, 1);
double MaxD1 = iHigh(NULL, PERIOD_D1, 1),
MinD1 = iLow(NULL, PERIOD_D1, 1),
OpenD1 = iOpen(NULL, PERIOD_D1, 0);
// pamiętać by sprawdzić kto jak maluje świecie
if(DayOfWeek() == 1 && LiczbaSwiecBrokera == 6)
ZamkniecieD1 = iClose(NULL,PERIOD_D1, 2);
//Print("KursZagrania 1: ", KursZagrania);
switch((int)kierunek){
case 9 : {
WielkoscPozycji();
if(KursZagrania == 0.0){
SprawdzKursPozycji();
if(KursZagrania == 0.0)
KursZagrania = iHigh(NULL,PERIOD_D1, 1);
}
if(Lot_Q > 0.001)
if(ZamkniecieD1 < ZamkniecieH4 && NormalizeDouble(KursZagrania - KorpusSwiecy*Point, Digits) > Bid && MinD1 < OpenD1){
int ticket = 0;
MagicznaLiczba = kierunek;
ticket = OrderSend(Symbol(), OP_SELL, Lot_Q, Bid, 3, NULL,NULL,NULL,MagicznaLiczba); //zajmowanie pozycji
double KursPozycji = Bid;
if(ticket<0)
Print("Nie otwarto pozycji Sell - error #",GetLastError());
else{
Print("Otwarto pozycje Sell");
Pozycja = iBars(NULL,PERIOD_D1);
ZapiszPozycje(KursPozycji);
}
}else
Print("Nie zajęto pozycji Sell. KursZagrania ", KursZagrania, " ; Bid ", Bid);
} break;
case 1 : {
WielkoscPozycji();
if(KursZagrania == 0.0){
SprawdzKursPozycji();
if(KursZagrania == 0.0)
KursZagrania = iLow(NULL,PERIOD_D1, 1);
}
if(Lot_Q > 0.001)
if(ZamkniecieD1 > ZamkniecieH4 && NormalizeDouble(KursZagrania + KorpusSwiecy*Point, Digits) < Ask && MaxD1 > OpenD1){
int ticket = 0;
MagicznaLiczba = kierunek;
ticket = OrderSend(Symbol(), OP_BUY, Lot_Q, Ask, 3, NULL,NULL,NULL,MagicznaLiczba); //zajmowanie pozycji
double KursPozycji = Ask;
if(ticket<0)
Print("Nie otwarto pozycji Buy - error #",GetLastError());
else{
Print("Otwarto pozycje Buy");
Pozycja = iBars(NULL,PERIOD_D1);
ZapiszPozycje(KursPozycji);
}
}else
Print("Nie zajęto pozycji Buy. KursZagrania ", KursZagrania, " ; Ask ", Ask);
} break;
//default :
}
}
//+-----------------------------------------------------------------+
void SprawdzKursPozycji(){
int total = OrdersTotal();
if (total >= 0)
for(int cnt=total; cnt >= 0; cnt--){
if(OrderSelect(cnt,SELECT_BY_POS)){
//Print("cnt - ", cnt, " , Total ", total, " OrderType()- ", OrderType(), " Kierunek - ", Kierunek);
//Print("KursZagrania3 - ", KursZagrania);
if(OrderSymbol() == Symbol())
switch(Kierunek){
case 1:{
if (OrderType() == OP_BUY)
if(KursZagrania == 0){
KursZagrania = OrderOpenPrice();
cnt = 0;
}else if(KursZagrania < OrderOpenPrice()){
KursZagrania = OrderOpenPrice();
cnt = 0;
}
}break;
case 9:{
if (OrderType() == OP_SELL)
if(KursZagrania == 0){
KursZagrania = OrderOpenPrice();
cnt = 0;
}else if (KursZagrania > OrderOpenPrice()){
KursZagrania = OrderOpenPrice();
cnt = 0;
}
}break;
}
}
}
//Print("KursZagrania3 - ", KursZagrania);
}
//+------------------------------------------------------------------+
/* Funkcja zapisu do pliku informacji o pozycjach */
void ZapiszPozycje(double KursPozycji){
//zapisywanie kursy pozycji by nie otworzył poniżej ostatniego kursu zajęcia pozycji
string NazwaPliku = walor+"KursZagrania.txt";
int handle;
handle=FileOpen(NazwaPliku, FILE_WRITE|FILE_TXT|FILE_READ);
if(handle!=INVALID_HANDLE){
FileSeek(handle, 0, SEEK_SET);
FileWrite(handle,(string)KursPozycji);
FileClose(handle);
}else Print("Operation FileOpen failed, error ",GetLastError());
handle = NULL;
NazwaPliku = NULL;
NazwaPliku = walor+"_SlupekPozycji.txt";
handle=FileOpen(NazwaPliku, FILE_WRITE|FILE_TXT|FILE_READ);
if(handle!=INVALID_HANDLE){
FileSeek(handle, 0, SEEK_SET);
FileWrite(handle,(string)Pozycja);
FileClose(handle);
}else Print("Operation FileOpen failed, error ",GetLastError());
handle = NULL;
}
/*
Funkcja do zamykania pozycji po nieudanym setapie - zamyka wszystko co nie ma ustawionego SL czyli
wszystko co straci
*/
void ZamknijWszystkoCoTraci(short CoRobic){
bool Zaliczone = false;
int total = OrdersTotal();
switch(CoRobic){
case 99 :{
short LiczStratne = 0;
if (total >= 0){
for(int cnt=total; cnt >= 0; cnt--){
if(OrderSelect(cnt,SELECT_BY_POS)){
if(OrderSymbol() == Symbol()){
if(OrderStopLoss() == 0){
Zaliczone=OrderClose(OrderTicket(),OrderLots(),Bid,3);
if(!Zaliczone)
Print("OrderSend failed with error #",GetLastError());
else{
Print("Zamknięto pozycję ", OrderSymbol(), " : ", OrderOpenTime());
if(AccountBalance() * SL_Kapitalu > AccountEquity()){
Print("Przekroczono SL na kapitale. Zamykam dalej zostało do analizy ", cnt, " pozycji.");
LiczStratne++;
}else{
Print("Przekroczono SL na kapitale. Na razie przerywam - być może zamknięto wystarczającą liczbę pozycji");
cnt = -1;
}
}
}
}
}
}
}
if(LiczStratne > 1){ //sprowadziłem prosty mechanizm by mnie informował czy zamknąłem więcej pozycji stratnych
// jeżeli zamknie więcej niż 1 pozycji to być może straty były już zbyt duże i dlatego
//zatrzymuje EA by sprawdzić co się stało
Alert(TimeCurrent(), Symbol(), " Przekroczono SL na kapitale. Czyszcze stratne pozycje i zatrzymuje EA");
CzyMaDzialac = false;
}
}break;
}
}
/* Funkcja obliczająca jaką pozycję można otworzyć w zależności od
dostępnego kapitału i depozytu zabezpieczajacego wartości dla PLN
*/
void WielkoscPozycji(){
if(AccountBalance() <= 1000){
Lot_Q = 0.01;
}else if (AccountBalance() > 1000 && AccountBalance() < 2000){
Lot_Q = 0.02;
}else if (AccountBalance() >= 2000 && AccountBalance() < 3000){
Lot_Q = 0.04;
}else if (AccountBalance() >= 3000 && AccountBalance() < 4000){
Lot_Q = 0.08;
}else if (AccountBalance() >= 4000 && AccountBalance() < 5000){
Lot_Q = 0.1;
}else if (AccountBalance() >= 5000 && AccountBalance() < 8000){
Lot_Q = 0.15;
}else if (AccountBalance() >= 8000){
Lot_Q = 0.2;
}
}
By EA mogło ruszyć należy w folderze profilu użytkownika/MQL4/Files/ umieścić plik o nazwie Symbol(zależy od brokera)+kierunek.txt (np. w XTB - EURJPY+Kierunek.txt, a AdmiralMarkets - EURJPYKierunek.txt) - w pliku tym umieszczamy tylko wartość 1 (Buy) lub 9 (Sell). Gdy mamy tak przygotowany plik możemy uruchomić EA na danym walorze. O tym pisałem już wcześniej w linku wyżej.
Napisałem również Skrypt - http://forum.comparic.pl/viewtopic.php? ... 058#p64058, który przygotowuje pliki niezbędne do działania EA. Automatycznie tworzy pliki Kierunek i SL_Sys(plik ten nie jest wymagany dla tego EA), oraz ew. je nadpisuje.
EA będzie zajmował pozycje tylko gdy cena jest wyższa od ostatniej transakcji (nie griduje) oraz tylko gdy
Kod: Zaznacz cały
ZamkniecieD1 < ZamkniecieH4
EA ma następujące parametry wejścia:
Kod: Zaznacz cały
extern bool CzyMaDzialac = false; //Czy ma działać?
extern datetime CzasStartu = __DATETIME__; //Od kiedy zacząć grę?
extern short OdlegloscOdOstatniejPozycji = 88; //Odległość min. pozycji
//wartość domyślna powinna być zależna od ruchu na danym walorze
extern short LiczbaSwiecBrokera = 5; //Ile świec tygodnia?
extern short ProcentSL = 31; //wartość [%] SL na kapitale, nie może być niższa niż brokera
CzyMaDzialac - gdy true zaczyna działać
CzasStartu - konkretna data od której EA ma zacząć pracować
OdlegloscOdOstatniejPozycji - jest to minimalna wartość [w punktach] od ostatniej pozycji (jest to dość kluczowy czynnik wpływający na to ile pozycji będziemy zajmować)
LiczbaSwiecBrokera - domyślnie 5 (Admiral ma 5, XTB ma 6 świec) - warto wprowadzić odpowiednią wartość zależną od tego ile broker ma świeczek dla danego tygodnia 5 czy 6
ProcentSL - jedyne zabezpieczenie jakie wprowadziłem, jeżeli wartości będzie niższa niż brokera, EA przyjmie wartość od brokera
EA zajmuje tylko jedną pozycję w danym dniu i nie ustawia SL dla poszczególnych transakcji.
W ramach strategii napisałem jeszcze jedno EA - Pies_GonczyPolski (zostanę przy nazewnictwie zaciągniętym z polskich ras psów). EA działa w ten sam sposób co poprzednie, tylko operuje na samych H4 i zawiera kilka zabezpieczeń - jak SL_Systemowy czy SL_Kapitalu, oraz zamyka stratne pozycje. Również co piątek redukuje cześć pozycji otwartych w danym tygodniu, a dla reszt ustawia SL (czyli zawiera to wszystko o czym pisałem w poprzednim wątku).
Sama koncepcja strategii opiera się na pewnym założeniu, nazwałbym je świętym gralem czyli - trend jest naszym przyjacielem. Na tym założeniu bazowała jedna z lepszych obiektywnych strategii, która była wykorzystywana przez ludzi biorących udział w eksperymencie Żółwia.
Rezultaty EA Pies_OgarPolski dla EURJPY
By jednak nie było tak różowo, to zobaczy jak wygląda to dla GBPJPY
To jeszcze rzućmy okiem jak się zachowuje moja obecnie dopieszczane EA - Pies_GonczyPolski, dla tych samych sytuacji rynkowych - EURJPY
i GBPJPY
Życzę Wesołych Świąt i udanego odpoczynku od wykresów i innej maść ..kresów.