SetGridOrders

Author: Pozitif
Orders Execution
It automatically opens orders when conditions are reached
Miscellaneous
It issuies visual alerts to the screenIt opens Message Boxes to the userIt plays sound alerts
0 Views
0 Downloads
0 Favorites
SetGridOrders
//+------------------------------------------------------------------+
//|                                                SetGridOrders.mq4 |
//|                                                          Pozitif |
//|                                              mail: alex-w-@bk.ru |
//+------------------------------------------------------------------+
#property copyright "Pozitif"
#property link      "mail: alex-w-@bk.ru"
#property show_inputs

//+------------------------------------------------------------------+
//| Ñêðèïò óñòàíàâëèâàåò ñåòêó îòëîæåííûõ îðäåðîâ, îò òîé öåíû íà    |
//| êîòîðóþ áûë êèíóò ñêðèïò.                                        |
//+------------------------------------------------------------------+

// ------------------ Âõîäíûå ïàðàìåòðû ñêðèïòà ---------------------+

extern double  Price          = 0;                       // Öåíà îòêðûòèÿ, èëè 0 - îðäåðà áóäóò óñòàíîâëåíû ïî òîé öåíå íà êîòîðóþ ïåðåòÿíóò ñêðèïò.
extern double  Lot            = 0.01;                    // Ðàçìåð ëîòà äëÿ îòëîæåííûõ îðäåðîâ.
extern int     SetOrders      = 3;                       // Êîëè÷åñòâî îðäåðîâ.
extern int     Step           = 10;                      // Ðàññòîÿíèå â ïóíêòàõ ìåæäó îðäåðàìè.
extern int     StopLoss       = 160;
extern bool    GeneralStop    = true;                    // Èñïîëüçîâàòü îäèí îáùèé ñòîï ëîññ âûñòàâëåííûé íà ïåðâîì îðäåðå, åñëè îòêëþ÷åíî òî äëÿ êàæäîãî îðäåðà áóäåò âûñòàâëåí ñâîé ñòîï íà óêàçàííîå ðàññòîÿíèå.
extern int     TakeProfit     = 160;
extern bool    GeneralProfit  = true;                    // Äëÿ êàæäîãî îðäåðà ñâîé òåéê ïðîôèò èëè îäèí îáùèé êîòîðûé áóäåò ðàâåí ïîñëåäíåìó âûñòàâëåííóìó îðäåðó.
extern bool    UseSound       = True;                    // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern int     MagicNumber    = 526;

//---------------------- Ãëîáàëüíûå ïåðåìåííûå ----------------------+
string         NameFileSound  = "news.wav";              // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
int            NumberOfTry    = 3;                       // Êîëè÷åñòâî ïîïûòîê âûñòàâèòü îðäåð

//--------------------- Ïîäêëþ÷àåìûå áèáëèîòåêè ---------------------+
#include       <stdlib.mqh>                       // Ñòàíäàðòíàÿ áèáëèîòåêà ÌÒ4
#include       <WinUser32.mqh>

//+------------------------------------------------------------------+
//| ##############---  script start function ---#################### |
//+------------------------------------------------------------------+
int start()
{
//----------------- Variable Initialization -------------------------+
   double pt, pr_ask, pr_bid, well_lots, open_lots, price_dp, order_sl, order_tp, price_extreme, open_pr;
   int dg, min_sl, flags, answer, orders_type;
   string symbl, str_box, title_box;
   bool interrupt = true;
//----
   
   symbl=Symbol();
   dg=MarketInfo(symbl, MODE_DIGITS);
   pt=MarketInfo(symbl, MODE_POINT);
   pr_ask=NormalizeDouble(MarketInfo(symbl, MODE_ASK), dg);
   pr_bid=NormalizeDouble(MarketInfo(symbl, MODE_BID), dg);
   min_sl=MarketInfo(symbl,MODE_STOPLEVEL);                                                              // Ìèíèìàëüíî äîïóñòèìûé óðîâåíü ñòîï-ëîññà/òåéê-ïðîôèòà â ïóíêòàõ
   well_lots=NormalizeDouble(AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED), 2);        // Äîñòóïíûå ëîòû, ïðîâåðÿåì õâàòèò ëè ñðåäñòâ äëÿ îòêðûòèÿ ïåðâîãî îðäåðà.
   open_lots=NormalizeDouble(Lot, 2);
   price_dp=NormalizeDouble(WindowPriceOnDropped(), dg);
   
   if(Price != 0)price_dp = Price;
   
   //========= Ïðîâåðÿåì áûë ëè ñêðèïò ïåðåòÿíóò íà ãðàôèê, èëè ïðîñòî çàïóùåí =========
   if(price_dp == 0){
      Alert("Ñêðèïò äîëæåí áûòü ïåðåíÿòóò íà ãðàôèê, íà òó öåíó îò êîòîðîé æåëàåòå óñòàíîâèòü îðäåðà !");
      interrupt = false;
   }
   //=================== Ñïðàøèâàåì êàêîé òèï îðäåðîâ âûñòàâëÿòü =======================
   if((interrupt == true)&&(pr_ask < price_dp)){
      str_box = "Òèï îðäåðîâ. \n ÄÀ - BuyStop / ÍÅÒ - SellLimit / Îòìåíà - ïðåðâàòü âûïîëíåíèå";
      title_box = "Âûáåðèòå òèï îðäåðà.";
      flags = MB_YESNOCANCEL|MB_ICONEXCLAMATION;
      answer = MessageBox(str_box, title_box, flags);
      if(answer == IDCANCEL)interrupt = false;
      else {
         if(answer == IDYES)orders_type = OP_BUYSTOP;
         if(answer == IDNO)orders_type = OP_SELLLIMIT;
      }
   }
   if((interrupt == true)&&(pr_bid > price_dp)){
      str_box = "Òèï îðäåðîâ. \n ÄÀ - SellStop / ÍÅÒ - BuyLimit / Îòìåíà - ïðåðâàòü âûïîëíåíèå";
      title_box = "Âûáåðèòå òèï îðäåðà.";
      flags = MB_YESNOCANCEL|MB_ICONEXCLAMATION;
      answer = MessageBox(str_box, title_box, flags);
      if(answer == IDCANCEL)interrupt = false;
      else {
         if(answer == IDYES)orders_type = OP_SELLSTOP;
         if(answer == IDNO)orders_type = OP_BUYLIMIT;
      }
   }
   //========= Ïðîâåðÿåì äîñòàòî÷íî ëè ñðåäñòâ äëÿ îòêðûòèÿ ïåðâîãî îðäåðà =============
   if((open_lots > well_lots)&&(interrupt==true)){
      str_box = "Âíèìàíèå ! âîçìîæíî áóäåò íåäîñòàòî÷íî ñðåäñòâ äëÿ îòêðûòèÿ ïåðâîãî îðäåðà. Âîçìîæíî äîñòóïíûé ëîò: "+well_lots+". "+"Ïðîäîëæèòü âûïîëíåíèå ?";
      title_box = "Íåäîñòàòî÷íî ñðåäñòâ.";
      flags = MB_YESNO|MB_ICONEXCLAMATION;
      answer = MessageBox(str_box, title_box, flags);
      if(answer == IDNO)interrupt = false;
   }
   //============================ Áëîê âûñòàâëåíèÿ îðäåðîâ =============================
   if(interrupt){
      if(orders_type ==OP_BUYSTOP){
         if(GeneralStop){
            if(price_dp - StopLoss*pt <= price_dp - min_sl*pt)order_sl = price_dp - StopLoss*pt;
            else order_sl = price_dp - (StopLoss+min_sl)*pt;
         }
         if(GeneralProfit){
            price_extreme = price_dp;
            for(int b = 0; b <= SetOrders; b++)price_extreme += Step*pt;
            if(price_extreme + TakeProfit*pt >= price_extreme + min_sl*pt)order_tp = price_extreme + TakeProfit*pt;
            else order_tp = price_extreme + (TakeProfit+min_sl)*pt;
         }
      }
      if(orders_type ==OP_SELLSTOP){
         if(GeneralStop){
            if(price_dp + StopLoss*pt >= price_dp + min_sl*pt)order_sl = price_dp + StopLoss*pt;
            else order_sl = price_dp + (StopLoss+min_sl)*pt;
         }
         if(GeneralProfit){
            price_extreme = price_dp;
            for(int ss = 0; ss <= SetOrders; ss++)price_extreme -= Step*pt;
            if(price_extreme - TakeProfit*pt <= price_extreme - min_sl*pt)order_tp = price_extreme - TakeProfit*pt;
            else order_tp = price_extreme - (TakeProfit+min_sl)*pt;
         }
      }
      if(orders_type ==OP_BUYLIMIT){
         if(GeneralStop){
            price_extreme = price_dp;
            for(int i = 0; i <= SetOrders; i++)price_extreme -= Step*pt;
            if(price_extreme - StopLoss*pt <= price_extreme - min_sl*pt)order_sl = price_extreme - StopLoss*pt;
            else order_sl = price_extreme - (StopLoss+min_sl)*pt;
         }
         if(GeneralProfit){
            if(price_dp + TakeProfit*pt >= price_dp + min_sl*pt)order_tp = price_dp + TakeProfit*pt;
            else order_tp = price_dp + (TakeProfit+min_sl)*pt;
         }
      }
      if(orders_type ==OP_SELLLIMIT){
         if(GeneralStop){
            price_extreme = price_dp;
            for(int x = 0; x <= SetOrders; x++)price_extreme += Step*pt;
            if(price_extreme + StopLoss*pt >= price_extreme + min_sl*pt)order_sl = price_extreme + StopLoss*pt;
            else order_sl = price_extreme + (StopLoss+min_sl)*pt;
         }
         if(GeneralProfit){
            if(price_dp - TakeProfit*pt <= price_dp - min_sl*pt)order_tp = price_dp - TakeProfit*pt;
            else order_tp = price_dp - (TakeProfit+min_sl)*pt;
         }
      }
      
      for(int cx = 0; cx <= SetOrders; cx++){
         
         if(orders_type ==OP_BUYSTOP){
            if(cx == 1){
               open_pr = price_dp;
               if(open_pr < pr_ask + min_sl*pt)open_pr = pr_ask + min_sl*pt;
            }
            else open_pr += Step*pt;
            if(GeneralStop == false){
               order_sl = open_pr - StopLoss*pt;
               if(order_sl > open_pr - min_sl*pt)order_sl = open_pr - min_sl*pt;
            }
            if(GeneralProfit == false){
               order_tp = open_pr + TakeProfit*pt;
               if(order_tp < open_pr + min_sl*pt)open_pr = open_pr + min_sl*pt;
            }
         }
         if(orders_type ==OP_SELLSTOP){
            if(cx == 1){
               open_pr = price_dp;
               if(open_pr > pr_bid - min_sl*pt)open_pr = pr_bid - min_sl*pt;
            }
            else open_pr -= Step*pt;
            if(GeneralStop == false){
               order_sl = open_pr + StopLoss*pt;
               if(order_sl < open_pr + min_sl*pt)order_sl = open_pr + min_sl*pt;
            }
            if(GeneralProfit == false){
               order_tp = open_pr - TakeProfit*pt;
               if(order_tp > open_pr - min_sl*pt)open_pr = open_pr - min_sl*pt;
            }
         }
         if(orders_type ==OP_BUYLIMIT){
            if(cx == 1){
               open_pr = price_dp;
               if(open_pr > pr_bid - min_sl*pt)open_pr = pr_bid - min_sl*pt;
            }
            else open_pr -= Step*pt;
            if(GeneralStop == false){
               order_sl = open_pr - StopLoss*pt;
               if(order_sl > open_pr - min_sl*pt)order_sl = open_pr - min_sl*pt;
            }
            if(GeneralProfit == false){
               order_tp = open_pr + TakeProfit*pt;
               if(order_tp < open_pr + min_sl*pt)open_pr = open_pr + min_sl*pt;
            }
         }
         if(orders_type ==OP_SELLLIMIT){
            if(cx == 1){
               open_pr = price_dp;
               if(open_pr < pr_ask + min_sl*pt)open_pr = pr_ask + min_sl*pt;
            }
            else open_pr += Step*pt;
            if(GeneralStop == false){
               order_sl = open_pr + StopLoss*pt;
               if(order_sl < open_pr + min_sl*pt)order_sl = open_pr + min_sl*pt;
            }
            if(GeneralProfit == false){
               order_tp = open_pr - TakeProfit*pt;
               if(order_tp > open_pr - min_sl*pt)open_pr = open_pr - min_sl*pt;
            }
         }

         SetOrder("", orders_type, open_lots, open_pr, order_sl, order_tp, MagicNumber, 0);
         
         
      }
   }



//----
   return(0);
}
  
//+------------------------------------------------------------------+


void SetOrder(string sy, int op, double ll, double pp, double sl=0, double tp=0, int mn=0, datetime ex=0) 
{
   int err, dg, ticket=0;
   
//---------------
   if (sy=="" || sy=="0") sy=Symbol();
   
   for (int it=1; it<=NumberOfTry; it++) {

      while (!IsTradeAllowed()) Sleep(5000);
      
      dg=MarketInfo(sy, MODE_DIGITS);
      pp=NormalizeDouble(pp, dg);
      
      ticket=OrderSend(sy, op, ll, pp, 0, sl, tp, NULL, mn, 0, CLR_NONE);
      
      if (ticket>0) {
         if (UseSound) PlaySound(NameFileSound); break;
      } 
      else {
         err=GetLastError();
         // Âûâîä ñîîáùåíèÿ îá îøèáêå
         Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);

         if (err==4 || err==131 || err==132) Sleep(1000*300); break;
         if (err==128 || err==142 || err==143) Sleep(1000*66.666);
         if (err==140 || err==148 || err==4110 || err==4111) break;
         if (err==141) Sleep(1000*100);
         if (err==145) Sleep(1000*17);
         if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
         if (err!=135) Sleep(1000*7.7);
      }
   }
  return(ticket);
}

//+----------------------------------------------------------------------------+

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