//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4 |
//| Êèì Èãîðü Â. aka KimIV |
//| http://www.kimiv.ru |
//| |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link "http://www.kimiv.ru"
//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà ------------------------------------------
extern string _P_Expert="---------- Ïàðàìåòðû ñîâåòíèêà";
extern bool CurSymbolOnly = True; // Òîëüêî òåêóùèé ñèìâîë
extern int StopLoss = 40; // Stop
extern int TakeProfit = 60; // Òåéê
extern bool ShowComment = True; // Ïîêàçûâàòü êîììåíòàðèé
extern int NumberAccount = 0; // Íîìåð òîðãîâîãî ñ÷¸òà
extern bool UseSound = False; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
extern int Slippage = 3; // Ïðîñêàëüçûâàíèå öåíû
extern int NumberOfTry = 5; // Êîëè÷åñòâî ïîïûòîê
//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà --------------------------------------
color clCloseBuy = Blue; // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color clCloseSell = Red; // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
int CurProfit;
//------- Ïîêëþ÷åíèå âíåøíèõ ìîäóëåé -------------------------------------------
#include <stdlib.mqh>
//+----------------------------------------------------------------------------+
//| expert initialization function |
//+----------------------------------------------------------------------------+
void init() { if(!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//| expert deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() { if(!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//| expert start function |
//+----------------------------------------------------------------------------+
void start()
{
if(!IsTesting())
{
if(NumberAccount>0 && NumberAccount!=AccountNumber())
{
Message("ÇÀÏÐÅÙÅÍÀ òîðãîâëÿ íà ñ÷¸òå "+AccountNumber());
return;
}
else Comment("");
}
CloseByProfit();
if(ShowComment)
{
Comment(IIFs(CurSymbolOnly,"CurSymbolOnly ","")
,"Òåêóùèé ïðîôèò=",CurProfit," ï."
," Óáûòîê çàêðûòèÿ=",StopLoss," ï."
," Ïðèáûëü çàêðûòèÿ=",TakeProfit," ï."
);
}
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. 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(NameFileSound); break;
} else {
err=GetLastError();
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 |
//| Îïèñàíèå : Çàêðûòèå ïîçèöèé ïî ðûíî÷íîé öåíå ñíà÷àëà ïðèáûëüíûõ |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit()
{
int i,k=OrdersTotal();
// Ñíà÷àëà çàêðûâàåì ïðèáûëüíûå ïîçèöèè
for(i=k-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(!CurSymbolOnly || OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
// Ïîòîì âñå îñòàëüíûå
k=OrdersTotal();
for(i=k-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(!CurSymbolOnly || OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
}
}
}
//+----------------------------------------------------------------------------+
//| Çàêðûòèå âñåõ ïîçèöèé ïî ïðîôèòó. |
//+----------------------------------------------------------------------------+
void CloseByProfit()
{
double pa,pb,pp;
int i,k=OrdersTotal(),pr=0;
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(!CurSymbolOnly || OrderSymbol()==Symbol())
{
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
pp=MarketInfo(OrderSymbol(), MODE_POINT);
if(pp==0) if(StringFind(OrderSymbol(),"JPY")<0) pp=0.0001; else pp=0.01;
if(OrderType()==OP_BUY)
{
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp,0);
}
if(OrderType()==OP_SELL)
{
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp,0);
}
}
}
}
CurProfit=pr;
if(CurProfit<=-StopLoss || CurProfit>=TakeProfit) ClosePosFirstProfit();
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. 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 |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 01.02.2008 |
//| Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ. |
//+----------------------------------------------------------------------------+
string IIFs(bool condition,string ifTrue,string ifFalse)
{
if(condition) return(ifTrue); else return(ifFalse);
}
//+----------------------------------------------------------------------------+
//| Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë |
//+----------------------------------------------------------------------------+
void Message(string m)
{
Comment(m);
if(StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+
Comments