LimitNet_Stop_atom

Author: Verdi
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reached
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
LimitNet_Stop_atom
//+---------------------------------------------------------------------------------+
//|                                                          LimitNet+Stop^atom.mq4 |
//|                                                                           Verdi |
//|                                                                 nemo811@mail.ru |
//|Ñêðèïò äëÿ èñïîëüçîâàíèÿ ñåòêè îòëîæåííûõ limit-îðäåðîâ ïîñëå ðàñêðûòèÿ çàìêà.   |
//|Äâà ðåæèìà: àâòîìàò è ïîëóàâòîìàò (ïåðåêëþ÷àòåëü atom).  àâòîìàòè÷åñêîì ðåæèìå  |
//|ïàðàìåòð Lot ðàññ÷èòûâàåòñÿ êàê ðàçíîñòü ìåæäó îáú¸ìàìè óæå îòêðûòûõ buy è sell  |
//|îðäåðîâ; òàêæå ó÷èòûâàåòñÿ òåêóùèé áàëàíñ. Ïåðåìåííûå Lot, R_Lot è R_point       |
//|àêòèâíû ëèøü â ïîëóàâòîìàòè÷åñêîì ðåæèìå. Âûñòàâëåíèå ïàðàìåòðà Lot limit-îðäåðîâ|
//|èä¸ò ïî àðèôìåòè÷åñêîé ïðîãðåññèè. takeprofit ðàññ÷èòûâàåòñÿ ñ ïîïðàâêîé  äëÿ    |
//|âûõîäà ñåòêè â îáùèé 0. Åñëè òåêóùàÿ ïîçèöèÿ â ïðîôèòå - ïîïûòêà èñïîëüçîâàíèÿ   |
//|ñêðèïòà â àâòîìàòè÷åñêîì ðåæèìå ìîæåò ïðèâåñòè ê îøèáêå ðàññ÷¸òà ïîïðàâêè äëÿ    |
//|takeprofit! Â êîíöå Limit-ñåòêè âûñòàâëÿåòñÿ Stop-îðäåð (TP,SL,Magic = 0) äëÿ    |
//|ëîêèðîâàíèÿ âñåõ ïîçèöèé.Ïàðàìåòðû R_Lot è R_point ïîçâîëÿþò ó÷åñòü óæå îòêðûòûé |
//|(!)óáûòî÷íûé(!) ðûíî÷íûé îðäåð.                                                  |
//|Ïîñëå çàêðûòèÿ ëþáîãî îðäåðà ñåòêè ðåêîìåíäóþ çàâåðøèòü îñòàâøèåñÿ ñäåëêè        |
//|è ïåðåóñòàíîâèòü âñþ ñåòü.                                                       |
//| èñõîäíèêå âûñòàâëåíû ïåðåìåííûå ñ ó÷¸òîì êðèòåðèåâ:                            |
//| - íà÷àëüíûé ðèñê 1 ïóíêòà = 1 : 10 000                                          |
//| - îáùèé ðèñê äåïî = 4%                                                          |
//| - óáûòîê ïî 1 óæå îòêðûòîìó îðäåðó îáú¸ìîì 0.1 ëîò = 37 ïï.                     |
//| - äîïóñòèìàÿ îáùàÿ ïðîñàäêà = 150 ïï.                                           |
//+---------------------------------------------------------------------------------+
#property copyright "Verdi"
#property link      "nemo811@mail.ru"
#property show_inputs
//--------------------------------------------------------------------
extern bool    atom        = true;   //âêë./âûêë. àâòîìàòè÷åñêèé ðåæèì
extern int     Magic       = 0;      //óíèêàëüíûé íîìåð îðäåðîâ ñåòêè (êðîìå Stop-îðäåðà)
extern bool    BUY         = false;  //îòêðûòü ñäåëêó BUY è ïîñòàâèòü ñåòêó BUY LIMIT
extern bool    SELL        = false;  //îòêðûòü ñäåëêó SELL è ïîñòàâèòü ñåòêó SELL LIMIT
extern double  Lot         = 0.1;    //îáú¸ì îòêðûâàåìîé ñäåëêè è ïåðâîãî limit-îðäåðà (â ïîëóàâòîìàòè÷åñêîì ðåæèìå)
extern int     delta       = 37;     //øàã ñåòêè
extern int     MaxOrders   = 2;      //êîë-âî limit-îðäåðîâ ñåòêè
extern int     takeprofit  = 50;     //óðîâåíü âûñòàâëåíèÿ TP, åñëè 0, òî TP âû÷èñëÿåòñÿ ïî zero_tp               
extern int     stoploss    = 0;      //óðîâåíü âûñòàâëåíèÿ SL, åñëè 0, òî SL íå âûñòàâëÿåòñÿ
extern string  corr="Êîýôôèöèåíòû ïîïðàâîê";
extern int     zero_tp     = 1;      //êîýôôèöèåíò ïîïðàâêè takeprofit äëÿ âûõîäà ñåòêè â îáùèé 0, åñëè 0,
                                     //òî takeprofit ïðèìåò ñòàíäàðòíîå çíà÷åíèå (!)Ñòàâèòü 1 èëè 0(!)
extern int     R_Lot       = 1;      //êîýôôèöèåíò ïîïðàâêè Lot äëÿ ó÷¸òà îòêðûòîãî (!)óáûòî÷íîãî(!) ðûíî÷íîãî îðäåðà, åñëè 0 -
                                     //íå ó÷èòûâàåòñÿ + âûêëþ÷àåò R_point, êðàòåí ïàðàìåòðó Lot: R_Lot*Lot=ëîò ðûíî÷íîãî îðäåðà 
extern int     R_point     = 37;     //òåêóùèé Loss ðûíî÷íîãî óáûòî÷íîãî îðäåðà â (!)ïóíêòàõ(!), åñëè 0 - íå ó÷èòûâàåòñÿ 
//--------------------------------------------------------------------
double SL,TP,Price,Price_U,Sum,DeltaProfitR,DeltaProfitL,LotR,LotL,LotS,Balans,Free;
//--------------------------------------------------------------------
int start()
{
 if (atom)
 {
  int f=OrdersTotal();
  if (f<1)
  {  
   for (int xx=1; xx<=1; xx++)
   {
      if (BUY)
      {
         LotR=Lot;
         if (takeprofit!=0) TP  = NormalizeDouble(Bid + takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL=0;     
         OPENORDER ("Buy",Price,SL,TP,xx);
      }
      if (SELL)
      {  
         LotR=Lot;
         if (takeprofit!=0) TP = NormalizeDouble(Ask - takeprofit*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits);  else SL=0;              
         OPENORDER ("Sell",Price,SL,TP,xx);
      }
   }
   double Sumi=0;
   for (int ii=1; ii<=MaxOrders; ii++)
   {
      if (BUY)
      {
         LotL=Lot*ii;
         Price = NormalizeDouble(Ask-delta*ii*Point,Digits);
         Price_U = NormalizeDouble(Bid-delta*ii*Point,Digits);
         Sumi=Sumi+delta*(2*Lot+Lot*(ii-2))*(ii-1)/2;
         DeltaProfitL = (Sumi+ii*delta*Lot)/((2*Lot+Lot*(ii-1))*ii/2+Lot);
         if (takeprofit!=0) TP  = NormalizeDouble(Price_U + (takeprofit + DeltaProfitL*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Price_U - stoploss*Point,Digits); else SL=0;     
         OPENORDER ("Buy Limit",Price,SL,TP,ii);
      }
      if (SELL)
      {  
         LotL=Lot*ii;     
         Price = NormalizeDouble(Bid+delta*ii*Point,Digits);
         Price_U = NormalizeDouble(Ask+delta*ii*Point,Digits);
         Sumi=Sumi+delta*(2*Lot+Lot*(ii-2))*(ii-1)/2;
         DeltaProfitL = (Sumi+ii*delta*Lot)/((2*Lot+Lot*(ii-1))*ii/2+Lot);
         if (takeprofit!=0) TP = NormalizeDouble(Price_U - (takeprofit + DeltaProfitL*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Price_U + stoploss*Point,Digits);  else SL=0;              
         OPENORDER ("Sell Limit",Price,SL,TP,ii);
      }
   }
   for (int vv=1; vv<=1; vv++)
   {
      if (BUY)
      {
         LotS=(2*Lot+Lot*(MaxOrders-1))*MaxOrders/2+Lot;
         OPENORDER ("Sell Stop",Price,SL,TP,vv);
      }
      if (SELL)
      {  
         LotS=(2*Lot+Lot*(MaxOrders-1))*MaxOrders/2+Lot;
         OPENORDER ("Buy Stop",Price,SL,TP,vv);
      }
   }   
  }
  else
  {  
   Balans=AccountBalance();
   Free=AccountEquity();
   
   double SchBuyLs=SchBuyLs_b();
   double SchSellLs=SchSellLs_b(); 
   double dx=SchBuyLs-SchSellLs, dy;
   dy=MathAbs(dx);

   double ad.QuotePoint = MarketInfo(Symbol(), MODE_POINT);
   double ad.QuoteTick = MarketInfo(Symbol(), MODE_TICKSIZE);
   double ad.NominalTick = MarketInfo(Symbol(), MODE_TICKVALUE);
   double ad.NominalPoint = ad.NominalTick  * ad.QuotePoint / ad.QuoteTick ;  
   
   double n=(Balans-Free)/ad.NominalPoint; 
 
    for (int xxx=1; xxx<=1; xxx++)
   {
      DeltaProfitR = n/(dy+dy);
      if (BUY)
      {
         LotR=dy;
         if (takeprofit!=0) TP  = NormalizeDouble(Bid + (takeprofit+DeltaProfitR*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL=0;     
         OPENORDER ("Buy",Price,SL,TP,xxx);
      }
      if (SELL)
      {  
         LotR=dy;
         if (takeprofit!=0) TP = NormalizeDouble(Ask - (takeprofit+DeltaProfitR*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits);  else SL=0;              
         OPENORDER ("Sell",Price,SL,TP,xxx);
      }
   }
   double Sumii=0;
   for (int iii=1; iii<=MaxOrders; iii++)
   {
      if (BUY)
      {
         LotL=dy*iii;
         Price = NormalizeDouble(Ask-delta*iii*Point,Digits);
         Price_U = NormalizeDouble(Bid-delta*iii*Point,Digits);
         Sumii=Sumii+delta*(2*dy+dy*(iii-2))*(iii-1)/2;
         DeltaProfitL = (Sumii+iii*delta*dy+dy*n+dy*delta*iii)/((2*dy+dy*(iii-1))*iii/2+dy+dy);
         if (takeprofit!=0) TP  = NormalizeDouble(Price_U + (takeprofit + DeltaProfitL*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Price_U - stoploss*Point,Digits); else SL=0;     
         OPENORDER ("Buy Limit",Price,SL,TP,iii);
      }
      if (SELL)
      {  
         LotL=dy*iii;  
         Price = NormalizeDouble(Bid+delta*iii*Point,Digits);
         Price_U = NormalizeDouble(Ask+delta*iii*Point,Digits);
         Sumii=Sumii+delta*(2*dy+dy*(iii-2))*(iii-1)/2;
         DeltaProfitL = (Sumii+iii*delta*dy+dy*n+dy*delta*iii)/((2*dy+dy*(iii-1))*iii/2+dy+dy);
         if (takeprofit!=0) TP = NormalizeDouble(Price_U - (takeprofit + DeltaProfitL*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Price_U + stoploss*Point,Digits);  else SL=0;              
         OPENORDER ("Sell Limit",Price,SL,TP,iii);
      }
   }
   for (int vvv=1; vvv<=1; vvv++)
   {
      if (BUY)
      {
         LotS=(2*dy+dy*(MaxOrders-1))*MaxOrders/2+dy+dy;
         OPENORDER ("Sell Stop",Price,SL,TP,vvv);
      }
      if (SELL)
      {  
         LotS=(2*dy+dy*(MaxOrders-1))*MaxOrders/2+dy+dy;
         OPENORDER ("Buy Stop",Price,SL,TP,vvv);
      }
   }
 
 
  
  
  }
 }
 else
 {
   for (int x=1; x<=1; x++)
   {
      DeltaProfitR = (Lot*R_Lot*R_point)/(Lot+Lot*R_Lot);
      if (BUY)
      {
         LotR=Lot;
         if (takeprofit!=0) TP  = NormalizeDouble(Bid + (takeprofit+DeltaProfitR*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Bid - stoploss*Point,Digits); else SL=0;     
         OPENORDER ("Buy",Price,SL,TP,x);
      }
      if (SELL)
      {  
         LotR=Lot;
         if (takeprofit!=0) TP = NormalizeDouble(Ask - (takeprofit+DeltaProfitR*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Ask + stoploss*Point,Digits);  else SL=0;              
         OPENORDER ("Sell",Price,SL,TP,x);
      }
   }
   double Sum=0;
   for (int i=1; i<=MaxOrders; i++)
   {
      if (BUY)
      {
         LotL=Lot*i;
         Price = NormalizeDouble(Ask-delta*i*Point,Digits);
         Price_U = NormalizeDouble(Bid-delta*i*Point,Digits);
         Sum=Sum+delta*(2*Lot+Lot*(i-2))*(i-1)/2;
         DeltaProfitL = (Sum+i*delta*Lot+Lot*R_Lot*R_point+Lot*R_Lot*delta*i)/((2*Lot+Lot*(i-1))*i/2+Lot+Lot*R_Lot);
         if (takeprofit!=0) TP  = NormalizeDouble(Price_U + (takeprofit + DeltaProfitL*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL  = NormalizeDouble(Price_U - stoploss*Point,Digits); else SL=0;     
         OPENORDER ("Buy Limit",Price,SL,TP,i);
      }
      if (SELL)
      {  
         LotL=Lot*i;     
         Price = NormalizeDouble(Bid+delta*i*Point,Digits);
         Price_U = NormalizeDouble(Ask+delta*i*Point,Digits);
         Sum=Sum+delta*(2*Lot+Lot*(i-2))*(i-1)/2;
         DeltaProfitL = (Sum+i*delta*Lot+Lot*R_Lot*R_point+Lot*R_Lot*delta*i)/((2*Lot+Lot*(i-1))*i/2+Lot+Lot*R_Lot);
         if (takeprofit!=0) TP = NormalizeDouble(Price_U - (takeprofit + DeltaProfitL*zero_tp)*Point,Digits); else TP=0;
         if (stoploss!=0)   SL = NormalizeDouble(Price_U + stoploss*Point,Digits);  else SL=0;              
         OPENORDER ("Sell Limit",Price,SL,TP,i);
      }
   }
   for (int v=1; v<=1; v++)
   {
      if (BUY)
      {
         LotS=(2*Lot+Lot*(MaxOrders-1))*MaxOrders/2+Lot+Lot*R_Lot;
         OPENORDER ("Sell Stop",Price,SL,TP,v);
      }
      if (SELL)
      {  
         LotS=(2*Lot+Lot*(MaxOrders-1))*MaxOrders/2+Lot+Lot*R_Lot;
         OPENORDER ("Buy Stop",Price,SL,TP,v);
      }
   }
 }
return(0);
}
//---------------------------------------------------------------------------
    double SchBuyLs_b() {
      double SchBuyLs=0;
      int w;
      string SMBB=Symbol();
      for (w=OrdersTotal()-1;w>=0;w--) {
        if (!OrderSelect(w, SELECT_BY_POS, MODE_TRADES)) {ShowERROR();}
        else{
         if(OrderSymbol()!= SMBB) continue;
         if(OrderType()==OP_BUY) {
          SchBuyLs=SchBuyLs+OrderLots();
         }
        }
       }
     return(SchBuyLs);
    }
//---------------------------------------------------------------------------
    double SchSellLs_b() {
      double SchSellLs=0;
      int d;
      string SMBL=Symbol();
      for (d=OrdersTotal()-1;d>=0;d--) {
       if (!OrderSelect(d, SELECT_BY_POS, MODE_TRADES)) {ShowERROR();}
       else{
        if(OrderSymbol()!= SMBL) continue;
        if(OrderType()==OP_SELL) {
         SchSellLs=SchSellLs+OrderLots();
       }
      }
     }
     return(SchSellLs);
    }
//-----------------------------------------------------------------------------
void OPENORDER(string ord,double Price,double SL,double TP,int i)
{
   int ticket = -1;
   int err;
   while (ticket<0)
   {
      if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY,LotR,NormalizeDouble(Ask,Digits),3,SL,TP,"Magic_" + Magic,Magic,0);
      if (ord=="Sell") ticket=OrderSend(Symbol(),OP_SELL,LotR,NormalizeDouble(Bid,Digits),3,SL,TP,"Magic_" + Magic,Magic,0);
      if (ord=="Buy Limit") ticket=OrderSend(Symbol(),OP_BUYLIMIT,LotL,Price,3,SL,TP,StringConcatenate("¹"+i,"  Magic_" + Magic),Magic,0);
      if (ord=="Sell Limit") ticket=OrderSend(Symbol(),OP_SELLLIMIT,LotL,Price,3,SL,TP,StringConcatenate("¹"+i,"  Magic_" + Magic),Magic,0);
      if (ord=="Buy Stop") ticket=OrderSend(Symbol(),OP_BUYSTOP,LotS,NormalizeDouble(Ask+delta*(MaxOrders+1)*Point,Digits),3,0,0,"Lock, Magic_0",0,0);
      if (ord=="Sell Stop") ticket=OrderSend(Symbol(),OP_SELLSTOP,LotS,NormalizeDouble(Bid-delta*(MaxOrders+1)*Point,Digits),3,0,0,"Lock, Magic_0",0,0);
      Message(Magic);
      if (ticket==-1)
      {  
         ShowERROR();
         err++;Sleep(2000);RefreshRates();
      }
      if (ticket!=-1 || err >10) return;
   }
return;
}                  
//--------------------------------------------------------------------
void Message(string Magic) {
  Comment("Magic_" + Magic);
  Print("Magic_" + Magic);
}                                      
//--------------------------------------------------------------------
void ShowERROR()
{
   int err=GetLastError();
   switch ( err )
   {                  
      case 1:   return;
      case 2:   Alert("Íåò ñâÿçè ñ òîðãîâûì ñåðâåðîì ",Symbol());return;
      case 3:   Alert("Error íåïðàâèëüíûå ïàðàìåòðû ",Symbol());return;
      case 130: Alert("Error áëèçêèå ñòîïû   Ticket ",Symbol());return;
      case 134: Alert("Íåäîñòàòî÷íî äåíåã   ",Symbol());return;
      case 146: Alert("Error Ïîäñèñòåìà òîðãîâëè çàíÿòà ",Symbol());return;
      case 129: Alert("Error Íåïðàâèëüíàÿ öåíà ",Symbol());return;
      case 131: Alert("Error Íåïðàâèëüíûé îáúåì ",Symbol());return;
      default:  Alert("Error  " ,err," ",Symbol());return;
   }
}
//+--------------------------------------------------------------------+

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