//+----------------------------------------------------------------------------+
//| e-VTrailingByProfit.mq4 |
//| Êèì Èãîðü Â. aka KimIV |
//| http://www.kimiv.ru |
//| |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link "http://www.kimiv.ru"
//------- Êîíñòàíòû ------------------------------------------------------------
#define BEGIN_PROFIT -999999999 // Íà÷àëüíûé ïðîôèò
//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà ------------------------------------------
extern string _P_Expert = "---------- Ïàðàìåòðû ñîâåòíèêà";
extern int NumberAccount = 0; // Íîìåð òîðãîâîãî ñ÷¸òà
extern string symbol = ""; // Òîðãîâûé èíñòðóìåíò
// "" - ëþáîé
// "0" - òåêóùèé
extern int Operation = -1; // Òîðãîâàÿ îïåðàöèÿ:
// -1 - ëþáàÿ
// 0 - OP_BUY
// 1 - OP_SELL
extern int MagicNumber = -1; // Èäåíòèôèêàòîð
// -1 - ëþáîé
extern double TrailingStart = 0; // Óðîâåíü ïðîôèòà - Ñòàðòîâûé óðîâåíü òðàëà
extern double TrailingStop = 47; // Ôèêñèðîâàííûé ðàçìåð òðàëà â âàëþòå äåïîçèòà
extern double TrailingStep = 1.5; // Øàã òðàëà â âàëþòå äåïîçèòà
extern string _P_Performance = "---------- Ïàðàìåòðû èñïîëíåíèÿ";
extern bool ShowComment = True; // Ïîêàçûâàòü êîììåíòàðèé
extern bool PrintEnable = True; // Ðàçðåøèòü ïå÷àòü â æóðíàë
extern bool AllMessages = True; // Ïðîòîêîëèðîâàòü âñå ñîîáùåíèÿ
extern bool UseSound = False; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string SoundSuccess = "ok.wav"; // Çâóê óñïåõà
extern string SoundError = "timeout.wav"; // Çâóê îøèáêè
extern int Slippage = 2; // Ïðîñêàëüçûâàíèå öåíû
extern int NumberOfTry = 3; // Êîëè÷åñòâî ïîïûòîê
//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà --------------------------------------
bool gbDisabled = False; // Ôëàã áëîêèðîâêè ñîâåòíèêà
bool gbNoInit = False; // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè
color clCloseBuy = Blue; // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color clCloseSell = Red; // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
double gdProfit = BEGIN_PROFIT; // Ñóììàðíûé ïðîôèò âûáðàííûõ ïîçèöèé
//------- Ïîêëþ÷åíèå âíåøíèõ ìîäóëåé -------------------------------------------
#include <stdlib.mqh>
//+----------------------------------------------------------------------------+
//| |
//| ÏÐÅÄÎÏÐÅÄÅ˨ÍÍÛÅ ÔÓÍÊÖÈÈ |
//| |
//+----------------------------------------------------------------------------+
//| expert initialization function |
//+----------------------------------------------------------------------------+
void init() {
gbNoInit=False;
if (!IsTradeAllowed()) {
Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
"Ðàçðåøèòü ñîâåòíèêó òîðãîâàòü");
gbNoInit=True; return;
}
if (!IsLibrariesAllowed()) {
Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
"Ðàçðåøèòü èìïîðò èç âíåøíèõ ýêñïåðòîâ");
gbNoInit=True; return;
}
if (!IsTesting()) {
if (IsExpertEnabled()) Message("Ñîâåòíèê áóäåò çàïóùåí ñëåäóþùèì òèêîì");
else Message("Îòæàòà êíîïêà \"Ðàçðåøèòü çàïóñê ñîâåòíèêîâ\"");
}
}
//+----------------------------------------------------------------------------+
//| expert deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//| expert start function |
//+----------------------------------------------------------------------------+
void start() {
if (gbDisabled) {
Message("Êðèòè÷åñêàÿ îøèáêà! Ñîâåòíèê ÎÑÒÀÍÎÂËÅÍ!"); return;
}
if (gbNoInit) {
Message("Íå óäàëîñü èíèöèàëèçèðîâàòü ñîâåòíèê!"); return;
}
if (!IsTesting()) {
if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
Message("ÇÀÏÐÅÙÅÍÀ ðàáîòà íà ñ÷¸òå "+AccountNumber());
return;
} else Comment("");
}
string sy=StringUpper(symbol);
if (ExistPositions(sy, Operation, MagicNumber)) {
double pr=GetProfitOpenPosInCurrency(sy, Operation, MagicNumber);
if (pr-TrailingStop>=TrailingStart) {
if (gdProfit<pr-TrailingStop-TrailingStep) gdProfit=pr-TrailingStop;
}
} else gdProfit=BEGIN_PROFIT;
if (gdProfit>=pr) {
for (int i=0; i<NumberOfTry; i++) ClosePosFirstProfit(sy, Operation, MagicNumber);
}
if (!IsTesting() && ShowComment) {
string st="NumberAccount="+DoubleToStr(NumberAccount, 0)
+" Symbol="+IIFs(symbol=="", "All", IIFs(symbol=="0", Symbol(), StringUpper(symbol)))
+" Operation="+IIFs(Operation<0, "All", GetNameOP(Operation))
+" MagicNumber="+IIFs(MagicNumber<0, "All", DoubleToStr(MagicNumber, 0))
+"\n"
+"TrailingStart="+DoubleToStr(TrailingStart, 2)+" "+AccountCurrency()
+"TrailingStop="+DoubleToStr(TrailingStop, 2)+" "+AccountCurrency()
+" TrailingStep="+DoubleToStr(TrailingStep, 2)+" "+AccountCurrency()
+"\n"
+"Current Stop="+IIFs(gdProfit>BEGIN_PROFIT, DoubleToStr(gdProfit, 2)+" "+AccountCurrency(), "None")
+" Current Profit="+DoubleToStr(pr, 2)+" "+AccountCurrency()
;
Comment(st);
} else Comment("");
}
//+----------------------------------------------------------------------------+
//| |
//| ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÅ ÔÓÍÊÖÈÈ |
//| |
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 19.02.2008 |
//| Îïèñàíèå: Çàêðûòèå îäíîé ïðåäâàðèòåëüíî âûáðàííîé ïîçèöèè |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
bool fc;
color clClose;
double ll, pa, pb, pp;
int err, it;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if (fc) {
if (UseSound) PlaySound(SoundSuccess); break;
} else {
err=GetLastError();
if (UseSound) PlaySound(SoundError);
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
} else Print("Íåêîððåêòíàÿ òîðãîâàÿ îïåðàöèÿ. Close ",GetNameOP(OrderType()));
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 19.02.2008 |
//| Îïèñàíèå : Çàêðûòèå ïîçèöèé ïî ðûíî÷íîé öåíå ñíà÷àëà ïðèáûëüíûõ |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, |
//| NULL - òåêóùèé ñèìâîë) |
//| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) |
//| mn - MagicNumber (-1 - ëþáîé ìàãèê) |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
// Ñíà÷àëà çàêðûâàåì ïðèáûëüíûå ïîçèöèè
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// Ïîòîì âñå îñòàëüíûå
k=OrdersTotal();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 06.03.2008 |
//| Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, |
//| NULL - òåêóùèé ñèìâîë) |
//| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) |
//| mn - MagicNumber (-1 - ëþáîé ìàãèê) |
//| ot - âðåìÿ îòêðûòèÿ ( 0 - ëþáîå âðåìÿ îòêðûòèÿ) |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (ot<=OrderOpenTime()) return(True);
}
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.09.2005 |
//| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("BuyLimit");
case OP_SELLLIMIT: return("SellLimit");
case OP_BUYSTOP : return("BuyStop");
case OP_SELLSTOP : return("SellStop");
default : return("Unknown Operation");
}
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 19.02.2008 |
//| Îïèñàíèå : Âîçâðàùàåò ñóììàðíûé ïðîôèò îòêðûòûõ ïîçèöèé â âàëþòå äåïîçèòà |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, |
//| NULL - òåêóùèé ñèìâîë) |
//| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) |
//| mn - MagicNumber (-1 - ëþáîé ìàãèê) |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
double p=0;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
return(p);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.02.2008 |
//| Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ. |
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
if (condition) return(ifTrue); else return(ifFalse);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.09.2005 |
//| Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| m - òåêñò ñîîáùåíèÿ |
//+----------------------------------------------------------------------------+
void Message(string m) {
static string prevMessage="";
Comment(m);
if (StringLen(m)>0 && PrintEnable) {
if (AllMessages || prevMessage!=m) {
prevMessage=m;
Print(m);
}
}
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.09.2005 |
//| Îïèñàíèå : Âîçâðàùàåò ñòðîêó â ÂÅÐÕÍÅÌ ðåãèñòðå |
//+----------------------------------------------------------------------------+
string StringUpper(string s) {
int c, i, k=StringLen(s), n;
for (i=0; i<k; i++) {
n=0;
c=StringGetChar(s, i);
if (c>96 && c<123) n=c-32; // a-z -> A-Z
if (c>223 && c<256) n=c-32; // à-ÿ -> À-ß
if (c==184) n=168; // ¸ -> ¨
if (n>0) s=StringSetChar(s, i, n);
}
return(s);
}
//+----------------------------------------------------------------------------+
Comments