Příspěvek se nahlašuje...
Zkus to nahrát sem, popřípadě dát nějaký odkaz. Takhle by se z toho nikdy nikdo nemohl v budoucnu poučit, kdybysme to řešili soukromě přes maily. :)
//+------------------------------------------------------------------+
//| Pokus_Navrat_ceny_v1.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property copyright "tapir"
#property link ""
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Externé vstupné parametre strategie |
//+------------------------------------------------------------------+
extern int magic_number = 124; // magic_number: identifikacne cislo strategie
extern int vstup_od_hod = 16;
extern int vstup_od_min = 0;
extern int vstup_do_hod = 20;
extern int vstup_do_min = 0;
extern double velikost_pozice = 0.1;
extern int expirace_hod = 0; // ked dam nulu, tak sa budu brat do uvahy hodnoty z vstup_do_hod a vstup_do_min
extern int trailing_stop_bodov = 0; // trailing_stop_bodov: posuvanie SL ak sa trh vyda nasim smerom
extern int break_even_bodov = 0; // break_even_bodov: posunutie SL na VSTUP ak cena dosiahne nap. 10 pips zisku
extern int break_even_procenta = 0; // break_even_procenta: posunutie SL na VSTUP ak cena dosiahne napr. 50% z TP alebo co ja viem...
extern bool vstup_podla_BB = true;
extern int vstup_podla_BB_perioda = 200;
extern int vstup_podla_BB_odchylka = 1;
extern int vstup_podla_BB_posun = 1;
extern int vstup_podla_BB_MINvzdalenost_od_MAIN_bodov = 100; // vstup_podla_BB_MINvzdalenost_od_MAIN_bodov : povolit vstup ak bude cena napr. MIN 100 bodov od strednej krivky
extern int vstup_podla_BB_MAXvzdalenost_od_MAIN_bodov = 500; // vstup_podla_BB_MAXvzdalenost_od_MAIN_bodov : povolit vstup ak bude cena napr. MAX 500 bodov od strednej krivky
extern bool vstup_podla_PSAR = true;
extern double vstup_podla_PSAR_krok = 1;
extern double vstup_podla_PSAR_maximum = 1;
extern int vstup_rozestup_VSTUPov_bodov = 20; // vstup_rozestup_VSTUPov_bodov: za den mozem urobit viac vstupov a toto je vzdialenost medzi nimi
extern double koeficient_navysovani_pozic = 1.2; // koeficient_navysovani_pozic: vzdy dalsi obchod bude mat OrderSend_Volume = Volume predchadzajuceho obchodu * koeficient_navysovani_pozic
extern int max_pocet_otvorenych_obchodov_v_danom_dni = 0; // max_pocet_otvorenych_obchodov_v_danom_dni: napr. = 3, tak stvrty obchod v danom dni mi uz neotvori
extern int uzavrit_obchod_hod = 0; // uzavrit_obchod_hod: napr. o 17:00 nam zatvori otvorene obchody, uz neocakavame velky pohyb, tak nas to uz nezaujima
extern int uzavrit_obchod_min = 0; // uzavrit_obchod_min: !!! BACHA, pokial chcem uzavriet na konci dna, tak musim dat 23:55, ked som mal 23:59 tak mi to nezatvorilo bo premenna cas_kdy_se_uzavre_obchod sa mi vzdy na zaciatku kazdeho dna prepise na aktualny datum + cas kedy sa ma obchod zavret
extern bool uzavrit_obchod_na_konci_dne = false; // uzavrit_obchod_na_konci_dne: pokial chcem uzavriet na konci dna, tak musim dat 23:55 !!! ALE BACHA !!! v piatok sa konci uz 22:00
extern bool uzavrit_obchod_na_konci_nasledujiciho_dne = false; // uzavrit_obchod_na_konci_nasledujiciho_dne: pokial chcem uzavriet na konci nasledujuceho dna, tak musim dat 23:55 !!! ALE BACHA !!! v piatok sa konci uz 22:00
extern bool vystup_podla_EMA = true; // vystup_podla_EMA: ak sa cena dotkne bo prekrizi EMA, tak obchod zatvaram, napr. sa to bude dat pouzit ak by som obchodoval bez SL
extern int vystup_podla_EMA_max_zisk_v_bodoch = 0; // vystup_podla_EMA_max_zisk_v_bodoch: napr. pokial bol zisk len do 100 bodov, tak pri dotyku EMA vystupujem, zrejma nedojde k pohybu, ktory ocakavam
extern int vystup_podla_EMA_perioda = 200; // vystup_podla_EMA_perioda:
extern int vystup_podla_EMA_sviecky = PRICE_CLOSE; // vystup_podla_EMA_sviecky: PRICE_CLOSE: Close price // PRICE_TYPICAL: Typical price, (high + low + close)/3
// obchodujem iba vybrane dny, napr. v pondeli ze sa zacinaju preberat z vikendu (slabe pohyby, mala volatilita) a ctvrtek, patek byvaju silne fundamenty (silne pohyby, velka volatilita)
extern bool obchodovat_Pondeli = true;
extern bool obchodovat_Uteri = true;
extern bool obchodovat_Stredu = true;
extern bool obchodovat_Ctvrtek = true;
extern bool obchodovat_Patek = true;
extern bool NEobchodovat_prazdniny = false; // NEobchodovat_prazdniny: ci sa bude obchodovat cez prazdniny
bool obchodovanie_cez_prazdniny_zrusene = false;
datetime NEobchodovat_prazdniny_OD = StrToTime("2000.01.01 00:00:00");
datetime NEobchodovat_prazdniny_DO = StrToTime("2000.01.01 00:00:00");
int i, err, p_count;
int Time_frame = Period();
int Bars_pocet = 0;
int Den_v_roku = 0;
int Den_v_tyzdni = 0;
// na kontrolu ci uz bol v dany den zadany prikaz, ak ano, tak dalsi uz v danom dni nezadavam
int Den_zadania_prikazu_BUY = 0;
int Den_zadania_prikazu_SELL = 0;
datetime pasmo_VSTUP_OD = StrToTime("2000.01.01 00:00:00"); // tu si poskladama udaj z aktualneho datumu + vstup_od_hod + vstup_od_min
datetime pasmo_VSTUP_DO = StrToTime("2000.01.01 00:00:00"); // tu si poskladama udaj z aktualneho datumu + vstup_do_hod + vstup_do_min
double vstup_podla_BB_MAIN = 0;
double vstup_podla_BB_UPPER = 0;
double vstup_podla_BB_LOWER = 0;
double vstup_podla_PSAR_0 = 0;
double vstup_podla_PSAR_1 = 0;
double OrderSend_StopLoss = 0;
double OrderSend_TakeProfit = 0;
double OrderSend_Price = 0;
datetime OrderSend_Expirace = 0;
double OrderSend_Volume = 0;
int OP_ticket_BUY = 0;
int OP_ticket_SELL = 0;
int barva_prikazu = Yellow;
bool ukonci_obchod_BUY = false;
bool ukonci_obchod_SELL = false;
double vystup_podla_EMA_max_zisk_BUY = 0; // tu sa zapisuje max. dosiahnuta cena pro obchod BUY z ceny Ask
double vystup_podla_EMA_max_zisk_SELL = 0; // tu sa zapisuje max. dosiahnuta cena pro obchod SELL z ceny Bind
int vystup_podla_EMA_OP_ticket_BUY = 0;
int vystup_podla_EMA_OP_ticket_SELL = 0;
datetime cas_kdy_se_uzavre_obchod = StrToTime("2000.01.01 00:00:00"); // tu si poskladama udaj z aktualneho datumu + uzavrit_obchod_hod + uzavrit_obchod_min
bool moze_zadat_prikaz_BUY = true; // kontrola ci je zadany prikaz BUY
bool moze_zadat_prikaz_SELL = true; // kontrola ci je zadany prikaz SELL
int PocitadloArray = 0;
struct TicketClass {
int ticket;
double price;
string print;
string BE;
};
TicketClass TicketArray[1000000];
double p_OrderTicket_BE = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// !!! SendMail() function does not work in the Strategy Tester. !!!
SendMail("AOS - Experts_Pokus_Navrat_ceny_v1 - INIT - "+IntegerToString(magic_number), "spustenie strategie Navrat ceny - magic_number = "+IntegerToString(magic_number)); // posle email, ktory mame v MT4 nastaveny Nastroje/Moznosti/E-Mail
Alert("INIT - Alert - "+IntegerToString(magic_number));
Comment("INIT - Comment - "+IntegerToString(magic_number));
// ** na zaciatku si vypisem vsetky zadane parametre strategie ... toto tu je koli realnemu obchodovaniu
PrintParametre("INIT");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
SendMail("AOS - Experts_Pokus_Navrat_ceny_v1 - DEinit - "+IntegerToString(magic_number), "zastavenie strategie Navrat ceny - magic_number = "+IntegerToString(magic_number)); // posle email, ktory mame v MT4 nastaveny Nastroje/Moznosti/E-Mail
Alert("DEINIT - Alert - "+IntegerToString(magic_number));
Comment("DEINIT - Comment - "+IntegerToString(magic_number));
// ** na konci si vypisem vsetky zadane parametre strategie ... toto tu je koli testovaniu
PrintParametre("DEINIT");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick(void)
{
// http://www.forex-pro-zacatecniky.cz/news/zaklady-mql4-aneb-mimimum-pro-zahajeni-programovani-dil-2-/
barva_prikazu = Yellow;
ukonci_obchod_BUY = false;
ukonci_obchod_SELL = false;
moze_zadat_prikaz_BUY = true; // kontrola ci je zadany prikaz BUY, ak ano, tak dalsi uz neotvaram
moze_zadat_prikaz_SELL = true; // kontrola ci je zadany prikaz SELL, ak ano, tak dalsi uz neotvaram
if (Den_v_roku != DayOfYear())
{
zapisLOG("", "Account free margin", DoubleToString(AccountFreeMargin()));// kolik mam volnych prostredku
Den_v_tyzdni = DayOfWeek(); // zjistí den v týdnu (neděle=0 … pátek=5)
Den_v_roku = DayOfYear(); // (1 means 1 January,..,365(6) does 31 December)
Den_zadania_prikazu_BUY = 0; // na kontrolu ci uz bol v dany den zadany prikaz, ak ano, tak dalsi uz v danom dni nezadavam
Den_zadania_prikazu_SELL = 0;
OP_ticket_BUY = 0; // ak uz je druhy den, tak mozem znovu zadat BUY / SELL, preto si vynulujem hodnotu ticketu
OP_ticket_SELL = 0;
if ((vstup_od_hod > 0 || vstup_od_min > 0) && (vstup_do_hod > 0 || vstup_do_min > 0))
{
pasmo_VSTUP_OD = StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" "+IntegerToString(vstup_od_hod)+":"+IntegerToString(vstup_od_min)+":00");
pasmo_VSTUP_DO = StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" "+IntegerToString(vstup_do_hod)+":"+IntegerToString(vstup_do_min)+":00"); // zapisLOG("", "pasmo_VSTUP_OD", TimeToStr(pasmo_VSTUP_DO)); zapisLOG("", "pasmo_VSTUP_OD", TimeToStr(pasmo_VSTUP_OD));
}
if (uzavrit_obchod_hod > 0)
{
cas_kdy_se_uzavre_obchod = StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" "+IntegerToString(uzavrit_obchod_hod)+":"+IntegerToString(uzavrit_obchod_min)+":00");
}
else
{
if (uzavrit_obchod_na_konci_dne == true)
{
// v patek zaviera 22:00 a ostatne dny 24:00
if (Den_v_tyzdni == 5) { cas_kdy_se_uzavre_obchod = StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" 21:30");}
else { cas_kdy_se_uzavre_obchod = StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" 23:40");}
// v patek zaviera 21:00 a ostatne dny 22:00
if (Symbol() == "GOLDs.") { cas_kdy_se_uzavre_obchod = StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" 20:30");}
}
}
if (NEobchodovat_prazdniny == true) // ci sa bude obchodovat cez prazdniny
{
NEobchodovat_prazdniny_OD = StrToTime(IntegerToString(TimeYear(TimeCurrent()))+".07.01 00:00:00");
NEobchodovat_prazdniny_DO = StrToTime(IntegerToString(TimeYear(TimeCurrent()))+".09.01 00:00:00");
}
vystup_podla_EMA_max_zisk_BUY = 0; // mal by som pracovat iba s poslednym otvorenym obchodom
vystup_podla_EMA_max_zisk_SELL = 0;
vystup_podla_EMA_OP_ticket_BUY = 0; // aby mi to neosefovalo obchod, ktory presiel do druheho dna
vystup_podla_EMA_OP_ticket_SELL = 0;
obchodovanie_cez_prazdniny_zrusene = false;
if (PocitadloArray > 0)
{
// tu si zistim a zapisem k jednotlivym obchodom profit (zisk / strata)
for(i = 1; i <= PocitadloArray; i++)
{
if (TicketArray[i].print != "X")
{
if (OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY))
{
TicketArray[i].price = NormalizeDouble(OrderProfit(), 2);
TicketArray[i].print = "X";
if (TicketArray[i].BE == "X") {zapisLOG(DoubleToString(TicketArray[i].ticket, 0), "ZISK/STRAT - BE", DoubleToString(OrderProfit(), 2));}
else {zapisLOG(DoubleToString(TicketArray[i].ticket, 0), "ZISK/STRAT", DoubleToString(OrderProfit(), 2));}
}
}
}
}
}
// ** //
/*
if (Hour() == 16 && Minute() == 17 )
{
vstup_podla_BB_MAIN = iSAR(NULL, 0, 1, 1, 0);
createObject("BUY-HIGH", OBJ_TREND, clrBlack, TimeCurrent(), vstup_podla_BB_MAIN, TimeCurrent()+36000, vstup_podla_BB_MAIN, "BUY HIGH");
createObject("Bid_BB", OBJ_TEXT, clrBlack, TimeCurrent()+36000, vstup_podla_BB_MAIN, NULL, NULL, TimeToStr(TimeCurrent(), TIME_MINUTES));
}
*/
// ** tu si osefefujem otvorene obchody: trailing stop, break-even alebo ich zatvorit
for(i = 0; i <= OrdersTotal(); i++)
{
// U long příkazu jsme vstupovali za Ask a tedy vystupujeme za Bid cenu !!! u short zase opacne vstup za Bid, vystup za Ask
// OrderSelect se používá k výberu zadaného príkazu dle císla štítku nebo dle indexu.
// SELECT_BY_POS: vyber podla poradia pokynov.
// MODE_TRADES: výber z aktuálne zadaných i cakajucich príkazov. Tato hodnota je nastavena jako implicitní.
// OrderMagicNumber vrací magické císlo vybraného príkazu, zadané pomocí funkce OrderSend.
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magic_number)
{
// ** na zaklade tychto podmienok sa uzavre obchod
filter_vystup();
if (StrToTime("2000.01.01 00:00:00") != cas_kdy_se_uzavre_obchod && TimeCurrent() > cas_kdy_se_uzavre_obchod) // ak je zadana hodina uzavreti prikazu, tak tu to vykonam
{
barva_prikazu = Green;
if (OrderType() == OP_BUY) ukonci_obchod_BUY = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(BUY)-zadana hodina uzavreni prikazu, Bid = ", DoubleToString(Bid, Digits));
if (OrderType() == OP_SELL) ukonci_obchod_SELL = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(SELL)-zadana hodina uzavreni prikazu, Ask = ", DoubleToString(Ask, Digits));
}
// ** na zaklade predchdzajucich podmienok sa uzavru obchody
// http://www.forex-pro-zacatecniky.cz/news/zadavame-pozici-short-dil-6-/
if(ukonci_obchod_BUY == true)
{
// OrderClose ( ticket, lots, price, slippage, color) co znamena slippage = 2 ???, mali to tak zadane natvrdo na webu
if(OrderClose(OrderTicket(), OrderLots(), Bid, 2, barva_prikazu) == false) // U long příkazu jsme vstupovali za Ask a tedy vystupujeme za Bid cenu
{Print("-----------------------------ERROR-OrderClose-OP_BUY-11---------------------------",""); Print("OP_BUY OrderClose failed error code is: ",GetLastError()); Print("-----------------------------ERROR-OrderClose-OP_BUY-12---------------------------","");}
}
if(ukonci_obchod_SELL == true)
{
// OrderClose ( ticket, lots, price, slippage, color) co znamena slippage = 2 ???, mali to tak zadane natvrdo na webu
if(OrderClose(OrderTicket(), OrderLots(), Ask, 2, barva_prikazu) == false) // U short příkazu jsme vstupovali za Bid a tedy vystupujeme za Ask cenu
{Print("-----------------------------ERROR-OrderClose-OP_SELL-11---------------------------",""); Print("OP_SELL OrderClose failed error code is: ",GetLastError()); Print("-----------------------------ERROR-OrderClose-OP_SELL-12---------------------------","");}
}
// !!! tu to treba asi premysliet ako zafunguje nasledovne riesenie TrailingStopu ak som obchod predoslim prikazom OrderClose() uzavrel
p_OrderTicket_BE = 0;
// http://www.forex-pro-zacatecniky.cz/news/zadani-podminek-pro-vstup-a-posunuti-na-break-even-dil-7-/
if (break_even_bodov > 0) // posunutie SL na VSTUP ak cena dosiahne nap. 10 pips zisku
{
// OrderStopLoss() < OrderOpenPrice(), aby EA neposuvala neustale SL na VSTUP, cize pokial bude SL = VSTUPU, tak uz neposuvaj SL
// OrderStopLoss() != OrderOpenPrice() nie je vhodne pouzit lebo ak by sme mali zaply TrailingStop, tak by nam EA neustale davala SL na VSTUP
if (OrderType() == OP_BUY && Bid >= (OrderOpenPrice() + (break_even_bodov * Point)) && OrderStopLoss() < OrderOpenPrice()) // pro pokyn typu BYU
{
if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Blue) == false) {Print("-----------------------------ERROR-OrderModify-OP_BUY-11---------------------------",""); Print("OP_BUY OrderModify - break_even_bodov: ",GetLastError()); Print("-----------------------------ERROR-OrderModify-OP_BUY-12---------------------------","");}
else { p_OrderTicket_BE = OrderTicket(); zapisLOG(IntegerToString(OrderTicket()), "OP_BUY OrderModify - break_even_bodov > 0, Bid = ", DoubleToString(Bid, Digits));}
}
if (OrderType() == OP_SELL && Ask <= (OrderOpenPrice() - (break_even_bodov * Point)) && OrderStopLoss() > OrderOpenPrice()) // pro pokyn typu SELL
{
if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red) == false) {Print("-----------------------------ERROR-OrderModify-OP_SELL-11---------------------------",""); Print("OP_SELL OrderModify - break_even_bodov: ",GetLastError()); Print("-----------------------------ERROR-OrderModify-OP_SELL-12---------------------------","");}
else { p_OrderTicket_BE = OrderTicket(); zapisLOG(IntegerToString(OrderTicket()), "OP_SELL OrderModify - break_even_bodov > 0, Ask = ", DoubleToString(Ask, Digits));}
}
}
if (break_even_procenta > 0) // posunutie SL na VSTUP ak cena dosiahne nap. 50% TP alebo co ja viem...
{
if (OrderType() == OP_BUY)
{
if (Bid > ((((OrderTakeProfit() - OrderOpenPrice()) / 100) * break_even_procenta) + OrderOpenPrice()) && OrderStopLoss() < OrderOpenPrice()) // tu zistujem 50% zisku: ak je cena vacsia ako napr. 50% z TP, tak posunem na BE
{
if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Blue) == false) {Print("-----------------------------ERROR-OrderModify-OP_BUY-11---------------------------",""); Print("OP_BUY OrderModify - break_even_bodov: ",GetLastError()); Print("-----------------------------ERROR-OrderModify-OP_BUY-12---------------------------","");}
else { p_OrderTicket_BE = OrderTicket(); zapisLOG(IntegerToString(OrderTicket()), "OP_BUY OrderModify - break_even_procenta > 0, Bid = ", DoubleToString(Bid, Digits));}
}
}
if (OrderType() == OP_SELL)
{
if (Ask < ((((OrderTakeProfit() - OrderOpenPrice()) / 100) * break_even_procenta) + OrderOpenPrice()) && OrderStopLoss() > OrderOpenPrice()) // tu zistujem 50% zisku: ak je cena vacsia ako napr. 50% z TP, tak posunem na BE
{
if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red) == false) {Print("-----------------------------ERROR-OrderModify-OP_SELL-11---------------------------",""); Print("OP_SELL OrderModify - break_even_bodov: ",GetLastError()); Print("-----------------------------ERROR-OrderModify-OP_SELL-12---------------------------","");}
else { p_OrderTicket_BE = OrderTicket(); zapisLOG(IntegerToString(OrderTicket()), "OP_SELL OrderModify - break_even_procenta > 0, Ask = ", DoubleToString(Ask, Digits));}
}
}
}
if (PocitadloArray > 0 && p_OrderTicket_BE > 0)
{
// tu si zistim a zapisem k jednotlivym obchodom profit (zisk / strata)
for(i = 1; i <= PocitadloArray; i++)
{
if (TicketArray[i].ticket == p_OrderTicket_BE) TicketArray[i].BE = "X";
}
}
// http://www.forex-pro-zacatecniky.cz/news/programujeme-trailing-stop-v-mql4-dil-8-/
if (trailing_stop_bodov > 0) // posuvanie SL ak sa trh vyda nasim smerom
{
if(OrderType() == OP_BUY && Bid - OrderStopLoss() > trailing_stop_bodov * Point && Bid - OrderOpenPrice() > trailing_stop_bodov * Point)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - trailing_stop_bodov * Point, Digits), OrderTakeProfit(), 0, Blue) == false) {Print("-----------------------------ERROR-OrderModify-OP_BUY-11---------------------------",""); Print("OP_BUY OrderModify - trailing_stop_bodov: ",GetLastError()); Print("-----------------------------ERROR-OrderModify-OP_BUY-12---------------------------","");}
else zapisLOG(IntegerToString(OrderTicket()), "OP_BUY OrderModify - trailing_stop_bodov > 0, Bid = ", DoubleToString(Bid, Digits));
}
if(OrderType() == OP_SELL && OrderStopLoss() - Ask > trailing_stop_bodov * Point && OrderOpenPrice() - Ask > trailing_stop_bodov * Point)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + trailing_stop_bodov * Point, Digits), OrderTakeProfit(), 0, Red) == false) {Print("-----------------------------ERROR-OrderModify-OP_SELL-11---------------------------",""); Print("OP_SELL OrderModify - trailing_stop_bodov: ",GetLastError()); Print("-----------------------------ERROR-OrderModify-OP_SELL-12---------------------------","");}
else zapisLOG(IntegerToString(OrderTicket()), "OP_SELL OrderModify - trailing_stop_bodov > 0, Ask = ", DoubleToString(Ask, Digits));
}
}
}
}
// ** osefovanie : ZADANI POKYNU
//if (iVolume(Symbol(), Time_frame, 0) == 1 && (moze_zadat_prikaz_BUY == true || moze_zadat_prikaz_SELL == true))
// 7.12.17 som zacal pouzivat Bars() ... citace: Nemůžete v AOS cílit na konkrétní, jediný tick. Vystavujete se riziku, že AOS právě tento tick "přeskočí". Pokud chcete zjistit aktuální hodnotu indikátoru, nedávejte to do takto kontroverzní podmínky
// do promenne si uloz hodnotu Bars (pocet baru) a hlidej kdy se to zmeni, pak jen v tom pripade proved kod
if ((Bars_pocet != Bars(NULL, Time_frame)) && (moze_zadat_prikaz_BUY == true || moze_zadat_prikaz_SELL == true))// ak budem napr. na Time_frame = M15, tak nasledujuci kod mi prebehne kazdych 15 min !!! bacha nie pri kazdom ticku
{
Bars_pocet = Bars(NULL, Time_frame);
// ** FILTER VSTUPu
filter_vstup();
if (moze_zadat_prikaz_BUY == true) zadani_prikazu("OP_BUY");
if (moze_zadat_prikaz_SELL == true) zadani_prikazu("OP_SELL");
}
}
//+------------------------------------------------------------------+
//| Expert start function |
//+------------------------------------------------------------------+
int start()
{
return(0);
}
//+------------------------------------------------------------------+
//| FILTRE VSTUPU |
//+------------------------------------------------------------------+
double filter_vstup()
{
// VSTUPujeme za Bid lebo tato hodnota nam vykresluje sviecky, High Low, indikatory
// kedze vstupujeme za Bid, tak aj bude vystupovat
//ak v predoslych podmienkach zistim, ze je cena mimo range, tak dalsie testovanie na VSTUP je zbytocne
if (moze_zadat_prikaz_BUY == true || moze_zadat_prikaz_SELL == true)
{
// ** // kontrola ci mozny VSTUP na zaklade zadanych hodin + minut
if (TimeCurrent() < pasmo_VSTUP_OD || TimeCurrent() > pasmo_VSTUP_DO)
{
moze_zadat_prikaz_BUY = false;
moze_zadat_prikaz_SELL = false;
}
// ** //
if (NEobchodovat_prazdniny == true) // ci sa bude obchodovat cez prazdniny
{
if (TimeCurrent() > NEobchodovat_prazdniny_OD && TimeCurrent() < NEobchodovat_prazdniny_DO)
{
moze_zadat_prikaz_BUY = false;
moze_zadat_prikaz_SELL = false;
obchodovanie_cez_prazdniny_zrusene = true;
}
}
// ** // Den = den v týdnu (neděle=0 … pátek=5) ... obchodujem iba vybrane dny, napr. v pondeli ze sa zacinaju preberat z vikendu (slabe pohyby, mala volatilita) a ctvrtek, patek byvaju silne fundamenty (silne pohyby, velka volatilita)
if ((obchodovat_Pondeli == false && Den_v_tyzdni == 1) ||
(obchodovat_Uteri == false && Den_v_tyzdni == 2) ||
(obchodovat_Stredu == false && Den_v_tyzdni == 3) ||
(obchodovat_Ctvrtek == false && Den_v_tyzdni == 4) ||
(obchodovat_Patek == false && Den_v_tyzdni == 5) ||
Den_v_tyzdni == 6 || Den_v_tyzdni == 0)
{
moze_zadat_prikaz_BUY = false;
moze_zadat_prikaz_SELL = false;
}
// * * //
if (max_pocet_otvorenych_obchodov_v_danom_dni > 0)
{
p_count = 0;
for(i = OrdersTotal(); i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magic_number)
{
if (StrToTime((TimeToStr(OrderOpenTime(), TIME_DATE))) == StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))))
{
p_count = p_count + 1;
}
}
}
if (p_count >= max_pocet_otvorenych_obchodov_v_danom_dni)
{
moze_zadat_prikaz_BUY = false;
moze_zadat_prikaz_SELL = false; zapisLOG("", "jiz je : max_pocet_otvorenych_obchodov_v_danom_dni", "");
}
}
// ** // napr. vstup_rozestup_VSTUPov_bodov = 20, tak nasledujuci VSTUP od predosleho musi byt vzdialeny min 20 bodov
if (vstup_rozestup_VSTUPov_bodov > 0)
{
if (moze_zadat_prikaz_BUY == true || moze_zadat_prikaz_SELL == true)
{
if (OrdersTotal() > 0)
{
// tu si nacitam posledny otvoreny obchod
if (OrderSelect(OrdersTotal()-1, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magic_number)
{
if (OrderOpenPrice() > Bid)
{
if (((OrderOpenPrice() - Bid) / Point) < vstup_rozestup_VSTUPov_bodov)
{
if (OrderType() == OP_BUY) {moze_zadat_prikaz_BUY = false; zapisLOG("", "BUY vdalenost od predchoziho VSTUPu je < vstup_rozestup_VSTUPov_bodov", "");}
if (OrderType() == OP_SELL) {moze_zadat_prikaz_SELL = false; zapisLOG("", "SELL vdalenost od predchoziho VSTUPu je < vstup_rozestup_VSTUPov_bodov", "");}
}
}
else
{
if (((Bid - OrderOpenPrice()) / Point) < vstup_rozestup_VSTUPov_bodov)
{
if (OrderType() == OP_BUY) {moze_zadat_prikaz_BUY = false; zapisLOG("", "BUY vdalenost od predchoziho VSTUPu je < vstup_rozestup_VSTUPov_bodov", "");}
if (OrderType() == OP_SELL) {moze_zadat_prikaz_SELL = false; zapisLOG("", "SELL vdalenost od predchoziho VSTUPu je < vstup_rozestup_VSTUPov_bodov", "");}
}
}
}
}
}
}
// ** //
if (vstup_podla_BB == true)
{
if (moze_zadat_prikaz_BUY == true || moze_zadat_prikaz_SELL == true)
{
vstup_podla_BB_MAIN = iBands(NULL, Time_frame, vstup_podla_BB_perioda, vstup_podla_BB_odchylka, vstup_podla_BB_posun, PRICE_CLOSE, MODE_MAIN, 0);
vstup_podla_BB_UPPER = iBands(NULL, Time_frame, vstup_podla_BB_perioda, vstup_podla_BB_odchylka, vstup_podla_BB_posun, PRICE_CLOSE, MODE_UPPER, 0);
vstup_podla_BB_LOWER = iBands(NULL, Time_frame, vstup_podla_BB_perioda, vstup_podla_BB_odchylka, vstup_podla_BB_posun, PRICE_CLOSE, MODE_LOWER, 0);
}
// ** // Long: Bid < BB spodni pasmo (MODE_LOWER)
if (moze_zadat_prikaz_BUY == true)
{
if ((Bid < vstup_podla_BB_LOWER) == true)
{
// ak je napr. cena vo zdialenosti od strednej krivky (MAIN) vacsia ako 100 bodov a mensia ako 500 bodov, tak povolim VSTUP
if ((((vstup_podla_BB_MAIN - Bid) / Point) > vstup_podla_BB_MINvzdalenost_od_MAIN_bodov &&
((vstup_podla_BB_MAIN - Bid) / Point) < vstup_podla_BB_MAXvzdalenost_od_MAIN_bodov) == false)
{
moze_zadat_prikaz_BUY = false; zapisLOG("", "Long: Bid < BB spodni pasmo (MODE_LOWER) a vzdalenost od stredni krivky (MODE_MAIN) je ",DoubleToString((vstup_podla_BB_MAIN - Bid) / Point));
}
}
else
{
moze_zadat_prikaz_BUY = false;
}
}
// ** // Short: Bid > BB horni pasmo (MODE_UPPER)
if (moze_zadat_prikaz_SELL == true)
{
if ((Bid > vstup_podla_BB_UPPER) == true)
{
// ak je napr. cena vo zdialenosti od strednej krivky (MAIN) vacsia ako 100 bodov a mensia ako 500 bodov, tak povolim VSTUP
if ((((Bid - vstup_podla_BB_MAIN) / Point) > vstup_podla_BB_MINvzdalenost_od_MAIN_bodov &&
((Bid - vstup_podla_BB_MAIN) / Point) < vstup_podla_BB_MAXvzdalenost_od_MAIN_bodov) == false)
{
moze_zadat_prikaz_SELL = false; zapisLOG("", "Short: Bid > BB horni pasmo (MODE_UPPER) a vzdalenost od stredni krivky (MODE_MAIN) je ",DoubleToString((Bid - vstup_podla_BB_MAIN) / Point));
}
}
else
{
moze_zadat_prikaz_SELL = false;
}
}
}
if (vstup_podla_PSAR == true) // !!! funkce iSAR mi nespravne vracia hodnotu na aktualnej sviecke !!! asi by som to moc nepouzival
{
if (moze_zadat_prikaz_BUY == true || moze_zadat_prikaz_SELL == true)
{
vstup_podla_PSAR_0 = iSAR(NULL, Time_frame, vstup_podla_PSAR_krok, vstup_podla_PSAR_maximum, 1);
vstup_podla_PSAR_1 = iSAR(NULL, Time_frame, vstup_podla_PSAR_krok, vstup_podla_PSAR_maximum, 2);
/*zapisLOG("", "vstup_podla_PSAR_1",DoubleToString(vstup_podla_PSAR_1));
zapisLOG("", "vstup_podla_PSAR_0",DoubleToString(vstup_podla_PSAR_0));*/
}
if (moze_zadat_prikaz_BUY == true)
{
// Long: Bid > PSAR 0 a PSAR 0 < PSAR 1
//zapisLOG("", "Long: Bid > PSAR 0 a PSAR 0 < PSAR 1 ... Bid = ",DoubleToString(Bid));
if ((Bid > vstup_podla_PSAR_0 && vstup_podla_PSAR_0 < vstup_podla_PSAR_1) == true)
{
createObject("Bid_BB", OBJ_TEXT, clrBlack, TimeCurrent(), Bid, NULL, NULL, "Long: "+TimeToStr(TimeCurrent(), TIME_MINUTES));
}
else
{
moze_zadat_prikaz_BUY = false; zapisLOG("", "Long: Bid > PSAR 0 a PSAR 0 < PSAR 1","false");
}
}
if (moze_zadat_prikaz_SELL == true)
{
// Short: Bid < PSAR 0 a PSAR 0 > PSAR 1
//zapisLOG("", "Short: Bid < PSAR 0 a PSAR 0 > PSAR 1 ... Bid = ",DoubleToString(Bid));
if ((Bid < vstup_podla_PSAR_0 && vstup_podla_PSAR_0 > vstup_podla_PSAR_1) == true)
{
createObject("Bid_BB", OBJ_TEXT, clrBlack, TimeCurrent(), Bid, NULL, NULL, "Short : "+TimeToStr(TimeCurrent(), TIME_MINUTES));
}
else
{
moze_zadat_prikaz_SELL = false; zapisLOG("", "Short: Bid < PSAR 0 a PSAR 0 > PSAR 1","false");
}
}
}
// ** // konec funkce : filter_vstup()
//Print("moze_zadat_prikaz_BUY = ",moze_zadat_prikaz_BUY);
//Print("moze_zadat_prikaz_SELL = ",moze_zadat_prikaz_SELL);
}
return(0);
}
//+------------------------------------------------------------------+
//| FILTRE VYSTUP |
//+------------------------------------------------------------------+
double filter_vystup()
{
// VSTUPujeme za Bid lebo tato hodnota nam vykresluje sviecky, High Low, indikatory
// kedze vstupujeme za Bid, tak aj bude vystupovat
if (vystup_podla_EMA == true) // ak sa cena dotkne bo prekrizi EMA, tak obchod zatvaram
{
if (vystup_podla_EMA_max_zisk_v_bodoch > 0) // napr. pokial bol zisk len do 100 bodov, tak pri dotyku EMA vystupujem, zrejma nedojde k pohybu, ktory ocakavam
{
if (vystup_podla_EMA_max_zisk_BUY >= 0 && vystup_podla_EMA_OP_ticket_BUY > 0)
{
// tu sa zapisuje max. dosiahnuta cena predchadzajucej sviecky pro obchod BUY
if (OrderType() == OP_BUY && OrderTicket() == vystup_podla_EMA_OP_ticket_BUY && vystup_podla_EMA_max_zisk_BUY < Bid) vystup_podla_EMA_max_zisk_BUY = Bid;
// mal by som tu osefovat posledny otvoreny obchod ... preto v podmienke OrderTicket() == vystup_podla_EMA_OP_ticket_BUY
if (OrderType() == OP_BUY && OrderTicket() == vystup_podla_EMA_OP_ticket_BUY && Bid < NormalizeDouble(iMA(NULL, Time_frame, vystup_podla_EMA_perioda, 0, MODE_EMA, vystup_podla_EMA_sviecky, 0), 5))
{
if ((vystup_podla_EMA_max_zisk_BUY - OrderOpenPrice()) <= (vystup_podla_EMA_max_zisk_v_bodoch * Point))
{
barva_prikazu = Magenta;
ukonci_obchod_BUY = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(BYU)-vystup_podla_EMA == true : napr.zisk bol 100 bodov, pri dotyku EMA vystupujem", DoubleToString(vystup_podla_EMA_max_zisk_BUY));
}
// stalo sa to, ze ked cena presla prvy krat cez EMA, tak zisk bol vacsi ako sme mali nastavene v vystup_podla_EMA_max_zisk_v_bodoch
// a ked presla podruhy krat, tak mi obchod zavrelo ... mna zaujima iba prvotny pohyb hned po otvoreni obchodu
else vystup_podla_EMA_max_zisk_BUY = -1;
}
}
if (vystup_podla_EMA_max_zisk_SELL >= 0 && vystup_podla_EMA_OP_ticket_SELL > 0)
{
if (OrderType() == OP_SELL && OrderTicket() == vystup_podla_EMA_OP_ticket_SELL && (vystup_podla_EMA_max_zisk_SELL > Bid || vystup_podla_EMA_max_zisk_SELL == 0)) vystup_podla_EMA_max_zisk_SELL = Bid;
if (OrderType() == OP_SELL && OrderTicket() == vystup_podla_EMA_OP_ticket_SELL && Bid > NormalizeDouble(iMA(NULL, Time_frame, vystup_podla_EMA_perioda, 0, MODE_EMA, vystup_podla_EMA_sviecky, 0), 5))
{
if ((OrderOpenPrice() - vystup_podla_EMA_max_zisk_SELL) <= (vystup_podla_EMA_max_zisk_v_bodoch * Point))
{
barva_prikazu = Magenta;
ukonci_obchod_SELL = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(SELL)-vystup_podla_EMA == true : napr.zisk bol 100 bodov, pri dotyku EMA vystupujeme", DoubleToString(vystup_podla_EMA_max_zisk_SELL));
}
else vystup_podla_EMA_max_zisk_SELL = -1; //
}
}
}
else // tu je robeny vystup na zaklade toho, ze cena protla EMA
{
barva_prikazu = DeepPink;
// kedze robime navrat, tak zavreme ked cena prejde cez EMA zo SPODU na HOR
if (OrderType() == OP_BUY && Bid > NormalizeDouble(iMA(NULL, Time_frame, vystup_podla_EMA_perioda, 0, MODE_EMA, vystup_podla_EMA_sviecky, 0), 5))
{ukonci_obchod_BUY = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(BUY)-vystup_podla_EMA- Bid > iMA == true : cena Bid protla EMA, Bid = ", DoubleToString(Bid)+" > "+DoubleToString(iMA(NULL, Time_frame, vystup_podla_EMA_perioda, 0, MODE_EMA, vystup_podla_EMA_sviecky, 0)));}
// kedze robime navrat, tak zavreme ked cena prejde cez EMA z VRCHU na DOL
if (OrderType() == OP_SELL && Bid < NormalizeDouble(iMA(NULL, Time_frame, vystup_podla_EMA_perioda, 0, MODE_EMA, vystup_podla_EMA_sviecky, 0), 5))
{ukonci_obchod_SELL = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(SELL)-vystup_podla_EMA- Bid < iMA == true : cena Bid protla EMA, Bid = ", DoubleToString(Bid)+" < "+DoubleToString(iMA(NULL, Time_frame, vystup_podla_EMA_perioda, 0, MODE_EMA, vystup_podla_EMA_sviecky, 0)));}
}
}
// * * // kedze mam pasmo VSTUPu od 16:00 do 20:00, tak ked tak budem zatvarat az na konci nasledujuceho dena
// 2017 na EURUSD to moc uspechu neprinieslo
if (uzavrit_obchod_na_konci_nasledujiciho_dne == true)
{
// v patek zaviera 22:00 a ostatne dny 24:00
if (Den_v_tyzdni == 5) {
if ((StrToTime(TimeToStr((OrderOpenTime() + 86400), TIME_DATE)) == StrToTime((TimeToStr(TimeCurrent(), TIME_DATE)))) &&
(TimeCurrent() >= StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" 21:30")))
{
if (OrderType() == OP_BUY) {ukonci_obchod_BUY = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(BUY) - uzavrit_obchod_na_konci_nasledujiciho_dne == true", "");}
if (OrderType() == OP_SELL) {ukonci_obchod_SELL = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(SELL) - uzavrit_obchod_na_konci_nasledujiciho_dne == true", "");}
}
}
else {
if ((StrToTime(TimeToStr((OrderOpenTime() + 86400), TIME_DATE)) == StrToTime((TimeToStr(TimeCurrent(), TIME_DATE)))) &&
(TimeCurrent() >= StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" 24:40")))
{
if (OrderType() == OP_BUY) {ukonci_obchod_BUY = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(BUY) - uzavrit_obchod_na_konci_nasledujiciho_dne == true", "");}
if (OrderType() == OP_SELL) {ukonci_obchod_SELL = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(SELL) - uzavrit_obchod_na_konci_nasledujiciho_dne == true", "");}
}
}
// v patek zaviera 21:00 a ostatne dny 22:00
if (Symbol() == "GOLDs.") {
//if ((OrderOpenTime() + 86400) <= StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" 20:30"))
if ((StrToTime(TimeToStr((OrderOpenTime() + 86400), TIME_DATE)) == StrToTime((TimeToStr(TimeCurrent(), TIME_DATE)))) &&
(TimeCurrent() >= StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" 20:30")))
{
if (OrderType() == OP_BUY) {ukonci_obchod_BUY = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(BUY) - uzavrit_obchod_na_konci_nasledujiciho_dne == true", "");}
if (OrderType() == OP_SELL) {ukonci_obchod_SELL = true; zapisLOG(IntegerToString(OrderTicket()), "OrderClose(SELL) - uzavrit_obchod_na_konci_nasledujiciho_dne == true", "");}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| VYPOCET HODNOT PRO ZADANI CEKAJICICH PRIKAZU |
//+------------------------------------------------------------------+
void vypocet_OrderSend_hodnot(string p_BUY_SELL, string p_free)
{
// http://www.forex-pro-zacatecniky.cz/news/zadani-pokynu-typu-stop-a-limit-dil-9-/
// na strankach este pricital k VSTUPnej cene 2 pips, aby nevstupoval hned na maxime pasma, cize HIGH + 2*Point
// k cene VSTUPu by sme mali este pricitat Spread = MarketInfo(Symbol(),MODE_SPREAD) * Point
// potom by bola cena na vstup pre BUY = HIGH + 2*Point + Spread
OrderSend_StopLoss = 0;
OrderSend_TakeProfit = 0;
OrderSend_Price = 0;
OrderSend_Volume = velikost_pozice; // !!! BACHA !!! napr. pri EURGBP musi byt velkost pozice min. 0.1 lotu
OrderSend_Expirace = expirace_hod;
//if (OrderSend_Expirace == 0) OrderSend_Expirace = ((((StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" "+IntegerToString(vstup_do_hod)+":"+IntegerToString(vstup_do_min)+":00")) - StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" "+IntegerToString(vstup_od_hod)+":"+IntegerToString(vstup_od_min)+":00"))) / 3600);
if (OrderSend_Expirace == 0) OrderSend_Expirace = ((pasmo_VSTUP_DO - pasmo_VSTUP_OD) / 3600);
//if (OrderSend_Expirace > 0) OrderSend_Expirace = (StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))+" "+IntegerToString(vstup_od_hod)+":"+IntegerToString(vstup_od_min)+":00")) + (OrderSend_Expirace * 3600);
if (OrderSend_Expirace > 0) OrderSend_Expirace = pasmo_VSTUP_OD + (OrderSend_Expirace * 3600);
if (koeficient_navysovani_pozic > 0)
{
if (OrdersTotal() > 0)
{
// tu si nacitam posledny otvoreny obchod
if (OrderSelect(OrdersTotal()-1, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magic_number)
{
// koeficien bude pouzity len ak v danom dni bol otvoreny predosly obchod, podmienka je tu, aby mi nebralo do uvahy obchody otvorene v predoslych dnoch
if (StrToTime((TimeToStr(OrderOpenTime(), TIME_DATE))) == StrToTime((TimeToStr(TimeCurrent(), TIME_DATE))))
{
OrderSend_Volume = OrderLots() * koeficient_navysovani_pozic; zapisLOG("", "OrderSend_Volume = ",DoubleToString(OrderSend_Volume));
}
}
}
}
// ked som to nemal prevedene, tak mi to hazelo chybu : OrderSend Error 4107 .... invalid price 1.39103000 for OrderSend function
// If your Forex broker uses 4 digits after the dot in quotes and you are trying to use 5 digits in your orders, then you’ll be getting error 4107 during backtesting. The best solution here is to always normalize all the price doubles using the standard MetaTrader function before passing them to OrderSend():
OrderSend_Price = NormalizeDouble(OrderSend_Price, Digits);
OrderSend_StopLoss = NormalizeDouble(OrderSend_StopLoss, Digits);
OrderSend_TakeProfit = NormalizeDouble(OrderSend_TakeProfit, Digits);
if (p_free == "zadani_prikazu")
{
if (p_BUY_SELL == "BUY")
{
zapisLOG("", "TakeProfit",DoubleToString((OrderSend_TakeProfit - OrderSend_Price)/Point));
zapisLOG("", "StopLoss",DoubleToString((OrderSend_Price - OrderSend_StopLoss)/Point));
}
if (p_BUY_SELL == "SELL")
{
zapisLOG("", "TakeProfit",DoubleToString((OrderSend_Price - OrderSend_TakeProfit)/Point));
zapisLOG("", "StopLoss",DoubleToString((OrderSend_StopLoss - OrderSend_Price)/Point));
}
}
}
//+------------------------------------------------------------------+
//| ZADANI PRIKAZU |
//+------------------------------------------------------------------+
void zadani_prikazu(string p_typ_prikazu)
{
// p_typ_prikazu: CMD : napr. OP_BUY je cakajuci prikaz, OP_BUY za Market cenu
// U long příkazu vstupujeme za Ask a tedy vystupujeme za Bid cenu !!! u short zase opacne vstup za Bid, vystup za Ask
if (p_typ_prikazu == "OP_BUY")
{
vypocet_OrderSend_hodnot("BUY", "zadani_prikazu");
OP_ticket_BUY = OrderSend(Symbol(), // SYMBOL : definuje menovy par/index cize instrument, na ktorom obchodujeme
OP_BUY, // CMD : typ prikazu: napr. OP_BUYSTOP je cakajuci prikaz, OP_BUY za Market cenu
OrderSend_Volume, // VOLUME : velkost pozice: napr. 0.01 lotu
Ask, // PRICE : cena, za ktoru budeme nakupovat ... Pokud chceme vstoupit za MARKET (OP_BUY / OP_SELL) volíme buď cenu Ask (pro buy/long) a nebo Bid (pro sell/short).
10, // SLIPPAGE : max. pozadovana odchylka pri exekuci prikazu ... ASI v BODOCH ??? treba zistit
OrderSend_StopLoss, // STOPLOSS :
OrderSend_TakeProfit, // TAKEPROFIT : Pokud nechceme stanovit žádný PT, můžeme doplnit pouze 0.
IntegerToString(magic_number)+" - OP_BUY", // COMMENT :
magic_number, // MAGIC : identifikacne cislo strategie
OrderSend_Expirace, // EXPIRATION : platnost prikazu
Blue); // ARROW_COLOR : barva prikazu
zapisLOG(IntegerToString(OP_ticket_BUY), "OP_BUY", DoubleToString(Ask));
// http://www.forex-pro-zacatecniky.cz/news/errory-pri-pouzivani-ea-dil-12-/
if (OP_ticket_BUY > 0)
{
// na kontrolu ci uz bol v dany den zadany prikaz, ak ano, tak dalsi uz v danom dni nezadavam
Den_zadania_prikazu_BUY = DayOfYear(); // (1 means 1 January,..,365(6) does 31 December)
vystup_podla_EMA_OP_ticket_BUY = OP_ticket_BUY; // aby mi to neosefovalo obchod, ktory presiel do druheho dna
PocitadloArray = PocitadloArray + 1;
TicketArray[PocitadloArray].ticket = OP_ticket_BUY;
TicketArray[PocitadloArray].price = 0;
}
else
{err=GetLastError();
Print("-----------------------------ERROR-OP_BUY-11---------------------------","");
Print("Send error OP_BUY(",err,")_",""); Print("Ask = ",Ask); Print("OrderSend_Volume = ",OrderSend_Volume); Print("OrderSend_Price = ",OrderSend_Price); Print("OrderSend_StopLoss = ",OrderSend_StopLoss); Print("OrderSend_TakeProfit = ",OrderSend_TakeProfit); Print("OrderSend_Expirace = ",OrderSend_Expirace);
Print("-----------------------------ERROR-OP_BUY-12---------------------------","");
}
}
if (p_typ_prikazu == "OP_SELL")
{
vypocet_OrderSend_hodnot("SELL", "zadani_prikazu");
OP_ticket_SELL = OrderSend(Symbol(),
OP_SELL,
OrderSend_Volume,
Bid,
10,
OrderSend_StopLoss,
OrderSend_TakeProfit,
IntegerToString(magic_number)+" - OP_SELL",
magic_number,
OrderSend_Expirace,
Red);
zapisLOG(IntegerToString(OP_ticket_SELL), "OP_SELL", DoubleToString(Bid));
// http://www.forex-pro-zacatecniky.cz/news/errory-pri-pouzivani-ea-dil-12-/
if (OP_ticket_SELL > 0)
{
// na kontrolu ci uz bol v dany den zadany prikaz, ak ano, tak dalsi uz v danom dni nezadavam
Den_zadania_prikazu_SELL = DayOfYear(); // (1 means 1 January,..,365(6) does 31 December)
vystup_podla_EMA_OP_ticket_SELL = OP_ticket_SELL; // aby mi to neosefovalo obchod, ktory presiel do druheho dna
PocitadloArray = PocitadloArray + 1;
TicketArray[PocitadloArray].ticket = OP_ticket_SELL;
TicketArray[PocitadloArray].price = 0;
}
else
{err=GetLastError();
Print("-----------------------------ERROR-OP_SELL-11---------------------------","");
Print("Send error OP_SELL(",err,")_",""); Print("Bid = ",Bid); Print("OrderSend_Volume = ",OrderSend_Volume); Print("OrderSend_Price = ",OrderSend_Price); Print("OrderSend_StopLoss = ",OrderSend_StopLoss); Print("OrderSend_TakeProfit = ",OrderSend_TakeProfit); Print("OrderSend_Expirace = ",OrderSend_Expirace);
Print("-----------------------------ERROR-OP_SELL-12---------------------------","");
}
}
}
//+------------------------------------------------------------------+
//| VYKRESLENIE dacoho do grafu |
//+------------------------------------------------------------------+
void createObject(string object_name, int object_typ, color object_color, datetime object_cas1, double object_cena1, datetime object_cas2, double object_cena2, string object_text)
{
string p_object_name = "";
bool object_created = false;
//Print("-----------------------------object_typ---------------------------",object_typ);
// object_typ = OBJ_RECTANGLE = 16
// object_typ = OBJ_TREND = 2
// object_typ = OBJ_TEXT = 21
if (object_typ == 16) p_object_name = object_name+"-RECTANGLE-"+IntegerToString(MathRand());
else if (object_typ == 2) p_object_name = object_name+"-TREND-"+IntegerToString(MathRand());
else if (object_typ == 21) p_object_name = object_name+"-TEXT-"+IntegerToString(MathRand());
else p_object_name = object_name+"-"+IntegerToString(MathRand());
if(ObjectFind(p_object_name) <= 0) // kontrola, zda objekt neexistuje
{
if (object_typ == 16) object_created = ObjectCreate(0, p_object_name, OBJ_RECTANGLE, 0, object_cas1, object_cena1, object_cas2, object_cena2);
else if (object_typ == 2) object_created = ObjectCreate(0, p_object_name, OBJ_TREND, 0, object_cas1, object_cena1, object_cas2, object_cena1);
else if (object_typ == 21) object_created = ObjectCreate(0, p_object_name, OBJ_TEXT, 0, object_cas1, object_cena1);
if(object_created == true)
{
/*
if (object_name == "BUY-VSTUP-TP")
{
Print("-----------------------------ObjectCreate---------------------------",p_object_name);
Print("-----------------------------ObjectCreate-object_cena2--------------------------",object_cena2);
Print("-----------------------------ObjectCreate-object_cas2--------------------------",object_cas2);
Print("-----------------------------ObjectCreate-object_cena1--------------------------",object_cena1);
Print("-----------------------------ObjectCreate-object_cas1--------------------------",object_cas1);
}*/
ObjectSet(p_object_name, OBJPROP_COLOR, object_color);
ObjectSet(p_object_name, OBJPROP_TIMEFRAMES, OBJ_PERIOD_M1|OBJ_PERIOD_M5|OBJ_PERIOD_M15|OBJ_PERIOD_M30|OBJ_PERIOD_H1|OBJ_PERIOD_H4|OBJ_PERIOD_D1);
if (object_typ == 21)
{
ObjectSetText(p_object_name, object_text, 0, NULL, object_color);
ObjectSetDouble(0, p_object_name, OBJPROP_ANGLE, 90);
}
if (object_typ == 2)
{
ObjectSetInteger(0, p_object_name, OBJPROP_RAY_RIGHT, false);
}
}
}
}
//+---------------------------------------------------------------------+
//| jednotny zapis do DENNIKu ... usnadni pracu napr. s excelom, DB atd.|
//+---------------------------------------------------------------------+
void zapisLOG(string ticket_do_LOGu, string text_do_LOGu, string hodnota_do_LOGu)
{
Print("#"+IntegerToString(magic_number)+"#"+ticket_do_LOGu+"#----------------#"+text_do_LOGu+"#---------------------------#",hodnota_do_LOGu);
}
//+------------------------------------------------------------------+
//| PrintParametre function |
//+------------------------------------------------------------------+
double PrintParametre(string odkud_se_vola)
{
//PrintFormat("Bars = %d, i = %d",Bars,i);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------Time_frame--------------------------",Time_frame);
if (vstup_do_hod > 0 || vstup_do_min > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_do_hod-vstup_do_min-------------------------",TimeToString(pasmo_VSTUP_DO, TIME_MINUTES));
if (vstup_od_hod > 0 || vstup_od_min > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_od_hod-vstup_od_min-------------------------",TimeToString(pasmo_VSTUP_OD, TIME_MINUTES));
if (velikost_pozice > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------velikost_pozice--------------------------",velikost_pozice);
if (expirace_hod > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------expirace_hod--------------------------",expirace_hod); // ked som mal takto pomenovanu premennu "platnost_prikazu_hod", tak sa mi niekde nulovala
if (vstup_rozestup_VSTUPov_bodov > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_rozestup_VSTUPov_bodov--------------------------",vstup_rozestup_VSTUPov_bodov);
if (koeficient_navysovani_pozic > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------koeficient_navysovani_pozic--------------------------",koeficient_navysovani_pozic);
if (max_pocet_otvorenych_obchodov_v_danom_dni > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------max_pocet_otvorenych_obchodov_v_danom_dni--------------------------",max_pocet_otvorenych_obchodov_v_danom_dni);
if (vstup_podla_PSAR == true)
{
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_PSAR_maximum--------------------------",vstup_podla_PSAR_maximum);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_PSAR_krok--------------------------",vstup_podla_PSAR_krok);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_PSAR--------------------------",vstup_podla_PSAR);
}
if (vstup_podla_BB == true)
{
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_BB_MINvzdalenost_od_MAIN_bodov--------------------------",vstup_podla_BB_MINvzdalenost_od_MAIN_bodov);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_BB_MAXvzdalenost_od_MAIN_bodov--------------------------",vstup_podla_BB_MAXvzdalenost_od_MAIN_bodov);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_BB_posun--------------------------",vstup_podla_BB_posun);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_BB_odchylka--------------------------",vstup_podla_BB_odchylka);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_BB_perioda--------------------------",vstup_podla_BB_perioda);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vstup_podla_BB--------------------------",vstup_podla_BB);
}
if (trailing_stop_bodov > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------trailing_stop_bodov--------------------------",trailing_stop_bodov); // posuvanie SL ak sa trh vyda nasim smerom
if (break_even_bodov > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------break_even_bodov--------------------------",break_even_bodov); // posunutie SL na VSTUP ak cena dosiahne nap. 10 pips zisku
if (break_even_procenta > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------break_even_procenta--------------------------",break_even_procenta); // posunutie SL na VSTUP ak cena dosiahne napr. 50% z TP alebo co ja viem...
if (uzavrit_obchod_hod > 0 || uzavrit_obchod_min > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------uzavrit_obchod_hod-uzavrit_obchod_min-------------------------",IntegerToString(uzavrit_obchod_hod)+":"+IntegerToString(uzavrit_obchod_min));
if (uzavrit_obchod_na_konci_dne == true) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------uzavrit_obchod_na_konci_dne--------------------------",uzavrit_obchod_na_konci_dne); //
if (uzavrit_obchod_na_konci_nasledujiciho_dne == true) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------uzavrit_obchod_na_konci_nasledujiciho_dne--------------------------",uzavrit_obchod_na_konci_nasledujiciho_dne); //
if (vystup_podla_EMA == true)
{
if (vystup_podla_EMA_max_zisk_v_bodoch > 0) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vystup_podla_EMA_max_zisk_v_bodoch--------------------------",vystup_podla_EMA_max_zisk_v_bodoch); // napr. pokial bol zisk len do 100 bodov, tak pri dotyku EMA vystupujem, zrejma nedojde k pohybu, ktory ocakavam
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vystup_podla_EMA_sviecky--------------------------",vystup_podla_EMA_sviecky);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vystup_podla_EMA_perioda--------------------------",vystup_podla_EMA_perioda);
Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------vystup_podla_EMA--------------------------",vystup_podla_EMA); // ak sa cena dotkne bo prekrizi EMA, tak obchod zatvaram, napr. sa to bude dat pouzit ak by som obchodoval bez SL
}
// obchodujem iba vybrane dny, napr. v pondeli ze sa zacinaju preberat z vikendu (slabe pohyby, mala volatilita) a ctvrtek, patek byvaju silne fundamenty (silne pohyby, velka volatilita)
if (obchodovat_Pondeli == false) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------obchodovat_Pondeli--------------------------",obchodovat_Pondeli);
if (obchodovat_Uteri == false) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------obchodovat_Uteri--------------------------",obchodovat_Uteri);
if (obchodovat_Stredu == false) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------obchodovat_Stredu--------------------------",obchodovat_Stredu);
if (obchodovat_Ctvrtek == false) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------obchodovat_Ctvrtek--------------------------",obchodovat_Ctvrtek);
if (obchodovat_Patek == false) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------obchodovat_Patek--------------------------",obchodovat_Patek);
if (NEobchodovat_prazdniny == true) Print("#"+IntegerToString(magic_number)+"#"+"--------------------"+odkud_se_vola+"---------NEobchodovat_prazdniny--------------------------",NEobchodovat_prazdniny); // ci sa bude obchodovat cez prazdniny
return(0);
}
OK, tak to posilam sem