Orders Execution
Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
Range_v4
//+------------------------------------------------------------------+
//| Range.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Oleg Tsarkov"
#property link "OlegTsarkov@yandex.ru"
//---- input parameters
extern int MAFast=50; //ñãëàæèâàíèå äëÿ òðåíäîâîãî èíäèêàòîðà íà ìàëîì òàéìôðåéìå
extern int IndFast=1; //òèï èíäèêàòîðà (âûáèðàåòñÿ èç ôóíêöèè TrendPMZ)
extern int TFFast=PERIOD_M1; //ïåðèîä ìàëîãî ÒÔ
extern int MASlow=50; //ñãëàæèâàíèå äëÿ òðåíäîâîãî èíäèêàòîðà íà áîëüøîì òàéìôðåéìå
extern int IndSlow=1; //òèï èíäèêàòîðà (âûáèðàåòñÿ èç ôóíêöèè TrendPMZ)
extern int TFSlow=PERIOD_H1; //ïåðèîä áîëüøîãî ÒÔ
extern double BasePoint=1.2; //íèæíÿÿ ãðàíèöà ñåòêè äëÿ buy
extern double BasePointHighLevel=1.6; //âåðõíÿÿ ãðàíèöà ñåòêè äëÿ buy
extern int Shift=100; //ñäâèã âíèç äëÿ sell
extern int TProf=460; //òåéêïðîôèò, åñëè íå èñïîëüçóåòñÿ òðåéëèíã (íà òðåéëèíãå - 0)
extern int Step=500; //øàã ñåòêè
extern int TrATR1=5; //ïàðàìåòðû ATR äëÿ òðåéëèíãà
extern int TrATR2=36;
extern bool TrailYN=false; //èñïîëüçîâàòü èëè íåò òðåéëèíã
extern int TrendUpDn=0; //"1"-îòêðûâàòü òîëüêî buy,"-1"-òîëüêî sell,"0"-âåçäå
extern int OnlyFastSlow=0; //0- èñïîëüçîâàòü îáà èíäèêàòîðà, 1-ìàëûé ÒÔ, 2-áîëüøîé ÒÔ, 3- áåç èíäèêàòîðîâ
extern double BaseLot=0.01;
extern int _MM=0; //ìàíèìåíåäæìåíò, 0- ðàçìåð ëîòà íå ìåíÿåòñÿ, 1-ëîò ïðîïîðöèîíàëåí áàëàíñó, 2-ëîò ïðîïîðöèîíàëåí êâàäðàòíîìó êîðíþ èç áàëàíñà
bool Work=true; // Ýêñïåðò áóäåò ðàáîòàòü.
int Ticket; // Íîìåð îðäåðà
double CurLot;
string Komment="RangeX"; //Êîììåíòàðèé äëÿ îðäåðîâ, èñïîëüçóåòñÿ êàê ôèëüòð "ñâîé-÷óæîé"
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
//ðàñ÷åò ðàçìåðà ëîòà-----------------------------------------------------------------------
CurLot=LotSize();
//òðåéëèíã íà÷àëî------------------------------------------------------------------------
int i;
if (TrailYN==true)
{
for(i=1; i<=OrdersTotal(); i++) // Öèêë ïåðåáîðà îðäåðîâ
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol())continue; //íå íàø èíñòðóìåíò
if (OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; //íå íàø òèï
if (StringSubstr(OrderComment(),0,6)!=Komment)continue; // Íå íàø îðäåð
TrailingByATR(OrderTicket(),60,TrATR1,1,TrATR2,1,1,false);
}
}
}
//òðåéëèíã êîíåö-------------------------------------------------------------------------
int MindFast=TrendPMZ(MAFast,TFFast,1); //îïðåäåëåíèå íàïðàâëåíèÿ òðåíäà íà ìàëîì ÒÔ
int MindSlow=TrendPMZ(MASlow,TFSlow,1); //îïðåäåëåíèå íàïðàâëåíèÿ òðåíäà íà áîëüøîì ÒÔ
int MindRez=0;
if (OnlyFastSlow==0)
{
if (TrendUpDn==0)
{
if (MindFast==1&&MindSlow==1) MindRez=1;
if (MindFast==-1&&MindSlow==-1) MindRez=-1;
}
if (TrendUpDn==1)
{
if (MindFast==1&&MindSlow==1) MindRez=1;
}
if (TrendUpDn==-1)
{
if (MindFast==-1&&MindSlow==-1) MindRez=-1;
}
}
if (OnlyFastSlow==1)
{
if (TrendUpDn==0)
{
if (MindFast==1) MindRez=1;
if (MindFast==-1) MindRez=-1;
}
if (TrendUpDn==1)
{
if (MindFast==1) MindRez=1;
}
if (TrendUpDn==-1)
{
if (MindFast==-1) MindRez=-1;
}
}
if (OnlyFastSlow==2)
{
if (TrendUpDn==0)
{
if (MindSlow==1) MindRez=1;
if (MindSlow==-1) MindRez=-1;
}
if (TrendUpDn==1)
{
if (MindSlow==1) MindRez=1;
}
if (TrendUpDn==-1)
{
if (MindSlow==-1) MindRez=-1;
}
}
if (OnlyFastSlow==3)
{
MindRez=TrendUpDn;
}
LimOrdServ(MindRez);
//----
return(0);
}
//+------------------------------------------------------------------+
int Fun_Error(int Error) // Ô-èÿ îáðàáîò îøèáîê
{
switch(Error)
{ // Ïðåîäîëèìûå îøèáêè
case 4: Alert("Òîðãîâûé ñåðâåð çàíÿò. Ïðîáóåì åù¸ ðàç..");
Sleep(3000); // Ïðîñòîå ðåøåíèå
return(1); // Âûõîä èç ôóíêöèè
case 135:Alert("Öåíà èçìåíèëàñü. Ïðîáóåì åù¸ ðàç..");
RefreshRates(); // Îáíîâèì äàííûå
return(1); // Âûõîä èç ôóíêöèè
case 136:Alert("Íåò öåí. Æä¸ì íîâûé òèê..");
while(RefreshRates()==false) // Äî íîâîãî òèêà
Sleep(1); // Çàäåðæêà â öèêëå
return(1); // Âûõîä èç ôóíêöèè
case 137:Alert("Áðîêåð çàíÿò. Ïðîáóåì åù¸ ðàç..");
Sleep(3000); // Ïðîñòîå ðåøåíèå
return(1); // Âûõîä èç ôóíêöèè
case 146:Alert("Ïîäñèñòåìà òîðãîâëè çàíÿòà. Ïðîáóåì åù¸..");
Sleep(500); // Ïðîñòîå ðåøåíèå
return(1); // Âûõîä èç ôóíêöèè
// Êðèòè÷åñêèå îøèáêè
case 2: Alert("Îáùàÿ îøèáêà.");
return(0); // Âûõîä èç ôóíêöèè
case 5: Alert("Ñòàðàÿ âåðñèÿ òåðìèíàëà.");
Work=false; // Áîëüøå íå ðàáîòàòü
return(0); // Âûõîä èç ôóíêöèè
case 64: Alert("Ñ÷åò çàáëîêèðîâàí.");
Work=false; // Áîëüøå íå ðàáîòàòü
return(0); // Âûõîä èç ôóíêöèè
case 133:Alert("Òîðãîâëÿ çàïðåùåíà.");
return(0); // Âûõîä èç ôóíêöèè
case 134:Alert("Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè.");
return(0); // Âûõîä èç ôóíêöèè
default: Alert("Âîçíèêëà îøèáêà ",Error); // Äðóãèå âàðèàíòû
return(0); // Âûõîä èç ôóíêöèè
}
}
//----------------------------------------------------------------------
// ïðîöåäóðà òðåéëèíãà, âçÿë îòñþäà:
//http://forexsystems.ru/yazyk-programmirovaniya-mql4/8599-biblioteka-funkcii-dlya-treilinga-trailingall.html
//ñïàñèáî àâòîðó
void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss)
{
// ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
//Print("ticket: ",ticket,", atr1_period: ",atr1_period,", atr2_period: ",atr2_period,", coeff: ",coeff,", OrderSelect(ticket,SELECT_BY_TICKET): ",OrderSelect(ticket,SELECT_BY_TICKET),", atr_timeframe: ",atr_timeframe,", atr1_shift: ",atr1_shift,", atr2_shift: ",atr2_shift);
if ((ticket==0) || (atr1_period<1) || (atr2_period<1) || (coeff==0) || (coeff<0) || (!OrderSelect(ticket,SELECT_BY_TICKET)) ||
((atr_timeframe!=1) && (atr_timeframe!=5) && (atr_timeframe!=15) && (atr_timeframe!=30) && (atr_timeframe!=60) &&
(atr_timeframe!=240) && (atr_timeframe!=1440) && (atr_timeframe!=10080) && (atr_timeframe!=43200)) || (atr1_shift<0) || (atr2_shift<0))
{
Print("Òðåéëèíã ôóíêöèåé TrailingByATR() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
return(0);
}
double curr_atr1; // òåêóùåå çíà÷åíèå ATR - 1
double curr_atr2; // òåêóùåå çíà÷åíèå ATR - 2
double best_atr; // áîëüøåå èç çíà÷åíèé ATR
double atrXcoeff; // ðåçóëüòàò óìíîæåíèÿ áîëüøåãî èç ATR íà êîýôôèöèåíò
double newstop; // íîâûé ñòîïëîññ
// òåêóùåå çíà÷åíèå ATR-1, ATR-2
curr_atr1 = iATR(Symbol(),atr_timeframe,atr1_period,atr1_shift);
curr_atr2 = iATR(Symbol(),atr_timeframe,atr2_period,atr2_shift);
// áîëüøåå èç çíà÷åíèé
best_atr = MathMax(curr_atr1,curr_atr2);
// ïîñëå óìíîæåíèÿ íà êîýôôèöèåíò
atrXcoeff = best_atr * coeff;
// åñëè äëèííàÿ ïîçèöèÿ (OP_BUY)
if (OrderType()==OP_BUY)
{
// îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
newstop = Bid - atrXcoeff;
// åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
if (trlinloss==true)
{
// ïðîâåðÿåì, ÿâëÿåòñÿ ëè îí ëó÷øå òåêóùåãî ñòîïëîññà, åñëè äà, òî ïîñëåäíèé êîððåêòèðóåì
if (newstop>OrderStopLoss())
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
else
{
Print("Bid: ",Bid,", atrXcoeff: ",atrXcoeff,", newstop: ",newstop);
// èíà÷å òðàëèòü íà÷èíàåì òîëüêî òîãäà, êîãäà ñòîïëîññ ëó÷øå êóðñà îòêðûòèÿ (â ïðîôèòå)
if ((newstop>OrderStopLoss()) && (newstop>OrderOpenPrice()))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
// åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL)
if (OrderType()==OP_SELL)
{
// îòêëàäûâàåì îò òåêóùåãî êóðñà (íîâûé ñòîïëîññ)
newstop = Ask + (atrXcoeff + MarketInfo(Symbol(),MODE_SPREAD)*Point);
// åñëè trlinloss==true (ò.å. ñëåäóåò òðàëèòü â çîíå ëîññîâ), òî
if (trlinloss==true)
{
// åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì â ëþáîì ñëó÷àå
if (OrderStopLoss()==0)
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
// åñëè ñòîïëîññ â óáûòêå èëè â ïðîôèòå, òðàëèì òîëüêî åñëè íîâûé ñòîï ëó÷øå ñòàðîãî
else
{
if (newstop<OrderStopLoss())
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
else
{
// åñëè ñòîïëîññ íåîïðåäåëåí, òî òðàëèì, åñëè ñòîï ëó÷øå îòêðûòèÿ
if ((OrderStopLoss()==0) && (newstop<OrderOpenPrice()-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
// åñëè ñòîï íå ðàâåí 0, òî ìåíÿåì åãî, åñëè îí ëó÷øå ïðåäûäóùåãî è êóðñà îòêðûòèÿ
else
{
if ((newstop<OrderStopLoss()) && (newstop<OrderOpenPrice()-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
OrderModify(ticket,OrderOpenPrice(),newstop,OrderTakeProfit(),OrderExpiration());
}
}
}
}
//-----------------------------------------------------------------------------------------------
void LimOrdServ(int OrdType) //OrdType=0-óäàëèòü âñå,1- âûñò-áàé,-1- âûñò ñåëë
{
//Ñîáèðàåì âñå îòëîæíèêè è ÷èñòèì
for(int i=1; i<=OrdersTotal(); i++) // Öèêë ïåðåáîðà îðäåðîâ
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol())continue; // Íå íàø ôèí. èíñòðóì
if (OrderType()==OP_BUY||OrderType()==OP_SELL) continue;//íå íàøè òèïû
if (StringSubstr(OrderComment(),0,6)!=Komment)continue; // Íå íàø îðäåð
if (OrdType==0) DelLimitOrd(OrderTicket());//óäàëèòü âñå
if (OrderType()==OP_SELLLIMIT&&OrdType==1) DelLimitOrd(OrderTicket());//íå òîò òèï
if (OrderType()==OP_BUYLIMIT&&OrdType==-1) DelLimitOrd(OrderTicket());//íå òîò òèï
if (OrdNetValidate(OrderTicket(),OrdType)!=true) DelLimitOrd(OrderTicket());//íå òà àäðåñíàÿ ñåòêà
if (OrdPriceValidate(OrderTicket(),OrdType)!=true)DelLimitOrd(OrderTicket());//äàëåêî îò òåê.öåíû
}
}
//âûñòàâëÿåì îòëîæíèêè åñëè íåîáõîäèìî
OrdSetUp(OrdType);//âûñòàâëÿåì îòëîæåííûé îðäåð âûøå òåê öåíû åñëè òàì íåò
OrdSetDn(OrdType);//âûñòàâëÿåì îòëîæåííûé îðäåð íèæå òåê öåíû åñëè òàì íåò
}
//-----------------------------------------------------------------------------------------------
void DelLimitOrd(int OrdTicket) //óäàëåíèå îòëîæåííîãî îðäåðà
{
bool Ans;
if (OrdTicket==0) return;
while (true)
{
Alert("Ïîïûòêà çàêðûòü îòëîæåííûé îðäåð ",OrdTicket,". Îæèäàíèå îòâåòà..");
RefreshRates(); // Îáíîâëåíèå äàííûõ
Alert("Íîìåð òèêåòà ",OrdTicket);
Ans=OrderDelete(OrdTicket);
if (Ans==true) // Ïîëó÷èëîñü :)
{
Alert ("Çàêðûò îòëîæåííûé îðäåð ",OrdTicket);
Sleep(60000);
break; // Âûõîä èç öèêëà çàêð
}
if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê
continue; // Ïîâòîðíàÿ ïîïûòêà
return; // Âûõîä èç start()
}
}
//-----------------------------------------------------------------------------------------------
bool OrdNetValidate(int OrdTicket,int OrdType) //ïðîâåðèòü íàõîäèòñÿ ëè îðäåð â àäðåñå ñåòêè
{
double CurPrice;
double x;
if (OrderSelect(OrdTicket,SELECT_BY_TICKET)==true)
{
CurPrice=OrderOpenPrice();
if (OrdType==1) //åñëè ñåòêà buy
{
for (x=BasePoint;x<BasePointHighLevel;x=x+Step*Point)
{
if (NormalizeDouble(x,Digits)==NormalizeDouble(CurPrice,Digits)) return(true);
}
}
if (OrdType==-1) //åñëè ñåòêà sell
{
for (x=BasePoint-Shift*Point;x<BasePointHighLevel;x=x+Step*Point)
{
if (NormalizeDouble(x,Digits)==NormalizeDouble(CurPrice,Digits)) return(true);
}
}
}
return(false);
}
//-----------------------------------------------------------------------------------------------
bool OrdPriceValidate(int OrdTicket,int OrdType)//ïðîâåðèòü, íàõîäèòñÿ ëè îðäåð ðÿäîì ñ òåê öåíîé
{
double CurPrice;
if (OrderSelect(OrdTicket,SELECT_BY_TICKET)==true)
{
CurPrice=OrderOpenPrice();
if (OrdType==1) //åñëè ñåòêà buy
{
if (CurPrice<Bid&&CurPrice+Step*Point>Bid) return(true);
if (CurPrice>Bid&&CurPrice-Step*Point<Bid) return(true);
}
if (OrdType==-1) //åñëè ñåòêà sell
{
if (CurPrice<Ask&&CurPrice+Step*Point>Ask) return(true);
if (CurPrice>Ask&&CurPrice-Step*Point<Ask) return(true);
}
}
return(false);
}
//-----------------------------------------------------------------------------------------------
//ïðîöåäóðà îòêðûòèÿ îðäåðîâ
int OpenOrder(int Ticket,int OperType,double Lots,double CurPrice,double TakeProf,string Komment)
{
double TP;
while(true)
{
if (OperType==0)
{
if (TakeProf!=0)
{
TP=Ask + New_Stop(TakeProf)*Point;
//TP=0;
}
else TP=0;
Alert("Ïîïûòêà îòêðûòü îðäåð buy. Îæèäàíèå îòâåòà..");
Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
if (Ticket > 0) // Ïîëó÷èëîñü :)
{
Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
return(1); // Âûõîä èç ïðîöåäóðû
}
if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê
continue; // Ïîâòîðíàÿ ïîïûòêà
return(0);
} // Âûõîä èç ïðîöåäóðû
if (OperType==1)
{
if (TakeProf!=0)
{
TP=Ask - New_Stop(TakeProf)*Point;
//TP=0;
}
else TP=0;
Alert("Ïîïûòêà îòêðûòü îðäåð sell. Îæèäàíèå îòâåòà..");
Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
if (Ticket > 0) // Ïîëó÷èëîñü :)
{
Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
return(1); // Âûõîä èç ïðîöåäóðû
}
if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê
continue; // Ïîâòîðíàÿ ïîïûòêà
return(0);
} // Âûõîä èç ïðîöåäóðû
if (OperType==2) //OP_BUYLIMIT
{
if (TakeProf!=0)
{
TP=CurPrice + New_Stop(TakeProf)*Point;
}
else TP=0;
Alert("Ïîïûòêà îòêðûòü îòëîæåííûé îðäåð BUYLIMIT. Îæèäàíèå îòâåòà..");
Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
if (Ticket > 0) // Ïîëó÷èëîñü :)
{
Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
return(1); // Âûõîä èç ïðîöåäóðû
}
if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê
continue; // Ïîâòîðíàÿ ïîïûòêà
return(0);
} // Âûõîä èç ïðîöåäóðû
if (OperType==3) //OP_SELLLIMIT
{
if (TakeProf!=0)
{
TP=CurPrice - New_Stop(TakeProf)*Point;
}
else TP=0;
Alert("Ïîïûòêà îòêðûòü îòëîæåííûé îðäåð SELLLIMIT. Îæèäàíèå îòâåòà..");
Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
if (Ticket > 0) // Ïîëó÷èëîñü :)
{
Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
return(1); // Âûõîä èç ïðîöåäóðû
}
if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê
continue; // Ïîâòîðíàÿ ïîïûòêà
return(0);
} // Âûõîä èç ïðîöåäóðû
if (OperType==5) //OP_SELLSTOP
{
if (TakeProf!=0)
{
TP=CurPrice - New_Stop(TakeProf)*Point;
}
else TP=0;
Alert("Ïîïûòêà îòêðûòü îòëîæåííûé îðäåð SELLSTOP. Îæèäàíèå îòâåòà..");
Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
if (Ticket > 0) // Ïîëó÷èëîñü :)
{
Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
return(1); // Âûõîä èç ïðîöåäóðû
}
if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê
continue; // Ïîâòîðíàÿ ïîïûòêà
return(0);
} // Âûõîä èç ïðîöåäóðû
if (OperType==4) //OP_BUYSTOP
{
if (TakeProf!=0)
{
TP=CurPrice + New_Stop(TakeProf)*Point;
}
else TP=0;
Alert("Ïîïûòêà îòêðûòü îòëîæåííûé îðäåð BUYSTOP. Îæèäàíèå îòâåòà..");
Ticket=OrderSend(Symbol(),OperType,Lots,CurPrice,3,0,TP,Komment);//Îòêðûòèå îðäåðà
if (Ticket > 0) // Ïîëó÷èëîñü :)
{
Alert ("Îòêðûò îðäåð ïî öåíå:"+CurPrice,Ticket);
return(1); // Âûõîä èç ïðîöåäóðû
}
if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê
continue; // Ïîâòîðíàÿ ïîïûòêà
return(0);
} // Âûõîä èç ïðîöåäóðû
}
}
//-----------------------------------------------------------------------------------------------
int New_Stop(int Parametr) // Ïðîâåðêà ñòîï-ïðèê.
{
int Min_Dist=MarketInfo(Symbol(),MODE_STOPLEVEL);// Ìèíèì. äèñòàíöèÿ
if (Parametr<Min_Dist) // Åñëè ìåíüøå äîïóñò.
{
Parametr=Min_Dist; // Óñòàíîâèì äîïóñò.
Alert("Óâåëè÷åíà äèñòàíöèÿ ñòîï-ïðèêàçà.");
}
return(Parametr); // Âîçâðàò çíà÷åíèÿ
}
//-----------------------------------------------------------------------------------------------
//ïðîâåðêà íà íàëè÷èå îðäåðà ïî àäðåñó ñåòêè
bool OrdExist(double CurPrice)
{
bool LimitOrd=false;
for(int i=1; i<=OrdersTotal(); i++) // Öèêë ïåðåáîðà îðäåðîâ
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol())continue; // Íå íàø ôèí. èíñòðóì
if (StringSubstr(OrderComment(),0,6)!=Komment)continue; // Íå íàø îðäåð
//if (OrderType()==OP_SELLLIMIT||OrderType()==OP_SELLSTOP||OrderType()==OP_BUYLIMIT||OrderType()==OP_BUYSTOP)
// {LimitOrd=true;} else {LimitOrd=false;}
if (NormalizeDouble(OrderOpenPrice(),Digits)==NormalizeDouble(CurPrice,Digits)) return(true);
}
}
return(false);
}
//-----------------------------------------------------------------------------------------------
void OrdSetUp(int OrdType)//âûñòàâëÿåì îòëîæåííûé îðäåð âûøå òåê öåíû åñëè òàì íåò
{
double CurPrice;
double x;
for(int i=1; i<=OrdersTotal(); i++) // Öèêë ïåðåáîðà îðäåðîâ
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
CurPrice=OrderOpenPrice();
if (OrdType==1)
{
if (CurPrice>Bid&&CurPrice-Step*Point<Bid) return;
}
if (OrdType==-1)
{
if (CurPrice>Ask&&CurPrice-Step*Point<Ask) return;
}
}
}
if (OrdType==1)
{
for (x=BasePoint;x<BasePointHighLevel;x=x+Step*Point)
{
if (x>Bid&&OrdExist(x)==false)
{OpenOrder(Ticket,OP_BUYSTOP,CurLot,x,TProf,Komment); return;}
}
}
if (OrdType==-1)
{
for (x=BasePoint-Shift*Point;x<BasePointHighLevel;x=x+Step*Point)
{
if (x>Ask&&OrdExist(x)==false)
{}//{OpenOrder(Ticket,OP_SELLLIMIT,CurLot,x,TProf,Komment); return;}
}
}
}
void OrdSetDn(int OrdType)//âûñòàâëÿåì îòëîæåííûé îðäåð íèæå òåê öåíû åñëè òàì íåò
{
double CurPrice;
double x;
for(int i=1; i<=OrdersTotal(); i++) // Öèêë ïåðåáîðà îðäåðîâ
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
CurPrice=OrderOpenPrice();
if (OrdType==1)
{
if (CurPrice<Bid&&CurPrice+Step*Point>Bid) return;
}
if (OrdType==-1)
{
if (CurPrice<Ask&&CurPrice+Step*Point>Ask) return;
}
}
}
if (OrdType==1)
{
for (x=BasePoint;x<BasePointHighLevel;x=x+Step*Point)
{
if (x<Bid&&x+Step*Point>Bid&&OrdExist(x)==false)
{}//{OpenOrder(Ticket,OP_BUYLIMIT,CurLot,x,TProf,Komment); return;}
}
}
if (OrdType==-1)
{
for (x=BasePoint-Shift*Point;x<BasePointHighLevel;x=x+Step*Point)
{
if (x<Ask&&x+Step*Point>Ask&&OrdExist(x)==false)
{OpenOrder(Ticket,OP_SELLSTOP,CurLot,x,TProf,Komment); return;}
}
}
}
//ðàñ÷åò ðàçìåðà ëîòà ñïàñèáî àâòîðó http://articles.mql4.com/ru/601
double LotSize()
{
double size;
double lot;
switch( _MM )
{
case 0: size = BaseLot;
break;
case 1: size = BaseLot * AccountBalance() / 1000;
break;
case 2: size = BaseLot * MathSqrt( AccountBalance() / 1000 );
//size = 1. * MathSqrt( AccountBalance() / 10000 );
break;
default: size = BaseLot; break;
}
if( size < BaseLot ) // äîñòàòî÷íî ëè äåíåã äëÿ îòêðûòèÿ BaseLot ëîòà?
if( ( AccountFreeMarginCheck( Symbol(), OP_BUY, BaseLot ) < 10. ) ||
( AccountFreeMarginCheck( Symbol(), OP_SELL, BaseLot ) < 10. ) ||
( GetLastError() == 134 ) )
lot = 0.0; // íåò, íå õâàòèò
else lot = BaseLot; // õâàòèëî; îòêðûâàåìñÿ 0.1
else lot = NormalizeDouble( size, 2 );
return( lot );
}
//òðåíäîâûå èíäèêàòîðû
int TrendPMZ(int Usredn,int CurPeriod,int IndicatorType) //1-WATR, 2-CFP
{
if (IndicatorType==1)
{
double WatrUp=iCustom(NULL,CurPeriod,"WATR",10,4,Usredn,0,1);
double WatrDn=iCustom(NULL,CurPeriod,"WATR",10,4,Usredn,1,1);
if (WatrUp<100000) return(1);
if (WatrDn<100000) return(-1);
return(0);
}
if (IndicatorType==2)
{
double Force=iForce(NULL,CurPeriod,Usredn,MODE_SMA,PRICE_CLOSE,1);
if (Force>0) return(1);
if (Force<0) return(-1);
return(0);
}
}
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
---