Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
Expert_1_4
#property copyright "Copyright © 2011 zvp.1976@gmail.com"
#property link "zvp.1976@gmail.com"
#include <stdlib.mqh>
// ==========================================================================================================================================================================================================
extern string trade_EXP="Íàñòðîéêè ïàðàìåòðîâ ñîâåòíèêà";
extern int MA_PER = 350; // ïåðèîä äëèííîãî ìóâèíãà
extern int BOL_PER = 20; // ïåðèîä Áëèíäæåðà
extern double BOL_DEV = 2;// îòêëîíåíèå ïîëîñ Áîëèíäæåðà
extern int MAX_HOUR_WAIT = 4;// âðåìÿ ñóùåñòâîâàíèÿ îðäåðà
extern string trade_MM="Íàñòðîéêè MoneyMagement";
extern bool UseMM=false;
extern double MaxRiskProc=6;
extern bool EquityClose=true;
extern double EquityProcentClose=2.5;// ïîðîã Equity ïî äîñòèæåíèè êîòîðîãî ïðîèçâîäèòñÿ çàêðûòèå âñåõ ñäåëîê
extern string trade_="Íàñòðîéêè òîðãîâëè";
extern int Magic=777; // Ìàãè÷åñêèé íîìåð
extern int Slippage=20; // Ïðîñêàëüçûâàíèå
extern int StopOrderDelta=25; // Äèñòàíöèÿ äëÿ îòëîæåííûõ îðäåðîâ
extern bool UseLotsGrid=false;
extern double Lots_200=0.02; // Ôèêñèðâîàííûé ëîò - äåïî äî 400USD
extern double Lots_400=0.04; // Ôèêñèðâîàííûé ëîò - äåïî îò 400USD
extern double Lots_800=0.08; // Ôèêñèðâîàííûé ëîò - äåïî îò 800USD
extern double Lots_1600=0.16; // Ôèêñèðâîàííûé ëîò - äåïî îò 1600USD
extern double Lots_3200=0.32; // Ôèêñèðâîàííûé ëîò - äåïî îò 3200USD
extern double Lots_6400=0.64; // Ôèêñèðâîàííûé ëîò - äåïî îò 6400USD
extern double Lots_12800=1.28; // Ôèêñèðâîàííûé ëîò - äåïî îò 12800USD
extern double Lots_static=1; // Ôèêñèðâîàííûé ëîò
extern double LossProcent=0; // Çàêðûòü ñàìóþ óáûòî÷íóþ åñëè ïðîöåíò óáûòêîâ ïî âñåì ïîçèöèÿì áîëüøå óêàçàííîãî
extern bool allowtest=true; // Ðàçðåøèòü ðàáîòó â ðåæèìå òåñòåðà
datetime PrevTime;
double sl,tp,TakeProfit,StopLoss,Lots;
double UpLine[];
double DownLine[];
double AverLine[],psar[];
double MA[],MA_2[];
double ktp,ksl,sprd;
// ==========================================================================================================================================================================================================
int start()
{
double MN_CL_DIF,ktp1,ktp2,ksl1,ksl2;
double curprof, psar1,pricein;
int Signal,answ,Balance;
Sleep(2000);
//Âû÷èñëÿåì ñïðåä ïî òåêóùåìó ñèìâîëó
sprd=NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*Point,Digits);
Signal=0;
curprof =CalculateProfit();
//çàêðûòü ñàìóþ óáûòî÷íóþ ñäåëêó åñëè ïðèôèò ìåíüøå 0 è ïðîöåíò ïîòåðü ïðåâûøàåò çàäàííûé
if (curprof<0&&LossProcent>0)
if (MathAbs(curprof)>=(LossProcent*AccountBalance()/100))
{
CloseMaxLoss();
}
//çàêðûòü âñå ñäåëêè åñëè äîñòèãíóò íóæíûé Åêâèòè
if (EquityClose)
if (curprof>=(EquityProcentClose*AccountBalance()/100))
{
CloseThisSymbolAll();
}
for (int i=0;i<=2;i++)
{
UpLine[i]=iBands(Symbol(),0,BOL_PER,BOL_DEV,0,0,MODE_UPPER,i);
DownLine[i]=iBands(Symbol(),0,BOL_PER,BOL_DEV,0,0,MODE_LOWER,i);
AverLine[i]=iBands(Symbol(),0,BOL_PER,BOL_DEV,0,0,0,i);
MA[i]=iMA(Symbol(),0,MA_PER,0,0,0,i);
MA_2[i]=iMA(Symbol(),0,MA_PER/2,0,0,0,i);
psar[i]=iSAR(Symbol(),0,0.02,0.2,1);
}
//ðàñ÷åò âåñîâûõ êîýôôèöèåíòîâ ìîäóëÿöèè Òåêïðîôèòà è ÑòîïËîñà
ktp1=MathMax(DownLine[2],DownLine[1])/MathMin(DownLine[2],DownLine[1]);
ktp2=MathMax(UpLine[2],UpLine[1])/MathMin(UpLine[2],UpLine[1]);
ktp=MathMax(ktp1,ktp2);
ksl1=1/ktp1;
ksl2=1/ktp2;
ksl=MathMin(ksl1,ksl2);
MN_CL_DIF=MathMin(UpLine[1],UpLine[2])-MathMax(AverLine[1],AverLine[2]);
//ðàñ÷åò Òåêïðîôèòà è ÑòîïËîñà â ïóíêòàõ
TakeProfit =(MathMax(UpLine[1],UpLine[2])-MathMin(DownLine[2],DownLine[1]))*ktp/Point;
StopLoss = MathAbs(MN_CL_DIF*ksl/Point);
/* Çäåñü óêàçûâàåì óñëîâèå äëÿ èíäèêàòîðà, ïðè êîòîðîì ìû áóäåì ïðîäàâàòü*/
if (UpLine[2]>=MA[2]&&UpLine[1]<=MA[1]&&(AverLine[2]-AverLine[1]>sprd))
if (UpLine[2]-MA[2]+MA[1]-UpLine[1]>=sprd&&(MA[2]-MA[1]>=sprd/2||MA_2[1]<MA_2[2]))
{
psar1=iSAR(Symbol(),0,0.02,0.2,1);
// îïåðåäåëÿåì öåíó âõîäà
if (psar1>AverLine[1])
pricein =(Low[1]+Low[2])/2-2*sprd;//èëè ïî ñðåäíåìó ïîñëåäíèõ äâóõ Low ìèíóñ 2 ñïðåäà
else
pricein =psar1; //èëè ïî ïîñëåäíåìó Ïàðàáîëèêó
Signal=2;
}
/* Çäåñü óêàçûâàåì óñëîâèå äëÿ èíäèêàòîðà, ïðè êîòîðîì ìû áóäåì ïîêóïàòü*/
if (DownLine[1]>=MA[1]&&DownLine[2]<=MA[2]&&(AverLine[1]-AverLine[2]>sprd))
if (DownLine[1]-MA[1]+MA[2]-DownLine[2]>=sprd&&(MA[1]-MA[2]>=sprd/2||MA_2[2]<MA_2[1]))
{
psar1=iSAR(Symbol(),0,0.02,0.2,1);
// îïåðåäåëÿåì öåíó âõîäà
if (psar1<AverLine[1])
pricein =(High[1]+High[2])/2+2*sprd;//èëè ïî ñðåäíåìó ïîñëåäíèõ äâóõ High ïëþñ 2 ñïðåäà
else
pricein =psar1;//èëè ïî ïîñëåäíåìó Ïàðàáîëèêó
Signal=1;
}
pricein=NormalizeDouble(pricein,Digits);
if (UseMM&&Signal>0)//åñëè þçàåì ìàíè ìåíåäæìåíò òî îïðåäåëÿåì ëîò
{
Lots = GetLots();
}
else //èíà÷å ïîëóñòàòè÷íûé ëîò
if (UseLotsGrid)
{
Balance = MathCeil(AccountBalance());
if (Balance<100)
{
CloseThisSymbolAll();
return(0);
}
if (Balance>=100&&Balance<400)Lots=Lots_200;
if (Balance>=400&&Balance<800)Lots=Lots_400;
if (Balance>=800&&Balance<1600)Lots=Lots_800;
if (Balance>=1600&&Balance<3200)Lots=Lots_1600;
if (Balance>=3200&&Balance<6400)Lots=Lots_3200;
if (Balance>=6400&&Balance<12800)Lots=Lots_6400;
if (Balance>=12800)Lots=Lots_12800;
}
else
Lots = Lots_static;
if(iTime(Symbol(),0,0)-PrevTime>0)//íå áîëüøå îäíîé ñäåëêè íà ñèãíàëå â ïðåäåëàõ òàéìôðåéìà
{
//+------------------------------------------------------------------+
// Åñëè ñèãíàë íà áàé:
//+------------------------------------------------------------------+
if(Signal==1)// buy
{
//Âû÷èñëÿåì ñòîïëîññ
if(StopLoss!=0)sl=NormalizeDouble(Bid+StopOrderDelta*Point-StopLoss*Point,Digits); else sl=0;
// ÂÛ÷èñëÿåì òåéêïðîôèò
if(TakeProfit!=0)tp=NormalizeDouble(Ask+StopOrderDelta*Point+TakeProfit*Point,Digits); else tp=0;
//Îòêðûâàåì Îðäåð
i=SetOrder(Symbol(),OP_BUYSTOP,Lots,pricein,sl,tp,Magic,Time[0]+MAX_HOUR_WAIT*60*60,"buy");
if (i>0)PrevTime=iTime(Symbol(),0,0);
}
//+------------------------------------------------------------------+
// Åñëè ñèãíàë íà ñåëë:
//+------------------------------------------------------------------+
if(Signal==2)// ñåëë
{
//Âû÷èñëÿåì ñòîïëîññ
if(StopLoss!=0)sl=NormalizeDouble(Ask-StopOrderDelta*Point+StopLoss*Point,Digits); else sl=0;
// ÂÛ÷èñëÿåì òåéêïðîôèò
if(TakeProfit!=0)tp=NormalizeDouble(Bid-StopOrderDelta*Point-TakeProfit*Point,Digits); else tp=0;
//Îòêðûâàåì Îðäåð
i= SetOrder(Symbol(),OP_SELLSTOP,Lots,pricein,sl,tp,Magic,Time[0]+MAX_HOUR_WAIT*60*60,"sell");
if (i>0)PrevTime=iTime(Symbol(),0,0);
}
}
return(0);
}
// ==========================================================================================================================================================================================================
//+------------------------------------------------------------------+
//| Óñòàíîâêà îòëîæåííîãî îðäåðà |
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| sy - íàèìåíîâàíèå èíñòðóìåíòà (NULL èëè "" - òåêóùèé ñèìâîë) |
//| op - îïåðàöèÿ |
//| ll - ëîò |
//| pp - öåíà |
//| sl - óðîâåíü ñòîï |
//| tp - óðîâåíü òåéê |
//| mn - Magic Number |
//| ex - Ñðîê èñòå÷åíèÿ |
//+----------------------------------------------------------------------------+
int SetOrder(string sy,int op,double ll,double pp,
double sl=0,double tp=0,int mn=0,datetime ex=0,string lsComm="")
{
color clOpen;
datetime ot;
double pa,pb,mp;
int err,it,ticket,msl;
if(sy=="" || sy=="0") sy=Symbol();
msl=MarketInfo(sy,MODE_STOPLEVEL);
if(ex>0 && ex<TimeCurrent()) ex=0;
for(it=1; it<=5; it++)
{
if (!allowtest)
{
if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
{
Print("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè");
break;
}
while(!IsTradeAllowed()) Sleep(5000);
}
RefreshRates();
ot=TimeCurrent();
ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,MarketInfo(sy,MODE_DIGITS)),Slippage,NormalizeDouble(sl,MarketInfo(sy,MODE_DIGITS)),NormalizeDouble(tp,MarketInfo(sy,MODE_DIGITS)),lsComm,mn,ex,clOpen);
if(ticket>0)
{
return(ticket);
break;
} else {
err=GetLastError();
if(err==128 || err==142 || err==143)
{
Sleep(1000*66);
continue;
}
mp=MarketInfo(sy, MODE_POINT);
pa=MarketInfo(sy, MODE_ASK);
pb=MarketInfo(sy, MODE_BID);
if(pa==0 && pb==0) Comment("SetOrder(): Ïðîâåðüòå â îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
// Íåïðàâèëüíûå ñòîïû
if(err==130)
{
switch(op)
{
case OP_BUYLIMIT:
if(pp>pa-msl*mp) pp=pa-msl*mp;
if(sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
if(tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
break;
case OP_BUYSTOP:
if(pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp;
if(sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
if(tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
break;
case OP_SELLLIMIT:
if(pp<pb+msl*mp) pp=pb+msl*mp;
if(sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
if(tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
break;
case OP_SELLSTOP:
if(pp>pb-msl*mp) pp=pb-msl*mp;
if(sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
if(tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
break;
}
Print("SetOrder(): Ñêîððåêòèðîâàíû öåíîâûå óðîâíè"+sy+"--op-"+op+"--ll-"+ll+"--pp-"+pp+"---"+Slippage+"--sl-"+sl+"--tp-"+tp+"---"+lsComm+"---"+mn+"---"+ex+"---"+clOpen);
}
// Áëîêèðîâêà ðàáîòû ñîâåòíèêà
if(err==2 || err==64 || err==65 || err==133)
{
break;
}
// Äëèòåëüíàÿ ïàóçà
if(err==4 || err==131 || err==132)
{
Sleep(1000*300); break;
}
// Ñëèøêîì ÷àñòûå çàïðîñû (8) èëè ñëèøêîì ìíîãî çàïðîñîâ (141)
if(err==8 || err==141) Sleep(1000*100);
if(err==139 || err==140 || err==148) break;
// Îæèäàíèå îñâîáîæäåíèÿ ïîäñèñòåìû òîðãîâëè
if(err==146) while(IsTradeContextBusy()) Sleep(1000*11);
// Îáíóëåíèå äàòû èñòå÷åíèÿ
if(err==147)
{
ex=0; continue;
}
if(err!=135 && err!=138) Sleep(1000*7.7);
}
}
}
//+------------------------------------------------------------------+
//| Àâòîëîò |
//+------------------------------------------------------------------+
double GetLots()
{
double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
if (StopLoss>0)double Prots = MaxRiskProc/StopLoss;
else
Prots=MaxRiskProc/MarketInfo(Symbol(),MODE_STOPLEVEL);
double Lot=MathFloor(AccountFreeMargin()*Prots/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/MarketInfo(Symbol(),
MODE_LOTSTEP))*MarketInfo(Symbol(),MODE_LOTSTEP);
if(Lot<MinLot)Lot=MinLot;
if(Lot>MaxLot)Lot=MaxLot;
return(NormalizeDouble(Lot,2));
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Stamp();
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Stamp()
{
ArrayResize(UpLine,3);
ArrayResize(DownLine,3);
ArrayResize(AverLine,3);
ArrayResize(MA,3);
ArrayResize(MA_2,3);
ArrayResize(psar,3);
Magic=Magic*Period();
}
//+------------------------------------------------------------------+
double CalculateProfit()
{
double Profit = 0;
for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS)==true)
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL) Profit += OrderProfit();
}
}
return (Profit);
}
void CloseThisSymbolAll()
{
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol())
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Blue);
if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red);
}
Sleep(1000);
}
}
}
int CloseMaxLoss()
{
double Profit_1 = 0;
int answ, ticket;
for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS)== True)
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
if (OrderProfit()<0&&Profit_1>OrderProfit())
{
Profit_1 = OrderProfit();
ticket = OrderTicket();
}
}
}
if (ticket>0)
{
Print("TICK = ", ticket, " : PROF = ",Profit_1);
if (OrderSelect(ticket, SELECT_BY_TICKET)== True)
{
if (OrderType() == OP_BUY)
answ = OrderClose(ticket, Lots, Bid, Slippage, Blue);
if (OrderType() == OP_SELL)
answ =OrderClose(ticket, Lots, Ask, Slippage, Red);
}
}
Sleep(2000);
return (answ);
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---