Neděle 17. listopadu 2024 11:16
reklama
Purple webinář Ve vaší režii
reklama
SAB Finance
reklama
Swissquote Bank
reklama
SAB Finance

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: 
   

Čtěte více

  • 7 smrteľných výhovoriek pre vaše obchodovanie (1. časť)
    Pravdepodobne ste dobre oboznámení so siedmimi smrteľnými hriechmi alebo duchovnými nedostatkami; môže byť však užitočné ich stručne uviesť:
  • 7 smrteľných výhovoriek pre vaše obchodovanie (2. časť)
    Pravdepodobne ste dobre oboznámení so siedmimi smrteľnými hriechmi alebo duchovnými nedostatkami.
  • 7 spôsobov ako sa vyhnúť podvodom na Forexe
    Forexový priemysel v poslednej dobe zaznamenáva čoraz viac podvodov. Tu je 7 spôsobov, ako zabrániť strate peňazí v takýchto podvodoch:
  • 7 tipů pro efektivní skalpování
    Dozvíte se, na co byste si měli dát pozor, co si důkladně promyslet a v jakých oblastech na sobě pracovat, abyste se stali ziskovým skalperem.
  • 7 tipů pro větší sebedůvěru v tradingu
    Proč je úspěšnější můj kamarád, který má úplně stejnou strategii? Nebo. Ten obchodník se mi líbí, chci jeho strategii, ale proč se mi nedaří jako jemu? Poznáváte se?
  • 7 tipů pro začínající tradery
    Začínání s tradingem může být vzrušující, ale zároveň i náročné. Finanční trhy nabízejí mnoho příležitostí, ale také skrývají rizika, která mohou být pro nezkušené tradery zničující. Abychom vám pomohli na cestě k úspěchu, připravili jsme 7 tipů, které vám mohou usnadnit první kroky a pomohou se vyhnout běžným chybám.
  • 78 týdnů praktických ukázek: Bilance
    Dalších 13 týdnů uplynulo jako voda, a tak tady máme další bilanci, tentokrát za 78 týdnů, tedy za rok a půl. Nebyl to jednoduchý čtvrt rok, ale mrkneme se na to.
  • 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?
  • 8 základných pravidiel, ktorými by sa mal obchodník riadiť (časť prvá)
    Zaujímalo vás niekedy aký je rozdiel medzi víťazmi a porazenými z dlhodobého hľadiska? Ako väčšina ľudí, aj vy si pravdepodobne myslíte, že odpoveďou je vzdelanie. Potom si prečítate niekoľko ďalších kníh, niekoľko článkov a myslíte si, že to bolo ono. No ... hádajte čo? To nie je ono. Ktokoľvek z nás dokáže hĺtať veľa informácií, niektoré predsa len prinesú lepšie výsledky. Aj keď ich možno počujete volať obchodníci Uber, v skutočnosti ich spája jedna jednoduchá vec: disciplína. Dovoľte mi vypracovať a uľahčiť vám pochopenie tým, že vám poskytnem niekoľko jednoduchých pravidiel, ktoré musí každý úspešný obchodník dodržiavať.
  • 9 myšlienok ako sa elegantne vysporiadať so stratou
    Predpokladám vážený čitateľ, že pocit čo robiť, alebo ako sa správať po práve ukončenom stratovom obchode dôverne poznáš. Iste, rozdiel je medzi nekontrolovanou a stratou v zmysle zachovania tebou určených pravidiel. Pravdepodobne jedna z prvých myšlienok je okamžitá snaha o „vrátenie svojich“ peňazí späť, niekedy založená na latentnom a inokedy na kričiacom podtóne pomsty.
  • 91 týdnů praktických ukázek: Bilance
    Čas běží a běží a nevyhýbá se ani výsledkům. Po dalších třinácti týdnech jsem dovršil rok a třičtvrtě praktických ukázek. A tak se můžeme podívat, co se děje a jak to jde nebo nejde.
  •  


    Diskuse ke článku

    Diskuse je přístupná pouze pro registrované uživatele.
    Přihlásit se | Nová registrace
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 (speciální uzavřená sekce na webu), až doposud využívanou pouze několika profesionálními tradery, a k tomu i exkluzivní VIP indikátory, 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é VIP indikátory, 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é:

Forex brokeři
FxPro
Directa SIM
Saxo Bank
reklama
Investingfox Nastroje