//Ýêñïåðò óñòàíàâëèâàåòñÿ íà ëþáóþ ïàðó â òåðìèíàëå ñî ñ÷¸òîì, íà êîòîðûé òðåáóåòñÿ ïåðåíîñèòü ñäåëêè.
//Ïðè ýòîì â îêíå "Îáçîð ðûíêà" äîëæíû áûòü îòîáðàæåíû âñå íåîáõîäèìûå èíñòðóìåíòû!!!
#property copyright "Copyright © Evgeniy Trofimov, 2009"
#property link "http://www.mql4.com/ru/users/EvgeTrofi"
#property show_inputs
//---------------------------------------------------------------------------
extern string FileName = "Orders.txt"; //- Èìÿ ôàéëà â êàòàëîãå TerminalPath()+"\experts\files",
// ñ êîòîðîãî áóäóò ñ÷èòûâàòüñÿ äàííûå î èçìåíåíèÿõ â îðäåðàõ.
extern int MagicStart = 50000000; //- Ýêñïåðò óäàëÿåò òîëüêî îðäåðà, ìàãèêè êîòîðûõ
extern int MagicEnd = 99999999; // âõîäÿò â óêàçàííûé çäåñü èíòåðâàë
extern int Sensitivity = 100; //- ×óâñòâèòåëüíîñòü ñèãíàëà â ïóíêòàõ.
extern double NewRisk = 1.0; //- Êîýôôèöèåíò èçìåíåíèÿ ðèñêà
extern bool LittleLots = true; //- Åñëè true, òî ïðè ëîòå ìåíüøå ìèíèìàëüíîäîïóñòèìîãî íà ýòîì ñ÷¸òå, áóäåò îòêðûò ìèíèìàëüíûé ëîò
extern int SP = 30; //- SleepPage - ïðåäåëüíîå îòêëîíåíèå îò öåíû
//---------------------------------------------------------------------------
int OCount;
int OTicket[1000];
string OSymbol[1000];
int OType[1000];
double ORisk[1000];
double OOP[1000];
double OSL[1000];
double OTP[1000];
//---------------------------------------------------------------------------
int start() {
int ticket;
double risk;
bool ALLRIGHT=true;
if(!FileExist(FileName)) return(0);
FileLoad(FileName);
//Óäàëÿåì îòñóòñòâóþùèå
if(CloseAllBeingAbsentPozitions()<0) return(0);
//Êîððåêòèðóåì ñóùåñòâóþùèå
for(int i=0; i<OCount; i++) {
ticket=OrderExist("", OTicket[i]);
if(ticket>0) {
if(OrderSelect(ticket,SELECT_BY_TICKET)) {
if(OrderType()<2) {
if(Modify(OSymbol[i], ticket, OSL[i], OTP[i])<0) ALLRIGHT=false;
} else {
ModifySleep(OSymbol[i], ticket, OOP[i], OSL[i], OTP[i]);
}
}
} else { //Îòêðûâàåì íîâûå ïîçèöèè è ñîçäà¸ì îòëîæåííûå îðäåðà
if(OrderInHistory(OSymbol[i], OTicket[i])==-1) {
if(OType[i]==OP_BUY) {
if(MathAbs(MarketInfo(OSymbol[i],MODE_ASK)-OOP[i])<Sensitivity*MarketInfo(OSymbol[i],MODE_POINT)) {
if(BUY(OSymbol[i],Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
}
} else if(OType[i]==OP_SELL) {
if(MathAbs(MarketInfo(OSymbol[i],MODE_BID)-OOP[i])<Sensitivity*MarketInfo(OSymbol[i],MODE_POINT)) {
if(SELL(OSymbol[i],Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
}
} else if(OType[i]==OP_BUYSTOP) {
if(BUYSleep(OSymbol[i], OOP[i], Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
} else if(OType[i]==OP_SELLSTOP) {
if(SELLSleep(OSymbol[i], OOP[i], Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
} else if(OType[i]==OP_BUYLIMIT) {
if(BUYRecoil(OSymbol[i], OOP[i], Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
} else if(OType[i]==OP_SELLLIMIT) {
if(SELLRecoil(OSymbol[i], OOP[i], Lot(OSymbol[i],ORisk[i]), OSL[i], OTP[i], OTicket[i])<0) ALLRIGHT=false;
}
}
}
}//Next i
if(ALLRIGHT) {
FileDelete(FileName);
}
return(0);
} //start()
//---------------------------------------------------------------------------
double Lot(string mySymbol="", double Risk=1.0) {
double lot;
//risk = 100*OrderLots()*MarketInfo(OrderSymbol(), MODE_MARGINREQUIRED)/AccountEquity();
if(mySymbol=="") mySymbol=Symbol();
lot = (Risk*AccountEquity())/(100*MarketInfo(mySymbol, MODE_MARGINREQUIRED));
double steplot=MarketInfo(mySymbol, MODE_LOTSTEP);
int LotsDigits = MathCeil(MathAbs(MathLog(steplot)/MathLog(10)));
lot=NormalizeDouble(lot*NewRisk, LotsDigits);
if(lot<MarketInfo(mySymbol, MODE_MINLOT) && LittleLots) lot=MarketInfo(mySymbol, MODE_MINLOT);
return(lot);
}//Lot()
//---------------------------------------------------------------------------
bool FileExist(string file) {
int handle=FileOpen(file,FILE_BIN);
if(handle<0) {
return(false);
} else {
FileClose(handle);
return(true);
}
}//FileExist()
//---------------------------------------------------------------------------
int FileLoad(string file) {
int i, j, k;
string buffer[1000];
int handle=FileOpen(file,FILE_BIN);
if(handle<0) {
return(-1);
} else {
k=FileReadArray(handle,buffer,0,1000);
FileClose(handle);
//OCount=0;
//while(!StringTrimRight(StringTrimLeft(buffer[OCount]))=="") {
for(OCount=0; OCount<k; OCount++) {
i = StringFind(buffer[OCount]," ",0);
ORisk[OCount]=StrToDouble(StringSubstr(buffer[OCount], 0,i));
j=i+1;
i = StringFind(buffer[OCount]," ",j);
OTicket[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,i-j));
j=i+1;
i = StringFind(buffer[OCount]," ",j);
OSymbol[OCount]=StringSubstr(buffer[OCount], j,i-j);
j=i+1;
i = StringFind(buffer[OCount]," ",j);
OType[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,i-j));
j=i+1;
i = StringFind(buffer[OCount]," ",j);
OOP[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,i-j));
j=i+1;
i = StringFind(buffer[OCount]," ",j);
OSL[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,i-j));
j=i+1;
OTP[OCount]=StrToDouble(StringSubstr(buffer[OCount], j,0));
//OCount++;
}//Next OCount
}
}//FileLoad()
//+------------------------------------------------------------------+
int OrderExist(string fSymbol="", int fMagic=0, int fType=-1) {
int total = OrdersTotal();
for (int i = total-1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==fSymbol || fSymbol=="") {
if(OrderMagicNumber()==fMagic || fMagic==0) {
if(OrderType()==fType||fType==-1) {
return(OrderTicket());
}
}
} // Åñëè ñâîé
} // Next i
return(-1);
}//OrderExist()
//+------------------------------------------------------------------+
int OrderInHistory(string fSymbol="", int fMagic=0, int fType=-1) {
int total = OrdersHistoryTotal();
for (int i = total-1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if(OrderSymbol()==fSymbol || fSymbol=="") {
if(OrderMagicNumber()==fMagic || fMagic==0) {
if(OrderType()==fType||fType==-1) {
return(OrderTicket());
}
}
} // Åñëè ñâîé
} // Next i
return(-1);
}//OrderExist()
//+------------------------------------------------------------------+
int CloseAllBeingAbsentPozitions() {
int LE;
double PriceClose;
bool Del;
int total = OrdersTotal();
for (int i = total-1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderMagicNumber()<MagicStart||OrderMagicNumber()>MagicEnd) continue;
Del=true;
for(int j=0; j<OCount; j++) {
if(OrderMagicNumber()==OTicket[j]) {
Del=false;
break;
}
}
if(Del) {
if(OrderType()>1&&OrderType()<6) {
OrderDelete(OrderTicket());
} else {
LE=135;
while(LE>134 && LE<139) {
if(OrderType()==OP_BUY) {
PriceClose=MarketInfo(OrderSymbol(),MODE_BID);
} else if(OrderType()==OP_SELL) {
PriceClose=MarketInfo(OrderSymbol(),MODE_ASK);
}
OrderClose(OrderTicket(),OrderLots(),PriceClose,SP);
LE = GetLastError();
if(LE>0) Print("ÑòàÔÔêà íå çàêðûâàåòñÿ ïî ïðè÷èíå àøèïêè ¹ ",LE);
}
if(LE>0) return(-1);
}
}
}
} // Next i
return(0);
}//CloseAllPozitions()
//+------------------------------------------------------------------+
int Modify(string mySymbol, int ticket, double sl = 0, double tp = 0) {
double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
if(OrderSelect(ticket, SELECT_BY_TICKET)) {
sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
if(OrderType()==OP_BUY) {
if(sl>0) {
if(MarketInfo(mySymbol,MODE_BID)-sl<stoplimit) {
Print("Ñëèøêîì áëèçêèé ñòîï (",(MarketInfo(mySymbol,MODE_BID)-sl)/MarketInfo(mySymbol,MODE_POINT)," ïóíêòîâ). Òðåáóåòñÿ íå ìåíåå: ", stoplimit/MarketInfo(mySymbol,MODE_POINT));
return(-1);
}
}
if(tp>0) {
if(tp-MarketInfo(mySymbol,MODE_ASK)<stoplimit) {
Print("Ñëèøêîì áëèçêèé ïðîôèò (",(tp-MarketInfo(mySymbol,MODE_ASK))/MarketInfo(mySymbol,MODE_POINT)," ïóíêòîâ). Òðåáóåòñÿ íå ìåíåå: ", stoplimit/MarketInfo(mySymbol,MODE_POINT));
return(-1);
}
}
} else if(OrderType()==OP_SELL) {
if(sl>0) {
if(sl-MarketInfo(mySymbol,MODE_ASK)<stoplimit) {
Print("Ñëèøêîì áëèçêèé ñòîï (",(sl-MarketInfo(mySymbol,MODE_ASK))/MarketInfo(mySymbol,MODE_POINT)," ïóíêòîâ). Òðåáóåòñÿ íå ìåíåå: ", stoplimit/MarketInfo(mySymbol,MODE_POINT));
return(-1);
}
}
if(tp>0) {
if(MarketInfo(mySymbol,MODE_BID)-tp<stoplimit) {
Print("Ñëèøêîì áëèçêèé ïðîôèò (",(MarketInfo(mySymbol,MODE_BID)-tp)/MarketInfo(mySymbol,MODE_POINT)," ïóíêòîâ). Òðåáóåòñÿ íå ìåíåå: ", stoplimit/MarketInfo(mySymbol,MODE_POINT));
return(-1);
}
}
}
if(DoubleToStr(OrderStopLoss(),MarketInfo(mySymbol,MODE_DIGITS))==DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS)) &&
DoubleToStr(OrderTakeProfit(),MarketInfo(mySymbol,MODE_DIGITS))==DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))) return(0);
if(OrderModify(ticket,OrderOpenPrice(), sl, tp, 0)==FALSE) {
Print("Îøèáêà OrderModify(): ",GetLastError());
return(-1);
}
}
return(0);
}//Modify()
//+------------------------------------------------------------------+
int ModifySleep(string mySymbol, int ticket, double price = 0.0, double sl = 0.0, double tp = 0.0) {
// Ìîäèôèêàöèÿ îòëîæåííûõ îðäåðîâ
double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
int LE;
if(OrderSelect(ticket, SELECT_BY_TICKET)) {
price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
if(OrderOpenPrice()==price && OrderStopLoss()==sl && OrderTakeProfit()==tp) return(0);
if(OrderType()==OP_BUYSTOP) {
if(price-MarketInfo(mySymbol,MODE_ASK)<stoplimit) return(0);
if(sl>0) if(price-spread-sl<stoplimit) return(0);
if(tp>0) if(tp-price<stoplimit) return(0);
} else if(OrderType()==OP_SELLSTOP) {
if(MarketInfo(mySymbol,MODE_BID)-price<stoplimit) return(0);
if(sl>0) if(sl-price-spread<stoplimit) return(0);
if(tp>0) if(price-tp<stoplimit) return(0);
}
if(OrderModify(ticket, price, sl, tp, 0)==FALSE) {
LE=GetLastError();
if(LE>1) Print("Îøèáêà OrderModify(): ",LE);
}
}
return(0);
}//ModifySleep()
//+------------------------------------------------------------------+
int BUY(string mySymbol="", double lt=0, double sl=0, double tp=0, int mn=0) {
if(mySymbol=="") mySymbol=Symbol();
double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
int ticket = -1; //ïîêóïàåì ïî öåíå Ask
int LE=135;
if(lt<MarketInfo(mySymbol, MODE_MINLOT)) return(0);
if(lt>MarketInfo(mySymbol, MODE_MAXLOT)) lt=MarketInfo(mySymbol, MODE_MAXLOT);
if(lt>AccountFreeMargin()*0.90/MarketInfo(mySymbol,MODE_MARGINREQUIRED)) lt=AccountFreeMargin()*0.90/MarketInfo(mySymbol,MODE_MARGINREQUIRED);
lt = NormalizeDouble(lt, MathAbs(MathLog(MarketInfo(mySymbol, MODE_LOTSTEP))/MathLog(10.0))+0.5);
if(sl>0) {
sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
if(MarketInfo(mySymbol,MODE_BID)-sl<stoplimit) sl=MarketInfo(mySymbol,MODE_BID)-stoplimit;
}
if(tp>0) {
tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
if(tp-MarketInfo(mySymbol,MODE_ASK)<stoplimit) tp=MarketInfo(mySymbol,MODE_ASK)+stoplimit;
}
while(LE>134 && LE<139) {
ticket = OrderSend(mySymbol, OP_BUY, lt, MarketInfo(mySymbol,MODE_ASK), SP, sl, tp, WindowExpertName(), mn, 0, Blue);
LE = GetLastError();
Sleep(2000);
RefreshRates();
}
if (ticket > 0) Sleep(10000);
return(ticket);
}//BUY()
//+------------------------------------------------------------------+
int SELL(string mySymbol="", double lt=0, double sl=0, double tp=0, int mn=0) {
if(mySymbol=="") mySymbol=Symbol();
double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
int ticket = -1; //ïðîäà¸ì ïî öåíå Bid
int LE=135;
if(lt<MarketInfo(mySymbol, MODE_MINLOT)) return(0);
if(lt>MarketInfo(mySymbol, MODE_MAXLOT)) lt=MarketInfo(mySymbol, MODE_MAXLOT);
if(lt>AccountFreeMargin()*0.90/MarketInfo(mySymbol,MODE_MARGINREQUIRED)) lt=AccountFreeMargin()*0.90/MarketInfo(mySymbol,MODE_MARGINREQUIRED);
lt = NormalizeDouble(lt, MathAbs(MathLog(MarketInfo(mySymbol, MODE_LOTSTEP))/MathLog(10.0))+0.5);
if(sl>0) {
sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
if(sl-MarketInfo(mySymbol,MODE_ASK)<stoplimit) sl=MarketInfo(mySymbol,MODE_ASK)+stoplimit;
}
if(tp>0) {
tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
if(MarketInfo(mySymbol,MODE_BID)-tp<stoplimit) tp=MarketInfo(mySymbol,MODE_BID)-stoplimit;
}
while(LE>134 && LE<139) {
ticket = OrderSend(mySymbol, OP_SELL, lt, MarketInfo(mySymbol,MODE_BID), SP, sl, tp, WindowExpertName(), mn, 0, Red);
LE = GetLastError();
Sleep(2000);
RefreshRates();
}
if (ticket > 0) Sleep(10000);
return(ticket);
}//SELL()
//+------------------------------------------------------------------+
int BUYSleep(string mySymbol="", double price=0, double lt=0, double sl=0, double tp=0, int mn=0) {
// Ñîçäàíèå îòëîæåííûõ îðäåðîâ íà ïîêóïêó (òåêóùàÿ öåíà íèæå price)
if(mySymbol=="") mySymbol=Symbol();
double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
int ticket = -1; //ïîêóïàåì ïî öåíå Ask
Print("Ïîïûòêà ñîçäàòü îòëîæåííûé îðäåð íà ïîêóïêó "+mySymbol+" ïî öåíå "+DoubleToStr(price,MarketInfo(mySymbol,MODE_DIGITS))+
", sl="+DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS))+
", tp="+DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))+
", Ask="+DoubleToStr(MarketInfo(mySymbol,MODE_ASK),MarketInfo(mySymbol,MODE_DIGITS))+
", Bid="+DoubleToStr(MarketInfo(mySymbol,MODE_BID),MarketInfo(mySymbol,MODE_DIGITS)));
price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
if(price-MarketInfo(mySymbol,MODE_ASK)<stoplimit) {
Print("Ïðåâûøåíà ìèíèìàëüíàÿ ãðàíèöà âûñòàâëåíèÿ îòëîæåííîãî îðäåðà íà ïîêóïêó ïî öåíå îòêðûòèÿ");
Print("Ìèíèìàëüíàÿ ãðàíèöà ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ");
return(-1);
}
if(sl>0) {
sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
if(price-spread-sl<stoplimit) {
Print("BUYSleep: Íåïðàâèëüíàÿ ãðàíèöà StopLoss. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Bid");
return(-1);
}
}
if(tp>0) {
tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
if(tp-price<stoplimit) {
Print("BUYSleep: Íåïðàâèëüíàÿ ãðàíèöà TakeProfit. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Ask");
return(-1);
}
}
ticket = OrderSend(mySymbol, OP_BUYSTOP, lt, price, SP, sl, tp, WindowExpertName(), mn, 0, Blue);
if (ticket > 0) Sleep(2000);
return(ticket);
}//BUYSleep()
//+------------------------------------------------------------------+
int SELLSleep(string mySymbol="", double price=0, double lt=0, double sl=0, double tp=0, int mn=0) {
// Ñîçäàíèå îòëîæåííûõ îðäåðîâ íà ïðîäàæó (òåêóùàÿ öåíà âûøå price)
if(mySymbol=="") mySymbol=Symbol();
double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
int ticket = -1; //ïðîäà¸ì ïî öåíå Bid
Print("Ïîïûòêà ñîçäàòü îòëîæåííûé îðäåð íà ïðîäàæó "+mySymbol+" ïî öåíå "+DoubleToStr(price,MarketInfo(mySymbol,MODE_DIGITS))+
", sl="+DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS))+
", tp="+DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))+
", Ask="+DoubleToStr(MarketInfo(mySymbol,MODE_ASK),MarketInfo(mySymbol,MODE_DIGITS))+
", Bid="+DoubleToStr(MarketInfo(mySymbol,MODE_BID),MarketInfo(mySymbol,MODE_DIGITS)));
price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
if(MarketInfo(mySymbol,MODE_BID)-price<stoplimit) {
Print("Ïðåâûøåíà ìèíèìàëüíàÿ ãðàíèöà âûñòàâëåíèÿ îòëîæåííîãî îðäåðà íà ïðîäàæó ïî öåíå îòêðûòèÿ");
Print("Ìèíèìàëüíàÿ ãðàíèöà ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ");
return(-1);
}
if(sl>0) {
sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
if(sl-price-spread<stoplimit) {
Print("SELLSleep: Íåïðàâèëüíàÿ ãðàíèöà StopLoss. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Bid");
return(-1);
}
}
if(tp>0) {
tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
if(price-tp<stoplimit) {
Print("SELLSleep: Íåïðàâèëüíàÿ ãðàíèöà TakeProfit. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Ask");
return(-1);
}
}
ticket = OrderSend(mySymbol, OP_SELLSTOP, lt, price, SP, sl, tp, WindowExpertName(), mn, 0, Red);
if (ticket > 0) Sleep(2000);
return(ticket);
}//SELLSleep()
//+------------------------------------------------------------------+
int BUYRecoil(string mySymbol="", double price=0, double lt=0, double sl=0, double tp=0, int mn=0) { //Òîðãîâëÿ íà îòñêîê
// Ñîçäàíèå îòëîæåííûõ îðäåðîâ íà ïîêóïêó (òåêóùàÿ öåíà âûøå price)
if(mySymbol=="") mySymbol=Symbol();
double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
int ticket = -1; //ïîêóïàåì ïî öåíå Ask
Print("Ïîïûòêà ñîçäàòü îòëîæåííûé îðäåð íà ïîêóïêó "+mySymbol+" ïî öåíå "+DoubleToStr(price,MarketInfo(mySymbol,MODE_DIGITS))+
", sl="+DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS))+
", tp="+DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))+
", Ask="+DoubleToStr(MarketInfo(mySymbol,MODE_ASK),MarketInfo(mySymbol,MODE_DIGITS))+
", Bid="+DoubleToStr(MarketInfo(mySymbol,MODE_BID),MarketInfo(mySymbol,MODE_DIGITS)));
price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
if(MarketInfo(mySymbol,MODE_BID)-price<stoplimit) {
Print("Ïðåâûøåíà ìèíèìàëüíàÿ ãðàíèöà âûñòàâëåíèÿ îòëîæåííîãî îðäåðà íà ïîêóïêó ïî öåíå îòêðûòèÿ");
Print("BUYRecoil: Ìèíèìàëüíàÿ ãðàíèöà ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ");
return(-1);
}
if(sl>0) {
if(price-spread-sl<stoplimit) {
Print("BUYRecoil: Íåïðàâèëüíàÿ ãðàíèöà StopLoss. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Bid");
return(-1);
}
}
if(tp>0) {
if(tp-price<stoplimit) {
Print("BUYRecoil: Íåïðàâèëüíàÿ ãðàíèöà TakeProfit. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Ask");
return(-1);
}
}
ticket = OrderSend(mySymbol, OP_BUYLIMIT, lt, price, SP, sl, tp, WindowExpertName(), mn, 0, Blue);
if (ticket > 0)
Sleep(2000);
else
Print("Îøèáêà:",GetLastError());
return(ticket);
}//BUYRecoil()
//+------------------------------------------------------------------+
int SELLRecoil(string mySymbol="", double price=0, double lt=0, double sl=0, double tp=0, int mn=0) { //Òîðãîâëÿ íà îòñêîê
// Ñîçäàíèå îòëîæåííûõ îðäåðîâ íà ïðîäàæó (òåêóùàÿ öåíà íèæå price)
if(mySymbol=="") mySymbol=Symbol();
double stoplimit=MarketInfo(mySymbol, MODE_STOPLEVEL)*MarketInfo(mySymbol,MODE_POINT);
double spread=MarketInfo(mySymbol, MODE_SPREAD)*MarketInfo(mySymbol,MODE_POINT);
int ticket = -1; //ïðîäà¸ì ïî öåíå Bid
Print("Ïîïûòêà ñîçäàòü îòëîæåííûé îðäåð íà ïðîäàæó "+mySymbol+" ïî öåíå "+DoubleToStr(price,MarketInfo(mySymbol,MODE_DIGITS))+
", sl="+DoubleToStr(sl,MarketInfo(mySymbol,MODE_DIGITS))+
", tp="+DoubleToStr(tp,MarketInfo(mySymbol,MODE_DIGITS))+
", Ask="+DoubleToStr(MarketInfo(mySymbol,MODE_ASK),MarketInfo(mySymbol,MODE_DIGITS))+
", Bid="+DoubleToStr(MarketInfo(mySymbol,MODE_BID),MarketInfo(mySymbol,MODE_DIGITS)));
price=NormalizeDouble(price,MarketInfo(mySymbol,MODE_DIGITS));
if(price-MarketInfo(mySymbol,MODE_ASK)<stoplimit) {
Print("Ïðåâûøåíà ìèíèìàëüíàÿ ãðàíèöà âûñòàâëåíèÿ îòëîæåííîãî îðäåðà íà ïðîäàæó ïî öåíå îòêðûòèÿ");
Print("SELLRecoil: Ìèíèìàëüíàÿ ãðàíèöà ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ");
return(-1);
}
if(sl>0) {
sl=NormalizeDouble(sl,MarketInfo(mySymbol,MODE_DIGITS));
if(sl-price-spread<stoplimit) {
Print("SELLRecoil: Íåïðàâèëüíàÿ ãðàíèöà StopLoss. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Bid");
return(-1);
}
}
if(tp>0) {
tp=NormalizeDouble(tp,MarketInfo(mySymbol,MODE_DIGITS));
if(price-tp<stoplimit) {
Print("SELLRecoil: Íåïðàâèëüíàÿ ãðàíèöà TakeProfit. Ìèíèìóì: ",stoplimit/MarketInfo(mySymbol,MODE_POINT), " ïóíêòîâ îò öåíû Ask");
return(-1);
}
}
ticket = OrderSend(mySymbol, OP_SELLLIMIT, lt, price, SP, sl, tp, WindowExpertName(), mn, 0, Red);
if (ticket > 0)
Sleep(2000);
else
Print("Îøèáêà:",GetLastError());
return(ticket);
}//SELLRecoil()
//+------------------------------------------------------------------+
Comments