Always N positions

Author: Copyright © 2022, Vladimir Karputov
Price Data Components
Series array that contains open time of each bar
0 Views
0 Downloads
0 Favorites
Always N positions
ÿþ//+------------------------------------------------------------------+

//|                                           Always N positions.mq5 |

//|                              Copyright © 2022, Vladimir Karputov |

//|                      https://www.mql5.com/en/users/barabashkakvn |

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

#property copyright "Copyright © 2022, Vladimir Karputov"

#property link      "https://www.mql5.com/en/users/barabashkakvn"

#property version   "1.000"

#property description "There are always 'N' positions in the market"

#property description "If there are more positions, the EA closes the oldest positions"

/*

   barabashkakvn Trading engine 4.007

*/

#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\SymbolInfo.mqh>

//---

CPositionInfo  m_position;                   // object of CPositionInfo class

CTrade         m_trade;                      // object of CTrade class

CSymbolInfo    m_symbol;                     // object of CSymbolInfo class

//--- input parameters

input group             "Trading settings"

input uchar                InpCountBuy             = 3;              // Maximum number of 'BUY' positions

input uchar                InpCountSell            = 3;              // Maximum number of 'SELL' positions

input group             "Additional features"

input ulong                InpMagic                = 200;            // Magic number

//---

ulong    m_tickets[];

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

//| Expert initialization function                                   |

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

int OnInit()

  {

//---

   ResetLastError();

   if(!m_symbol.Name(Symbol())) // sets symbol name

     {

      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");

      return(INIT_FAILED);

     }

//---

   m_trade.SetExpertMagicNumber(InpMagic);

   m_trade.SetMarginMode();

   m_trade.SetTypeFillingBySymbol(m_symbol.Name());

   m_trade.SetDeviationInPoints(10);

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

   int size=ArraySize(m_tickets);

   if(size>0)

     {

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

        {

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

           {

            m_trade.PositionClose(m_tickets[i]);

           }

         else

           {

            ArrayRemove(m_tickets,i,1);

            return;

           }

        }

     }

//---

   int count_buys=0,count_sells=0;

   datetime time_current=TimeCurrent()+3600;

   datetime time_buy=time_current,time_sell=time_current;

   ulong ticket_buy=0,ticket_sell=0;

   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(m_position.PositionType()==POSITION_TYPE_BUY)

           {

            count_buys++;

            if(m_position.Time()<time_buy)

              {

               time_buy=m_position.Time();

               ticket_buy=m_position.Ticket();

              }

           }

         else

           {

            count_sells++;

            if(m_position.Time()<time_sell)

              {

               time_sell=m_position.Time();

               ticket_sell=m_position.Ticket();

              }

           }

        }

   if(InpCountBuy>=0)

      if(count_buys>InpCountBuy)

        {

         size=ArraySize(m_tickets);

         ArrayResize(m_tickets,size+1);

         m_tickets[size]=ticket_buy;

        }

   if(InpCountSell>=0)

      if(count_sells>InpCountSell)

        {

         size=ArraySize(m_tickets);

         ArrayResize(m_tickets,size+1);

         m_tickets[size]=ticket_sell;

        }

//---

  }

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

Comments