9. MQL4 - Moje první strategie (1/2)

Napsal:   Sekce: MQL4

V tomto díle si společně napíšeme vlastní strategii. Začneme nejprve vytvořením knihovny s pomocnými funkcemi pro obchodování.

 

TradeLib - Knihovna pro práci s pokyny

Ještě než začneme psát hlavní část strategie, napíšeme si pomocnou knihovnu obecných funkcí pro práci s pokyny, kterou můžeme kdykoli použít při vývoji dalších strategií. Kompletní souboru je ke stažení na konci kapitoly. Pro ty, co si jej chtějí vytvořit sami, následuje postup.

 

1.     Vytvoření souboru

Začneme vytvořením Include skriptu. V MetaEditoru založte nový skript kliknutím v menu na File -> New, nebo klávesovou zkratkou Ctrl+N a v průvodci vyberte položku Include (*.MQH). Include soubory jsou sady funkcí, které lze připojit k jiným skriptům.

[obrázek]

Klikněte na tlačítko Další a v dialogu vyplňte jméno skriptu TradeLib.

[obrázek]

Veškeré komentáře, které průvodce vygeneroval, můžete smazat a ponechat kód ve stavu, jaký zobrazuje obrázek.

[obrázek]

 

2.     Funkce IsTicketOpen()

Tato funkce zjistí, zda je konkrétní pokyn ještě otevřen, nebo ne. Může se stát, že se pokyn zavře překročením ceny StopLoss nebo TakeProfit, případně pokyn zavře broker. Potom je třeba vědět, zda lze s pokynem ještě něco vykonávat v rámci obchodu.

// Zjistí, zda je pokyn otevřený
// ticketId = identifikátor pokynu
bool IsTicketOpen(int ticketId)
{
   if(OrderSelect(ticketId, SELECT_BY_TICKET))
   {
      return(OrderCloseTime() == 0);
   }
   else
   {
      return(false);
   }  
}

Funkce přejímá jeden parametr a to ID pokynu a vrací True , pokud je pokyn otevřen, jinak False. Tělo funkce se skládá z podmínky, kde pomocí funkce OrderSelect() vybereme konkrétní pokyn dle jeho ID. Pokud funkce proběhne v pořádku, zjistíme pomocí funkce OrderCloseTime(), zda je datum zavření pokynu nastaveno nebo ne. Pokud není, pokyn je ještě otevřen.

 

3.     Funkce OpenTicket()

Tato metoda provede otevření pokynu a vrátí jeho ID. Metoda uvažuje pouze přímé pokyny. Pokud potřebujete otevřít čekající pokyn, je třeba si do knihovny napsat svou vlastní podporu.

// Otevře nový pokyn
// symbol = identifikace měnového páru
// isBuy = pokud je True, nakupuje se, jinak se prodává
// lots = počet lotů, které se má obchodovat
// slPips = počet pipů pro nastavení ceny stoploss
// tpPips = počet pipů pro nastavení ceny takeprofit
int OpenTicket(string symbol, bool isBuy, double lots, int slPips, int tpPips)
{
   double price;  // preferovaná cena
   int op;        // typ operace
   // cena stoplossu
   double slPrice = getPipPrice(symbol, slPips, isBuy, true);
   // cena takeprofitu
   double tpPrice = getPipPrice(symbol, tpPips, isBuy, false);
   
   // nastavíme preferovanou cenu a typ operace
   if(isBuy)
   {
      price = MarketInfo(symbol, MODE_ASK);
      op = OP_BUY;
   }
   else
   {
      price = MarketInfo(symbol, MODE_BID);
      op = OP_SELL;
   }
   
   int ticketId = OrderSend(symbol, op, lots, price, 0, slPrice, tpPrice, NULL, 0, 0, CLR_NONE);
   
   // pokud se pokyn nepodaří otevřít, vypíšeme číslo chyby do logu
   if(ticketId == -1)
   {
      Print("Otevírání pokynu: Chyba č. ", GetLastError());
   }
   
   return(ticketId);
}

Nejdříve si nadeklarujeme pár proměnných jako je preferovaná cena a typ operace. Pak stanovíme cenu pro stoploss a takeprofit. K tomu použijeme pomocnou funkci getPipPrice(), kterou si popíšeme později. Dále nastavíme cenu a typ operace. V kódu se pro vás objevuje nová funkce MarketInfo(). Tato funkce zjišťuje informace o cenách a vrací stejné informace jako předdefinované proměnné (Ask, Bid, Digits, atd.). Ale protože píšeme obecnou funkci, nemůžeme se spoléhat na to, že jiný skript bude uvažovat stejný měnový pár, jaký by vrátila funkce Symbol(). Proto naše funkce vyžaduje zadat, pro jaký měnový pár se daná operace má vykonat a pomocí funkce MarketInfo() si již zjistíme, co potřebujeme. Po nastavení správných cen, již zavoláme funkce pro otevření pokynu OrderSend(). Pokud se nepodaří otevřít pokyn, zalogujeme chybu, pro případné pozdější zkoumání.

 

4.     Pomocná funkce getPipPrice()

Tato funkce spočítá cenu StopLoss a TakeProfit na základě počtu bodů, které uživatel zadal.

// Vrátí cenu pro daný počet pipů vůči aktuální ceně
// symbol = identifikace měnového páru
// pips = počet pipů
// isBuy = určuje, zda se jedná o nákup
// isSL = určuje, zda se jedná o SL, jinak je to TP
double getPipPrice(string symbol, int pips, bool isBuy, bool isSL)
{
   double price;        // obchodní cena
   double result = 0;   // výsledná hodnota
   
   if(pips > 0)
   {
      // funkce defaultně počítá cenu pro SL
      // pokud se jedná o TP, otočíme znaménko pro výpočet
      if(isSL == false)
         pips = pips * (-1);
         
      if(isBuy)
      {
         price = MarketInfo(symbol, MODE_ASK);
         result = NormalizeDouble(price - pips * MarketInfo(symbol, MODE_POINT), 
MarketInfo(symbol, MODE_DIGITS));    
      }
      else
      {
         price = MarketInfo(symbol, MODE_BID);
         result = NormalizeDouble(price + pips * MarketInfo(symbol, MODE_POINT), 
MarketInfo(symbol, MODE_DIGITS));
      }
   }

   return(result);   
}

Pomocí funkce MarketInfo() si zjistíme potřebné hodnoty a pak dle vzorce vypočítáme cenu na základě předaných parametrů.

 

5.     Funkce CloseTicket()

Když už máme otevřený pokyn, je třeba napsat funkci, která jej také zavře. Funkce zavírá celý objem obchodu. Pokud potřebujete částečné zavírání pokynu, je třeba si funkci upravit nebo napsat novou.

// Pokusí se zavřít pokyn. Vrací 0, pokud je vše v pořádku, jinak vrací číslo chyby
// ticketId = identifikace pokynu
int CloseTicket(int ticketId)
{
   if(IsTicketOpen(ticketId))
   {
      double price;  // preferovaná cena zavření
     
      // nastavíme preferovanou cenu dle typu operace
      if(OrderType() == OP_BUY)
         price = MarketInfo(OrderSymbol(), MODE_BID);
      else
         price = MarketInfo(OrderSymbol(), MODE_ASK);
         
      if(OrderClose(ticketId, OrderLots(), price, 0, CLR_NONE))
      {
         return(0);
      }
      else
      {
         // chyba při zavírání
         Print("Zavírání pokynu: Pokyn č. ", ticketId, " se nepodařilo zavřít. Chyba č. ", 
GetLastError());
         return(2);
      }
   }
   else
   {
      // Pokyn je již zavřen nebo nebyl nalezen
      Print("Zavírání pokynu: Pokyn č. ", ticketId, " již nelze zavřít");
      return(1);
   }
}

Nejdříve zjistíme, zda je pokyn otevřen. K tomu se nám hodí funkce IsTicketOpen(), která zároveň provede výběr pokynu. Pokud je pokyn otevřen, zjistíme typ operace, nastavíme cenu a pomocí funkce OrderClose() pokyn zavřeme. V případě, že operace neproběhne v pořádku, zapíšem chybu do logu.


6.     Funkce IsTimeToTrade()

Tato funkce zjistí, zda je čas pro otevírání pokynů. V parametrech přejímá kritéria času v jednom rozptylu. Funkci lze např. napsat, tak, aby kontrolovala sérií časových rozmezí, ale pro náš příklad bohatě postačí.

// Určuje, zda je čas pro obchodování
// startHour = hodina pro zahájení obchodování
// startMinute = minuta pro zahájení obchodování
// stopHour = hodina pro ukončení obchodávní
// stopMinute = minuta pro ukončení obchodování
bool IsTimeToTrade(int startHour, int startMinute, int stopHour, int stopMinute)
{
   // zjistíme aktuální čas
   datetime currentTime = TimeCurrent();

   // převedeme si časy na minuty   
   int start = startHour * 60 + startMinute;
   int stop = stopHour * 60 + stopMinute;
   int current = TimeHour(currentTime) * 60 + TimeMinute(currentTime);
   
   return(current >= start && current <= stop);
}

Ve funkci si převedeme čas na minuty a porovnáme, zda spadá mezi zadané limity.

 

7.     Funkce TrailStopLoss()

Tato funkce má za úkol posouvat cenu StopLoss daného pokynu na základě zadaných parametrů.

// Provede posunutí ceny StopLoss
// ticketId = ID pokynu
// pipsDiff = počet pipů, po kolika se má posunout SL
// pips = počet pipů, na kolik se má nastavit SL
// useBE = určuje, jestli se má při prvním posunu nastavit SL na BE
void TrailStopLoss(int ticketId, int pipsDiff, int pips, bool useBE)
{
   if(IsTicketOpen(ticketId))
   {
      string symbol = OrderSymbol();
      double pointValue = MarketInfo(symbol, MODE_POINT);
      double openPrice = OrderOpenPrice();
      double slPrice = OrderStopLoss();
      double currentPrice;
      double newSL = 0;
      
      // zjistíme aktuální cenu
      if(OrderType() == OP_BUY)
      {
         currentPrice = MarketInfo(symbol, MODE_ASK);
         if(useBE && (openPrice > slPrice))
         {
            // zjistíme, zda je čas posunout SL na BE
            if(currentPrice > (openPrice + pointValue * pipsDiff))
               newSL = NormalizeDouble(openPrice, MarketInfo(symbol, MODE_DIGITS));
         }
         else
         {
            // zjistíme, zda je čas posunout SL
            if(currentPrice > (slPrice + pointValue * pipsDiff + pointValue * pips))
               newSL = NormalizeDouble(currentPrice - pointValue * pips, 
MarketInfo(symbol, MODE_DIGITS));
         }
      }
      else
      {
         currentPrice = MarketInfo(symbol, MODE_BID);
         if(useBE && (openPrice < slPrice))
         {
            // zjistíme, zda je čas posunout SL na BE
            if(currentPrice < (openPrice - pointValue * pipsDiff))
               newSL = NormalizeDouble(openPrice, MarketInfo(symbol, MODE_DIGITS));
         }
         else
         {
            // zjistíme, zda je čas posunout SL
            if(currentPrice < (slPrice - pointValue * pipsDiff - pointValue * pips))
               newSL = NormalizeDouble(currentPrice + pointValue * pips, 
MarketInfo(symbol, MODE_DIGITS));
         }
      }
      
      if(newSL > 0)
      {
         if(OrderModify(ticketId, openPrice, newSL, OrderTakeProfit(), 0, CLR_NONE) == false)
         {
            Print("Chyba při posouvání ceny StopLoss, chyba č. ", GetLastError());
         }
      }
   }
}

Nejdříve zjistíme, zda je pokyn otevřen, poté zjistíme potřebné hodnoty pro výpočet nové ceny SL. Pokud je parametr useBE nastaven na True, nastavuje se cena SL na BE (Break Even – cena na hranici otevírací ceny, kdy obchodník již nemůže přijít o svou investici) a to pouze pokud je cena SL stále pod otevírací cenou. Poté se již matematicky vypočítá nová hodnota SL a upraví pokyn.

Kompletní soubor TradeLib.mqh si můžete stáhnou zde.

 

Hodnocení článku:
Sdílení článku:
Facebook

Čtěte více

  • 2004-2015: 11 let obchodování a stále v zisku. Jaké je tajemství?
    Přemýšleli jste někdy nad tím, jak dlouho budete chtít trading provozovat? A jak to udělat, abyste byli i za pár let stále ve hře? Jaký časový horizont uvažujete? Pět, možná deset let? A mít vlastní klienty? Kolik myslíte, že by vám takový trading zabral času? A jak jej vybudovat? Řešení už existují a nemusíte je hledat. Trader a zubař, Julius H. je na burze od roku 2004. Prošlapal cestu a zjistil, jak být na trhu po desetiletí úspěšný. Když jsem se s ním potkal, tušil jsem, že je přede mnou výjimečný rozhovor s výjimečným člověkem. A bylo to více než správné tušení.
  • 3. MQL4 - Ještě, než začneme kódovat
    Řízení motorového vozidal je vždy záživnější, než studování předpisů. Stejně tak je to v programování. Samotné kódování není tak nudné, jako čtení referenčních manuálů, ale bez základních znalostí se programovat ani nedá začít. V tomto díle se podíváme trochu do struktury jazyka MQL4.
  • 4. MQL4 - Můj první skript
    V této kapitole si zkusíme společně vytvořit první velice jednoduchý skript. Ukážeme si tak, jak se skript zakládá, seznámíme se s prvními funkcemi a nasadíme skript do platformy MetaTraderu.
  • 5 koníčků, které vám mohou pomoci v tradingu
    V jednom z minulých článků jsme si řekli, že život není jen o vysedávání u obrazovek, a že byste si měli k tradingu najít hobby, u kterého si psychicky odpočinete. Již od útlého věku má většina z nás své vlastní koníčky. Také se nejspíš shodneme na tom, že každý by si měl své koníčky zvolit podle toho, co ho samotného baví a naplňuje.
  • 5. MQL4 - Předdefinované proměnné
    V této kapitole se trochu ponoříme do jazyka MQL4 a představíme si základní proměnné, pomocí kterých můžeme zjišťovat informace o cenách.
  • 5 nejsilnějších emocí tradera
    Psychologie obchodování je nedílnou součástí každého z nás. Trhy jsou jakýmsi živým organismem, u kterého se snažíme racionálním přístupem zanalyzovat jeho vývoj, což vytváří rozpor mezi očekáváním a konečným výsledkem.
  • 6. MQL4 - Technické indikátory
    V tomto díle se podíváme funkce, které vracejí data jednotlivých indikátorů.
  • 7. MQL4 - Funkce pro obchodování
    V tomto díle si představíme poslední oblast jazyka MQL4 tak, abychom byli schopni napsat svoji vlastni strategii pro automatizované obchodování a tím jsou funkce pro práci s pokyny.
  • 8. MQL4 - Tester strategií
    V tomto díle se v rychlosti seznámíme s testerem strategií, který nám pak poslouží k testování a ladění naší strategie.
  • 8 pips
    Dnes mi dorazila zpráva od mého dobrého přítele. Napsal mi v ní: "Tak dneska jsem vydělal jen 8 pips". Trh EUR/USD se dnes do této chvíle pohyboval v rozmezí High a Low asi 80 pips. Nabízí se zde otázka: Je 8 pips profitu za jeden den skutečně tak málo?
  •  


    Diskuse ke článku

    Diskuse je přístupná pouze pro registrované uživatele.
    Přihlásit se | Nová registrace

avatar

Autor:

Geafer

Hodnocení autora:
Bližší informace o autorovi >>

Kategorie blogu

reklama
Purple - ZERO

Kurzy obchodování

Lis
25

Praktický workshop technické analýzy + profi obchodní systémy na FOREXu

FXstreet.cz představuje unikátní seminář s hostem - Patrikem Urbanem, který působil jako profesionální trader na Wall Streetu. Praktické použití technické analýzy, Price Action a obchodní systémy ziskových traderů. Kromě Patrika Urbana na semináři jako host vystoupí také full-time trader Jakub Hodan.

Pro
2

Exkluzivní VIP seminář: Obchodujte jako bankovní trader!

Představujeme vám exkluzivní seminář, který účastníky semináře posouvá mezi tradingovou elitu. V průběhu semináře se dozvíte veřejně nedostupné informace o tom, jak ve skutečnosti funguje forex, pravdu o retailových brokerech a další veřejně nedostupné informace z obchodování bank a tradingu na institucionální úrovni.

Led
13

Juniorská škola tradingu - Forex I-II (Praha)

Juniorská škola tradingu - Forex I-II je určena pro začínající tradery. Pokud chcete vyzkoušet něco nového, vymanit se z davu a být úspěšný v obchodování na finančních trzích, tak je tento seminář určen právě vám.

Led
20

Jak vytvářet ziskové AOS a testovat obchodní strategie

Představujeme vám exkluzivní seminář se zástupci profesionálního vývojářského týmu, působícího ve společnosti FXstreet.cz. Hlavní náplní budou základy tvorby automatických obchodních systémů (AOS) pro platformu MetaTrader 4 včetně praktických ukázek. Naučíte se také správně backtestovat ziskovost AOS. Navíc si sami v průběhu semináře vytvoříte svůj první ziskový AOS.

úno
10

Profesionálem na forexu - kurz pro pokročilé tradery (Brno)

Seminář Profesionálem na forexu je určený pro absolventy kurzu Juniorská škola tradingu a pro pokročilé forexové tradery. Naučíme vás naše ziskové intradenní a swingové obchodní strategie a posuneme vás k vyšším ziskům. Jedná se o jeden z nejlépe hodnocených seminářů FXstreet.cz a věnujeme se na něm hlavně korelačním strategiím a intermarket analýze. Sleva: Absolventi semináře Juniorská škola tradingu mají tento seminář za 4 400,-Kč.


Literatura

titulka_smallsize.jpg

Novinka! Kniha "Jak se stát forexovým obchodníkem" Ondřeje Hartmana vychází ve druhém a výrazně rozšířeném vydání!

Kniha vychází již ve druhém, ale tentokrát výrazně upraveném a rozšířeném vydání. Kniha je koncipována tak, aby byla užitečným průvodcem jak začínajícím obchodníkům bez zkušeností, tak i těm, kdo na forexu již obchodují a potřebují si prohloubit své znalosti.

Day_Trading_obalka_78x110.jpg

Kniha "FOREX – Ziskové intradenní a swingové obchodní strategie" od Kathy Lien vychází v češtině!

Je nám velikou ctí, že můžeme obohatit český a slovenský forexový trh světově uznávanou knihou číslo 1 pro každého, kdo chce do hloubky pochopit fungování největšího světového finančního trhu.

C:\fakepath\kathy-lien-08112017.jpg

Světový bestseller o tradingu v češtině! Úspěšní obchodníci: Jak běžní lidé porážejí Wall Street v jeho vlastní hře

Jedna z nejprodávanějších knih od Kathy Lien právě vychází v českém překladu! Obsahuje sérii rozhovorů Kathy Lien s nejúspěšnějšími tradery. Tato kniha se stala inspirací pro tisíce čtenářů po celém světě. Setkáte se v ní s příběhy obyčejných lidí, kteří dokázali zbohatnout díky systematickému dodržování konkrétních pravidel v tradingu. Bez ohledu na jejich povolání jsou dnes úspěšnými obchodníky a investory. V této knize vám budou představeny jejich obchodní přístupy a strategie, které vám pomohou pochopit, jak lze pomocí vlastní píle dosáhnout úspěchu ve zdánlivě složitém světě tradingu.

Forex - doporučené články:

Co je FOREX?
Základní informace o finančním trhu FOREX. Forex je obchodování s cizími měnami (forex trading) a je zároveň největším a také nejlikvidnějším finančním trhem na světě.
Forex pro začátečníky
Forex je celosvětová burzovní síť, v jejímž rámci se obchoduje se všemi světovými měnami, včetně české koruny. Na forexu obchodují banky, fondy, pojišťovny, brokeři a podobné instituce, ale také jednotlivci, je otevřený všem.
1. část - Co to vlastně forex je?
FOREX = International Interbank FOReign EXchange. Mezinárodní devizový trh - jednoduše obchodování s cizími měnami - obchodování se směnnými kurzy.
VIP zóna - Forex Asistent
Nabízíme vám jedinečnou příležitost stát se součástí týmu elitních obchodníků FXstreet.cz. Ve spolupráci s předními úspěšnými obchodníky jsme pro vás připravili unikátní VIP skupinu, až doposud využívanou pouze několika profesionálními tradery, a k tomu i exkluzivní Price Action VIP indikátor, doposud úspěšně používaný pouze k soukromým účelům. Nyní se vám otevírá možnost stát se součástí této VIP skupiny, díky které získáte jedinečné know-how pro obchodování na forexu, výjimečný Price Action VIP indikátor, a tím také náskok před drtivou většinou ostatních účastníků trhu.
Forex brokeři - jak správně vybrat
V podstatě každého, kdo by chtěl obchodovat forex, čeká jednou rozhodování o tom, s jakým brokerem (přeloženo jako makléř/broker nebo zprostředkovatel) by chtěl mít co do činění a svěřil mu své finance určené k obchodování. Velmi rád bych vám přiblížil problematiku výběru brokera, rozdíl mezi jednotlivými typy brokerů a v neposlední řadě uvedu několik příkladů nejznámějších z nich.
Forex robot (AOS): Automatický obchodní systém
Snem některých obchodníků je obchodovat bez nutnosti jakéhokoliv zásahu do obchodu. Je to pouhá fikce nebo reálná záležitost? Kolik z nás věří, že "roboti" mohou profitabilně obchodovat? Na jakých principech fungují?
Forex volatilita
Forex volatilita, co je volatilita? Velmi užitečným nástrojem je ukazatel volatility na forexu. Grafy v této sekci ukazují volatilitu vybraného měnových párů v průběhu aktuální obchodní seance.
Forex zůstává největším trhem na světě
V dnešním článku se podíváme na nejnovější statistiky globálního obchodování na forexu. Banka pro mezinárodní vyrovnání plateb (BIS) totiž před pár týdny zveřejnila svůj pravidelný tříletý přehled, ve kterém detailně analyzuje vývoj na měnovém trhu. BIS je označována jako "centrální banka centrálních bank". Je nejstarší mezinárodní finanční organizací a hraje klíčovou roli při spolupráci centrálních bank a dalších institucí z finančního sektoru. Dnešní vzdělávací článek sice nebude zcela zaměřen na praktické informace z pohledu běžného tradera, ale i přesto přinese zajímavé a důležité poznatky.

Nejnovější články:


Naposledy čtené:


FXstreet.cz - forex, komodity, kryptoměny, trading, zpravodajství

Nezávislý investiční server zaměřený na forex, komodity, kryptoměny, trading a zpravodajství. Vzdělávací články, cenové grafy, cizí měny, semináře, ekonomické a forex zprávy.
reklama
Swissquote Bank
reklama
Purple - ZERO
reklama
DEGIRO banner
reklama
Purple - seminare