Simple_Pending_Orders_Time

Author: Copyright 2024, MrBrooklin
Orders Execution
Checks for the total of open orders
0 Views
0 Downloads
0 Favorites
Simple_Pending_Orders_Time
ÿþ//+------------------------------------------------------------------+

//|                                   Simple_Pending_Orders_Time.mq5 |

//|                                       Copyright 2024, MrBrooklin |

//|                         https://www.mql5.com/ru/users/mrbrooklin |

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

#property copyright "Copyright 2024, MrBrooklin"

#property link      "https://www.mql5.com/ru/users/mrbrooklin"

#property version   "1.00"

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

//| Input parameters                                                 |

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

input ushort Trading_Start=15;   //@5<O =0G0;0 B>@3>2;8

input ushort End_Of_Trade=16;    //@5<O 7025@H5=8O B>@3>2;8

input ushort Indent=100;         //BABC? >B;>65==KE >@45@>2 >B B5:CI59 F5=K

input ushort Stop_Loss=200;      //!B>?-;>AA

//input ushort Take_Profit=1000;   //"59:-?@>D8B

input double Lots=0.1;           //>B

input ushort Magic_Number=9462;  //038G5A:89 =><5@ (;N1>5 G8A;> >B "1" 4> "65535")

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

//| Global variables                                                 |

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

MqlTradeRequest request;          // >1JO28< AB@C:BC@C B>@3>2>3> 70?@>A0

MqlTradeResult result;            // >1JO28< AB@C:BC@C @57C;LB0B0 B>@3>2>3> 70?@>A0

MqlTradeCheckResult check_result; // >1JO28< AB@C:BC@C ?@>25@:8 @57C;LB0B0 B>@3>2>3> 70?@>A0

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

//| Expert initialization function                                   |

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

int OnInit()

  {

//--- 70?CAB8< 35=5@0F8N A>1KB89 >B B09<5@0 A C:070==>9 ?5@8>48G=>ABLN

   EventSetTimer(60);

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//--- >AB0=>28< 35=5@0F8N A>1KB89 >B B09<5@0

   EventKillTimer();

  }

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

//| Timer function                                                   |

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

void OnTimer()

  {

//---

   if(Check_Trading() &&        // 5A;8 =5B ?@5?OBAB289 4;O B>@3>2;8

      Can_Trade() &&            // 5A;8 =0ABC?8;> 2@5<O B>@3>20BL

      !OrdersTotal() &&         // 5A;8 =5B CAB0=>2;5==KE >B;>65==KE >@45@>2

      !PositionSelect(_Symbol)) // 5A;8 ?> B5:CI5<C A8<2>;C =5B >B:@KBKE ?>78F89

     {

      Set_Pending_Orders(ORDER_TYPE_BUY_STOP); // CAB0=>28< >B;>65==K9 >@45@ BUY STOP

      Set_Pending_Orders(ORDER_TYPE_SELL_STOP); // CAB0=>28< >B;>65==K9 >@45@ SELL STOP

     }

   if(!Can_Trade()) // 5A;8 =0ABC?8;> 2@5<O 7025@H8BL B>@3>2;N

     {

      Close_All_Positions(); // 70:@K205< 2A5 >B:@KBK5 ?>78F88

      Delete_Pending_Orders(); // C40;O5< 2A5 >B;>65==K5 >@45@0

     }

  }

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

//|                                                                  |

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

bool Check_Trading()

  {

//---

   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))

     {

      Print("H81:0 @07@5H5=8O 02B><0B8G5A:>9 B>@3>2;8 =0 B5@<8=0;5! ",GetLastError());

      return(false);

     }

//---

   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))

     {

      Print("H81:0 @07@5H5=8O 02B><0B8G5A:>9 B>@3>2;8 =0 A5@25@5! ",GetLastError());

      return(false);

     }

//---

   if(!SymbolIsSynchronized(_Symbol))

     {

      Print("H81:0 A8=E@>=878@>20==>AB8 40==KE ?> C:070==><C A8<2>;C! ",GetLastError());

      return(false);

     }

//--- ?@>25@:0 4>AB0B>G=>AB8 A@54AB2 4;O B>@3>2;8

   if(!CheckMoneyForTrade(_Symbol,Lots,ORDER_TYPE_SELL))

     {

      Print("H81:0 ?@>25@:8 4>AB0B>G=>AB8 A@54AB2 4;O B>@3>2;8! ",GetLastError());

      return(false);

     }

//--- ?@>25@:8 :>@@5:B=>AB8 >1JQ<0 A45;:8

   string descript;

   if(!CheckVolumeValue(Lots,descript))

     {

      Print("H81:0 ?@>25@:8 :>@@5:B=>AB8 >1JQ<0 A45;:8! ",GetLastError());

      return(false);

     }

//--- ?@>25@:0 ?@>H;0 CA?5H=>

   return(true);

  }

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

//|                                                                  |

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

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)

  {

//--- ?>;CG8< F5=C >B:@KB8O

   MqlTick mqltick;

   SymbolInfoTick(symb,mqltick);

   double price=mqltick.ask;

   if(type==ORDER_TYPE_SELL)

      price=mqltick.bid;

//--- 7=0G5=8O =5>1E>48<>9 8 A2>1>4=>9 <0@68

   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);

//--- 2K7>25< DC=:F8N ?@>25@:8

   if(!OrderCalcMargin(type,symb,lots,price,margin))

     {

      //--- GB>-B> ?>H;> =5 B0:, A>>1I8< 8 25@=5< false

      Print("H81:0 2 ",__FUNCTION__," >4 >H81:8 = ",GetLastError());

      return(false);

     }

//--- 5A;8 =5 E20B05B A@54AB2 =0 ?@>2545=85 >?5@0F88

   if(margin>free_margin)

     {

      //--- A>>1I8< >1 >H81:5 8 25@=5< false

      Print("5 E20B05B 45=53 =0 ",EnumToString(type)," ",lots," ",symb," >4 >H81:8 = ",GetLastError());

      return(false);

     }

//--- ?@>25@:0 ?@>H;0 CA?5H=>

   return(true);

  }

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

//|  @>25@O5B >1J5< >@45@0 =0 :>@@5:B=>ABL                          |

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

bool CheckVolumeValue(double volume,string &description)

  {

//--- <8=8<0;L=> 4>?CAB8<K9 >1J5< 4;O B>@3>2KE >?5@0F89

   double min_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);

   if(volume<min_volume)

     {

      description=StringFormat("1J5< <5=LH5 <8=8<0;L=> 4>?CAB8<>3> SYMBOL_VOLUME_MIN=%.2f",min_volume);

      return(false);

     }

//--- <0:A8<0;L=> 4>?CAB8<K9 >1J5< 4;O B>@3>2KE >?5@0F89

   double max_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);

   if(volume>max_volume)

     {

      description=StringFormat("1J5< 1>;LH5 <0:A8<0;L=> 4>?CAB8<>3> SYMBOL_VOLUME_MAX=%.2f",max_volume);

      return(false);

     }

//--- ?>;CG8< <8=8<0;L=CN 3@040F8N >1J5<0

   double volume_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);

//--- ?@>25@8< =0 :@0B=>ABL <8=8<0;L=>9 3@040F88

   int ratio=(int)MathRound(volume/volume_step);

   if(MathAbs(ratio*volume_step-volume)>0.0000001)

     {

      description=StringFormat("1J5< =5 O2;O5BAO :@0B=K< <8=8<0;L=>9 3@040F88 SYMBOL_VOLUME_STEP=%.2f, \n"

                               "1;8609H89 :>@@5:B=K9 >1J5< %.2f", volume_step,ratio*volume_step);

      return(false);

     }

   description=">@@5:B=>5 7=0G5=85 >1J5<0";

   return(true);

  }

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

//|                                                                  |

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

bool Can_Trade() // A>74048< DC=:F8N 4;O @07@5H5=8O B>@3>2;8 2 C:070==>< 480?07>=5 2@5<5=8

  {

   MqlDateTime time_current; // >1JO28< AB@C:BC@C, 2 :>B>@>9 1C45< E@0=8BL B5:CI55 2@5<O

   TimeCurrent(time_current); // >1=>28< 40==K5 > B5:CI5< 2@5<5=8

     {

      // 5A;8 2> 2E>4=KE ?0@0<5B@0E 7040=> 2@5<O =0G0;0 B>@3>2;8 1>;LH5, G5< 2@5<O >:>=G0=8O B>@3>2;8

      if(Trading_Start-End_Of_Trade>0 &&

         (time_current.hour>=Trading_Start || // 5A;8 B5:CI55 2@5<O 1>;LH5 8;8 @02=> 2@5<5=8 =0G0;0 B>@3>2;8

          time_current.hour<End_Of_Trade)) // 8;8 5A;8 B5:CI55 2@5<O <5=LH5 2@5<5=8 >:>=G0=8O B>@3>2;8

         return true; // 2>72@0I05< 7=0G5=85 "8AB8=0"

      else // 2 ?@>B82=>< A;CG05

         // 5A;8 2> 2E>4=KE ?0@0<5B@0E 7040=> 2@5<O >:>=G0=8O B>@3>2;8 1>;LH5, G5< 2@5<O =0G0;0 B>@3>2;8

         if(End_Of_Trade-Trading_Start>0 &&

            (time_current.hour>=Trading_Start && // 5A;8 B5:CI55 2@5<O 1>;LH5 8;8 @02=> 2@5<5=8 =0G0;0 B>@3>2;8

             time_current.hour<End_Of_Trade)) // 8 5A;8 B5:CI55 2@5<O <5=LH5 2@5<5=8 >:>=G0=8O B>@3>2;8

            return true; // 2>72@0I05< 7=0G5=85 "8AB8=0"

     }

   return false; // 5A;8 4>H;8 AN40, B> B>340 2>72@0I05< 7=0G5=85 ";>6L"

  }

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

//|                                                                  |

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

void Set_Pending_Orders(ENUM_ORDER_TYPE type) // A>74048< DC=:F8N 4;O CAB0=>2:8 >B;>65==KE >@45@>2

  {

//--- >1JO28< 8 8=8F80;878@C5< ?5@5<5==K5 4;O E@0=5=8O F5= ask 8 bid

   double price_ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);

   double price_bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

   if(price_ask>0 && price_bid>0) // 5A;8 F5=K ask 8 bid 1>;LH5 =C;O

     {

      int k=type==ORDER_TYPE_BUY_STOP ? 1 : -1;

      double price=type==ORDER_TYPE_BUY_STOP ?

                   price_ask+Indent*_Point :

                   price_bid-Indent*_Point;

      ZeroMemory(request);      // >1=C;8< 7=0G5=85 70?@>A0

      ZeroMemory(result);       // >1=C;8< 7=0G5=85 @57C;LB0B0

      ZeroMemory(check_result); // >1=C;8< 7=0G5=85 ?@>25@:8 @57C;LB0B0 B>@3>2>3> 70?@>A0

      // ?0@0<5B@K 70?@>A0 =0 >B:@KB85 ?>78F88

      request.action   =TRADE_ACTION_PENDING;                  // B8? B>@3>2>9 >?5@0F88

      request.symbol   =_Symbol;                               // A8<2>;

      request.volume   =Lots;                                  // >1J5< 2 ;>B0E

      request.type     =type;                                  // B8? >@45@0

      request.price    =price;                                 // F5=0 4;O >B:@KB8O

      request.sl       =price-Stop_Loss*_Point*k;              // AB>?-;>AA

      //request.tp       =price+Take_Profit*_Point*k;            // B59:-?@>D8B

      request.deviation=5;                                     // 4>?CAB8<>5 >B:;>=5=85 >B F5=K

      request.magic    =Magic_Number;                          // MagicNumber >@45@0

      // ?@>25@8< >@45@

      bool check_order=OrderCheck(request,check_result);

      PrintFormat("retcode=%u",check_result.retcode); // 2K2545< 8=D>@<0F8N =0 ?5G0BL

      // >B?@028< 70?@>A

      if(!OrderSend(request,result)) // 5A;8 >B?@028BL 70?@>A =5 C40;>AL

         PrintFormat("OrderSend error %d",GetLastError()); // 2K2545< :>4 >H81:8

      // 2K2545< 8=D>@<0F8N >1 >?5@0F88

      PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

     }

  }

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

//|                                                                  |

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

void Close_All_Positions() // DC=:F8O 4;O 70:@KB8O >B:@KB>9 ?>78F88 2AB@5G=>9 ?>78F859

  {

//--- >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O E@0=5=8O :>;8G5AB20 >B:@KBKE ?>78F89

   int total=PositionsTotal();

//--- ?5@515@Q< 2A5 >B:@KBK5 ?>78F88

   for(int i=total-1; i>=0; i--)

     {

      // ?>;CG8< =5>1E>48<K5 ?0@0<5B@K

      ulong  position_ticket=PositionGetTicket(i);                         // B8:5B ?>78F88

      string position_symbol=PositionGetString(POSITION_SYMBOL);           // A8<2>;

      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // :>;8G5AB2> 7=0:>2 ?>A;5 70?OB>9

      ulong  magic=PositionGetInteger(POSITION_MAGIC);                     // MagicNumber ?>78F88

      double volume=PositionGetDouble(POSITION_VOLUME);                    // >1J5< ?>78F88

      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // B8? ?>78F88

      // 2K2545< 8=D>@<0F8N > ?>78F88

      PrintFormat("#%I64u %s  %s  %.2f  %s [%I64d]",

                  position_ticket,

                  position_symbol,

                  EnumToString(type),

                  volume,

                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),

                  magic);

      // 5A;8 MagicNumber A>2?0405B

      if(magic==Magic_Number)

        {

         ZeroMemory(request); // >1=C;8< 7=0G5=85 70?@>A0

         ZeroMemory(result);  // >1=C;8< 7=0G5=85 @57C;LB0B0

         // CAB0=>28< ?0@0<5B@K 4;O 2K?>;=5=8O >?5@0F88

         request.action   =TRADE_ACTION_DEAL;        // B8? B>@3>2>9 >?5@0F88

         request.position =position_ticket;          // B8:5B ?>78F88

         request.symbol   =position_symbol;          // A8<2>;

         request.volume   =volume;                   // >1J5< ?>78F88

         request.deviation=5;                        // 4>?CAB8<>5 >B:;>=5=85 >B F5=K

         request.magic    =Magic_Number;             // MagicNumber ?>78F88

         // CAB0=>28< F5=C 8 B8?0 >@45@0 2 7028A8<>AB8 >B B8?0 ?>78F88

         if(type==POSITION_TYPE_BUY)

           {

            request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);

            request.type =ORDER_TYPE_SELL;

           }

         else

           {

            request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);

            request.type =ORDER_TYPE_BUY;

           }

         // 2K2545< 8=D>@<0F8N > 70:@KB88

         PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));

         // >B?@028< 70?@>A

         if(!OrderSend(request,result))  // 5A;8 >B?@028BL 70?@>A =5 C40;>AL

            PrintFormat("OrderSend error %d",GetLastError());  // 2K2545< :>4 >H81:8

         // 2K2545< 8=D>@<0F8N >1 >?5@0F88

         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

        }

     }

  }

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

//|                                                                  |

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

void Delete_Pending_Orders() // A>74048< DC=:F8N 4;O C40;5=8O >B;>65==>3> >@45@0

  {

//--- >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O E@0=5=8O :>;8G5AB20 CAB0=>2;5==KE >B;>65==KE >@45@>2

   int total=OrdersTotal();

//--- ?5@515@Q< 2A5 CAB0=>2;5==K5 >B;>65==K5 >@45@0

   for(int i=total-1; i>=0; i--)

     {

      ulong order_ticket=OrderGetTicket(i);     // >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O B8:5B0

      ulong magic=OrderGetInteger(ORDER_MAGIC); // >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O MagicNumber

      if(magic==Magic_Number) // 5A;8 MagicNumber A>2?0405B

        {

         ZeroMemory(request); // >1=C;8< 7=0G5=85 70?@>A0

         ZeroMemory(result);  // >1=C;8< 7=0G5=85 @57C;LB0B0

         // CAB0=>28< ?0@0<5B@K >?5@0F88

         request.action=TRADE_ACTION_REMOVE;    // B8? B>@3>2>9 >?5@0F88

         request.order = order_ticket;          // B8:5B >@45@0

         // ?@>25@8< >@45@

         bool check_order=OrderCheck(request,check_result);

         PrintFormat("retcode=%u",check_result.retcode); // 2K2545< 8=D>@80F8N =0 ?5G0BL

         // >B?@028< 70?@>A

         if(!OrderSend(request,result))                        // 5A;8 >B?@028BL 70?@>A =5 C40;>AL

            PrintFormat("OrderSend error %d",GetLastError());  // 2K2545< :>4 >H81:8

         // 2K2545< 8=D>@<0F8O >1 >?5@0F88

         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

        }

     }

  }

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

Comments