Author: Copyright � 2011 zvp.1976@gmail.com
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt Closes Orders by itself
Indicators Used
Bollinger bands indicatorMoving average indicatorParabolic Stop and Reverse system
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 supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---