Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
ExpertAdvisor_sl_tp
//+------------------------------------------------------------------+
//| ExpertAdvisor.mq4 |
//| sanyooooook |
//| http://sn-bot.ru |
//+------------------------------------------------------------------+
#property copyright "sanyooooook"
#property link "http://sn-bot.ru"
#property version "1.01"
#property strict
extern int Magik=12345;//magic number
extern double TakeProfit=30;
extern double StopLoss=30;
extern double TrailingStop=15;
extern double Lot=0.1;
extern int PeriodMA_Fast=6,//the period fast MA
PeriodMA_Slow=24,//the period slow MA
Sig_Period=5;//period of the signal MA
extern int Slp=3;//Slippage
int Slippage=0;
datetime ti=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Slippage=Slp;
if(_Digits==3 || _Digits==5)
{
Slippage=Slippage*10;
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
int total=0;//tBuy=0,tSell=0;//,tBS=0,tSS=0,tBL=0,tSL=0;
int Signal=Signal_();//ïðîâåðÿåì ñèãíàë
//áëîê ïðîâåðêè ñèòóàöèè ïî îðäåðàì
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()==Magik)
{
total++;
int cmd=OrderType();
switch(cmd)
{
case OP_BUY://åñëè âûáðàëè îðäåð íà ïîêóïêó
{
if(Signal==(-1))//åñëè åñòü ïðîòèâîïîëîæíèé ñèãíàë äëÿ òåêóùåãî îðäåðà, òî çàêðûâàåì
{
if(OrderClose(OrderTicket(),OrderLots(),n(Bid,_Symbol),Slippage))
{
total--;
break;
}
}
if(TrailingStop>0)//ñþäà âñòàâèë êóñîê êîäà îòâå÷àþùåãî çà òðåéëèíã ïîêóïêè
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
//--- modify order and exit
if(OrderStopLoss()!=n(Bid-Point*TrailingStop,_Symbol))
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),n(Bid-Point*TrailingStop,_Symbol),OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
}
break;
}
}
}
break;
}
case OP_SELL://åñëè ûâáðàëè îðäåðà íà ïðîäàæó
{
if(Signal==1)//åñëè åñòü ïðîòèâîïîëîæíèé ñèãíàë äëÿ òåêóùåãî îðäåðà, òî çàêðûâàåì
{
if(OrderClose(OrderTicket(),OrderLots(),n(Ask,_Symbol),Slippage))
{
total--;
break;
}
}
if(TrailingStop>0)//ñþäà âñòàâèë êóñîê êîäà îòâå÷àþùåãî çà òðåéëèíã ïðîäàæè
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
//--- modify order and exit
if(OrderStopLoss()!=n(Ask+Point*TrailingStop,_Symbol))
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),n(Ask+Point*TrailingStop,_Symbol),OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
}
break;
}
}
}
break;
}
default: break;
}
}
} //ÊÎÍÅÖ áëîê ïðîâåðêè ñèòóàöèè ïî îðäåðàì
//Íà îñíîâàíèè ïîñëåäíåãî ñèãíàëà è òåêóùåé ñèòóàöèè ïî îðäåðàì ïðèíèìàåì ðåøåíèå:
//îòêðûâàòü, çàêðûâàòü, ìîäèôèöèðîâàòü èëè îñòàâèòü áåç èçìåíåíèé îðäåð.
if(ti!=Time[0])//åñëè âðåìÿ òåêóùåãî áàðà íå ðàâíî çàïîìíåííîìó, ïðîáóåì îòêðûòü îðäåð åñëè åñòü ñèãíàë
{
if(total==0)//åñëè íåò îòêðûòûõ îäåðîâ
{
switch(Signal)
{
case 1://åñëè ñèãíàë íà ïîêóïêó
{
if(OpenOrders(_Symbol,OP_BUY,Ask,Lot,Slippage,StopLoss,TakeProfit,Magik,"","",true)>0)
//åñëè îðäåð îòêðûò óñïåøíî, íî çàïîìèíàåì âðåìÿ òåêóùåãî áàðà
{
ti=Time[0];
}
break;
}
case(-1)://åñëè ñèãíàë íà ïðîäàæó
{
if(OpenOrders(_Symbol,OP_SELL,Bid,Lot,Slippage,StopLoss,TakeProfit,Magik,"","",true)>0)
//åñëè îðäåð îòêðûò óñïåøíî, íî çàïîìèíàåì âðåìÿ òåêóùåãî áàðà
{
ti=Time[0];
}
break;
}
}
}
}
}//ÊÎÍÅÖ //Íà îñíîâàíèè ïîñëåäíåãî ñèãíàëà è òåêóùåé ñèòóàöèè ïî îðäåðàì ïðèíèìàåì ðåøåíèå:
//îòêðûâàòü, çàêðûâàòü, ìîäèôèöèðîâàòü èëè îñòàâèòü áåç èçìåíåíèé îðäåð.
//+------------------------------------------------------------------+
int Signal_()
{
double MACD1=iMACD(NULL,0,PeriodMA_Fast,PeriodMA_Slow,Sig_Period,0,MODE_MAIN,1);
double MACD2=iMACD(NULL,0,PeriodMA_Fast,PeriodMA_Slow,Sig_Period,0,MODE_MAIN,2);
if(MACD1>=0 && MACD2<=0)return(1);//ïåðåñå÷åíèå ÌÀ ñíèçó ââåðõ
if(MACD1<=0 && MACD2>=0)return(-1);//ïåðåñå÷åíèå ÌÀ ñâåðõó âíèç
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OpenOrders(string Symb,//Symbol
int cmd,//Type
double OpenPrice,
double lot,
int slip,//Slippage
double SL,//StopLoss
double TP,//TakeProfit
int MG,//Magik
string PP,//Comment Log
string coment,//CommentOrder
bool OpenStops=true)//ECN - false
{
Print("Send: ","Symb=",Symb,", cmd=",cmd,", OpenPrice=",OpenPrice,", lot=",lot,", slip=",slip,", SL=",SL,", TP=",TP,", MG=",MG,", PP=",PP,", coment=",coment,", OpenStops=",OpenStops);
double PriceSL=0;
double PriceTP=0;
int ticket=-1;
lot=NL(Symb,lot);//NormalizeLot
double Point_=MarketInfo(Symb,MODE_POINT);
if(lot>MarketInfo(Symb,MODE_MAXLOT))
{
Print("lot > MAXLOT!");return(-1);
}
if(lot<MarketInfo(Symb,MODE_MINLOT))
{
Print("lot < MINLOT!");return(-1);
}
if(FreeEquity(Symb,lot)==(-1))return(-1);//check the availability of the free margin for opening an order
int err=0;
RefreshRates();
int StopLevel=int(MarketInfo(Symb,MODE_STOPLEVEL));
if(SL<StopLevel&&SL!=0)SL=StopLevel+1;
if(TP<StopLevel&&TP!=0)TP=StopLevel+1;
double Ask_=n(MarketInfo(Symb,MODE_ASK),Symb),Bid_=n(MarketInfo(Symb,MODE_BID),Symb);
Print("Ask=",Ask_,", Bid=",Bid_,", STOPLEVEL=",StopLevel);
switch(cmd)
{
case OP_SELL:
{
TP=TP*(-1);
if(SL>0||SL<0)PriceSL=n(Bid_+SL*Point_,Symb);else PriceSL=0;
if(TP>0||TP<0)PriceTP=n(Bid_+TP*Point_,Symb);else PriceTP=0;
if(OpenStops)
{
ticket=OrderSend(Symb,cmd,lot,Bid_,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
if(ticket>=0)
{
Print("Open SELL "+string(ticket));return(ticket);
}
} else {ticket=OrderSend(Symb,cmd,lot,Bid_,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open SELL "+string(ticket));
}
break;
}
case OP_BUY:
{
SL=SL*(-1);
if(SL>0||SL<0)PriceSL=n(Ask_+SL*Point_,Symb); else PriceSL=0;
if(TP>0||TP<0)PriceTP=n(Ask_+TP*Point_,Symb); else PriceTP=0;
if(OpenStops)
{
ticket=OrderSend(Symb,cmd,lot,Ask_,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
if(ticket>=0)
{
Print("Open BUY "+string(ticket));return(ticket);
}
} else {ticket=OrderSend(Symb,cmd,lot,Ask_,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open BUY "+string(ticket));
}
break;
}
case OP_BUYLIMIT:
{
SL=SL*(-1);
if(SL>0||SL<0)PriceSL=n(OpenPrice+SL*Point_,Symb); else PriceSL=0;
if(TP>0||TP<0)PriceTP=n(OpenPrice+TP*Point_,Symb); else PriceTP=0;
if(OpenStops)
{
ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
if(ticket>=0)
{
Print("Open BUYLIMIT "+string(ticket));return(ticket);
}
} else {ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open BUYLIMIT "+string(ticket));
}
break;
}
case OP_BUYSTOP:
{
SL=SL*(-1);
if(SL>0||SL<0)PriceSL=n(OpenPrice+SL*Point_,Symb); else PriceSL=0;
if(TP>0||TP<0)PriceTP=n(OpenPrice+TP*Point_,Symb); else PriceTP=0;
if(OpenStops)
{
ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
if(ticket>=0)
{
Print("Open BUYSTOP "+string(ticket));return(ticket);
}
} else {ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open BUYSTOP "+string(ticket));
}
break;
}
case OP_SELLLIMIT:
{
TP=TP*(-1);
if(SL>0||SL<0)PriceSL=n(OpenPrice+SL*Point_,Symb); else PriceSL=0;
if(TP>0||TP<0)PriceTP=n(OpenPrice+TP*Point_,Symb); else PriceTP=0;
if(OpenStops)
{
ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
if(ticket>=0)
{
Print("Open SELLLIMIT "+string(ticket));return(ticket);
}
} else {ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open SELLLIMIT "+string(ticket));
}
break;
}
case OP_SELLSTOP:
{
TP=TP*(-1);
if(SL>0||SL<0)PriceSL=n(OpenPrice+SL*Point_,Symb); else PriceSL=0;
if(TP>0||TP<0)PriceTP=n(OpenPrice+TP*Point_,Symb); else PriceTP=0;
if(OpenStops)
{
ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,PriceSL,PriceTP,coment,MG);err=GetLastError();
if(ticket>=0)
{
Print("Open SELLSTOP "+string(ticket));return(ticket);
}
} else {ticket=OrderSend(Symb,cmd,lot,OpenPrice,slip,0,0,coment,MG);err=GetLastError();if(ticket>=0)Print("Open SELLSTOP "+string(ticket));
}
break;
}
}
if(ticket<=0)
{
Print("error open #",err,PP);
}
else
{
if(TP==0&&SL==0)return(ticket);
if(OrderSelect(ticket,SELECT_BY_TICKET))
{
RefreshRates();
if(PriceTP==OrderTakeProfit()&&PriceSL==OrderStopLoss()) return(ticket);
else
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),PriceSL,PriceTP,0)==false)
{
Print("error modify#",GetLastError(),PP);
}
else Print("Order #",OrderTicket(),", successfully modified.");
}
}
}
return(ticket);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int FreeEquity(string Symb,double lot)
{
int res=0;
if(MarketInfo(Symb,MODE_MARGINREQUIRED)*lot<AccountFreeMargin())
{
Print(MarketInfo(Symb,MODE_MARGINREQUIRED)*lot," ",AccountEquity());
}
else
{
Print("Insufficient funds for the opening position of the volume");
res=(-1);
}
return(res);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double NL(string Sym,double lots)
{
double step=MarketInfo(Sym,MODE_LOTSTEP);
return (MathRound(lots/step)*step);
}
//+------------------------------------------------------------------+
double n(double v,string S)
{return(NormalizeDouble(v,int(MarketInfo(S,MODE_DIGITS))));}
//+------------------------------------------------------------------+
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
---