Close on time

Author: Copyright © 2019, Vladimir Karputov
Orders Execution
Checks for the total of open orders
0 Views
0 Downloads
0 Favorites
Close on time
ÿþ//+------------------------------------------------------------------+

//|                                                Close on time.mq5 |

//|                              Copyright © 2019, Vladimir Karputov |

//|                                           http://wmua.ru/slesar/ |

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

#property copyright "Copyright © 2019, Vladimir Karputov"

#property link      "http://wmua.ru/slesar/"

#property version   "1.000"

#property description "barabashkakvn Trading engine 3.101"

/*

   barabashkakvn Trading engine 3.101

*/

#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\OrderInfo.mqh>

//---

CPositionInfo  m_position;                   // object of CPositionInfo class

CTrade         m_trade;                      // object of CTrade class

COrderInfo     m_order;                      // object of COrderInfo class

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

//| Enum Lor or Risk                                                 |

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

enum ENUM_LOT_OR_RISK

  {

   lots_min=0, // Lots Min

   lot=1,      // Constant lot

   risk=2,     // Risk in percent for a deal

  };

//--- input parameters

input datetime InpCloseTime         = D'1970.01.01 16:15'; // Close Time (use onle HH:MM)

input bool     InpCloseAllSymbols   = true;        // Close All Symbols

input bool     InpCloseAllMagics    = true;        // Close All Magics

input ulong    InpMagic             = 200;         // Magic Number (only if "Close All Magics" -> "false")

input bool     InpClosePositions    = true;        // Close Positions

input bool     InpDeletePending     = true;        // Delete Pending Orders

input ulong    InpDeviation         = 10;          // Deviation, in points (1.00045-1.00055=10 points)

//---

datetime m_last_D1_closing          = 0;           // "0" -> D'1970.01.01 00:00';

long     m_close_time               = 0;           //

ulong    m_position_tickets[];                     //

ulong    m_pending_tickets[];                      //

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

//| Expert initialization function                                   |

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

int OnInit()

  {

   MqlDateTime m_SCloseTime;

   TimeToStruct(InpCloseTime,m_SCloseTime);

   m_close_time=m_SCloseTime.hour*60*60+m_SCloseTime.min*60;

//---

   m_trade.SetExpertMagicNumber(0);

   m_trade.SetMarginMode();

   m_trade.SetDeviationInPoints(InpDeviation);

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---



  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

   datetime d1=iTime(Symbol(),PERIOD_D1,0);

   int size_positions=ArraySize(m_position_tickets);

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

     {

      m_last_D1_closing=d1;

      if(m_position.SelectByTicket(m_position_tickets[i]))

         m_trade.PositionClose(m_position_tickets[i]);

      else

         ArrayRemove(m_position_tickets,i,1);

     }

   int size_pending=ArraySize(m_pending_tickets);

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

     {

      m_last_D1_closing=d1;

      if(m_order.Select(m_pending_tickets[i]))

         m_trade.OrderDelete(m_pending_tickets[i]);

      else

         ArrayRemove(m_pending_tickets,i,1);

     }

//---

   if(d1==D'1970.01.01 00:00')

      return;



   size_positions=ArraySize(m_position_tickets);

   size_pending=ArraySize(m_pending_tickets);

   if((size_positions==0 && size_pending==0 && d1==m_last_D1_closing) || (size_positions!=0 || size_pending!=0))

      return;



   MqlDateTime STimeCurrent;

   TimeToStruct(TimeCurrent(),STimeCurrent);

   long time_current=STimeCurrent.hour*60*60+STimeCurrent.min*60+STimeCurrent.sec;

   if(time_current<m_close_time)

      return;

   if(time_current>m_close_time+10*60)

      return;

//---

   if(InpClosePositions)

      for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions

         if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties

            if(

               (InpCloseAllSymbols || (!InpCloseAllSymbols && m_position.Symbol()==Symbol())) &&

               (InpCloseAllMagics || (!InpCloseAllMagics && m_position.Magic()==InpMagic))

            )

              {

               size_positions=ArraySize(m_position_tickets);

               ArrayResize(m_position_tickets,size_positions+1);

               m_position_tickets[size_positions]=m_position.Ticket();

              }

   if(InpDeletePending)

      for(int i=OrdersTotal()-1; i>=0; i--) // returns the number of current orders

         if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties

            if(

               (InpCloseAllSymbols || (!InpCloseAllSymbols && m_order.Symbol()==Symbol())) &&

               (InpCloseAllMagics || (!InpCloseAllMagics && m_order.Magic()==InpMagic))

            )

              {

               size_pending=ArraySize(m_pending_tickets);

               ArrayResize(m_pending_tickets,size_pending+1);

               m_pending_tickets[size_pending]=m_order.Ticket();

              }

//---



  }

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

Comments