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_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 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 ---