Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
Expert_1_3
#property copyright "Copyright © 2011 zvp.1976@gmail.com"
#property link "zvp.1976@gmail.com"
#include <stdlib.mqh>
// ==========================================================================================================================================================================================================
extern string Indicator_=" Íàñòðîéêè èíäèêàòîðà";
extern int MA_PER = 350;
extern int BOL_PER = 20;
extern double BOL_DEV = 2;
extern int MAX_HOUR_WAIT = 4;
extern bool EquityStop=False;
extern double EquityProcentClose=1.5;
extern string trade_="Íàñòðîéêè òîðãîâëè";
extern int Magic=777; // Ìàãè÷åñêèé íîìåð
extern int Slippage=20; // Ïðîñêàëüçûâàíèå
extern int StopOrderDelta=25; // Äèñòàíöèÿ äëÿ îòëîæåííûõ îðäåðîâ
extern double Lots=0.05; // Ôèêñèðâîàííûé ëîò
extern double LossProcent=0; // Çàêðûòü ñàìóþ óáûòî÷íóþ åñëè ïðîöåíò óáûòêîâ ïî âñåì ïîçèöèÿì áîëüøå óêàçàííîãî
extern bool allowtest=true;
datetime PrevTime,DeltaTime;
int timeCheckSignal=0; // Âðåìÿ îòêðûòèÿ ïîçèöèè
double sl,tp,TakeProfit,StopLoss;
double UpLine[];
double DownLine[];
double AverLine[],psar[];
double MA[],MA_2[];
double ktp,ksl;
double minsl,minstep,sprd,minlot,maxlot;
// ==========================================================================================================================================================================================================
int start()
{
string s0;
double MN_CL_DIF,ktp1,ktp2,ksl1,ksl2;
double curprof, minprof,sprd,psar1,pricein,pricein1;
int Signal,answ;
int curtime;
Sleep(2000);
Signal=0;
curprof =CalculateProfit();
if (curprof<0&&LossProcent>0)
if (MathAbs(curprof)>=(LossProcent*AccountBalance()/100))
{
answ = CloseMaxLoss();
}
if (EquityStop)
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;
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;
else
pricein =psar1;
Signal=1;
}
if(iTime(Symbol(),0,0)-PrevTime>0)
{
//+------------------------------------------------------------------+
// Åñëè ñèãíàë íà áàé:
//+------------------------------------------------------------------+
if(Signal==1)// buy
{
//Âû÷èñëÿåì öåíó âõîäà
pricein1 = Ask+StopOrderDelta*Point;
//Âû÷èñëÿåì ñòîïëîññ
if(StopLoss!=0)sl=Bid+StopOrderDelta*Point-StopLoss*Point; else sl=0;
// ÂÛ÷èñëÿåì òåéêïðîôèò
if(TakeProfit!=0)tp=pricein1+TakeProfit*Point; else tp=0;
//Îòêðûâàåì Îðäåð
i=SetOrder(Symbol(),OP_BUYSTOP,GetSizeLot(),pricein,sl,tp,Magic,Time[0]+MAX_HOUR_WAIT*60*60,"buy");
if (i>0)PrevTime=iTime(Symbol(),1,0);
}
//+------------------------------------------------------------------+
// Åñëè ñèãíàë íà ñåëë:
//+------------------------------------------------------------------+
if(Signal==2)// ñåëë
{
//Âû÷èñëÿåì öåíó âõîäà
pricein1 = Bid-StopOrderDelta*Point;
//Âû÷èñëÿåì ñòîïëîññ
if(StopLoss!=0)sl=Ask-StopOrderDelta*Point+StopLoss*Point; else sl=0;
// ÂÛ÷èñëÿåì òåéêïðîôèò
if(TakeProfit!=0)tp=pricein1-TakeProfit*Point; else tp=0;
//Îòêðûâàåì Îðäåð
i= SetOrder(Symbol(),OP_SELLSTOP,GetSizeLot(),pricein,sl,tp,Magic,Time[0]+MAX_HOUR_WAIT*60*60,"sell");
if (i>0)PrevTime=iTime(Symbol(),1,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 GetSizeLot(double ll=1) //Ôóíêöèÿ âîçâðàùàåò çíà÷åíèå ëîòîâ,
{
double MinLots=MarketInfo(Symbol(),MODE_MINLOT);
double MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
double Lot2=Lots;
if(Lot2 < MinLots) Lot2 = MinLots;
if(Lot2 > MaxLots) Lot2 = MaxLots;
return(NormalizeDouble(Lot2,2));
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
sprd=NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*Point,Digits);
minsl= MarketInfo(Symbol(),MODE_STOPLEVEL);
minstep=MarketInfo(Symbol(),MODE_LOTSTEP);
minlot= MarketInfo(Symbol(),MODE_MINLOT);
maxlot=MarketInfo(Symbol(),MODE_MAXLOT);
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
---