//+------------------------------------------------------------------+ //| TradeLib.mq4 | //| Copyright © 2010, Geafer | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Geafer" #property link "" // 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); } } // 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); } // 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); } } // 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()); } } } } // 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); } // 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); }