Position Close Partial

Author: Copyright © 2020, Vladimir Karputov
Price Data Components
0 Views
0 Downloads
0 Favorites
Position Close Partial
ÿþ//+------------------------------------------------------------------+

//|                                       Position Close Partial.mq5 |

//|                              Copyright © 2020, Vladimir Karputov |

//|                     https://www.mql5.com/ru/market/product/43516 |

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

#property copyright "Copyright © 2020, Vladimir Karputov"

#property link      "https://www.mql5.com/ru/market/product/43516"

#property version   "1.000"

/*

   barabashkakvn Trading engine 3.142

*/

#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

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

//| Enum Pips Or Points                                              |

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

enum ENUM_PIPS_OR_POINTS

  {

   pips=0,     // Pips (1.00045-1.00055=1 pips)

   points=1,   // Points (1.00045-1.00055=10 points)

  };

//--- input parameters

input group             "Trading settings"

input ENUM_PIPS_OR_POINTS  InpPipsOrPoints=points; // Pips Or Points:

input uint     InpMinProfit         = 500;         // Minimum profit for Close Partial (in 'Pips Or Points')

input ushort   InpSignalsFrequency  = 10;          // Search signals, in seconds (< "10" -> only on a new bar)

input double   InpVolume            = 0.10;        // Volume, by which a position should be decreased

input group             "Additional features"

input bool     InpPrintLog          = false;       // Print log

input ulong    InpDeviation         = 10;          // Deviation

input ulong    InpMagic             = 200;         // Magic number

//---

long     m_array_identifier[];                  // array ID of position

double   m_mim_profit               = 0.0;      // Minimum profit             -> double



double   m_adjusted_point;                      // point value adjusted for 3 or 5 points

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

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

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

//| 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(InpDeviation);

//--- tuning for 3 or 5 digits

   int digits_adjust=1;

   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)

      digits_adjust=10;

   m_adjusted_point=m_symbol.Point()*digits_adjust;

   if(InpPipsOrPoints==pips) // Pips (1.00045-1.00055=1 pips)

      m_mim_profit               = InpMinProfit                * m_adjusted_point;

   else // Points (1.00045-1.00055=10 points)

      m_mim_profit               = InpMinProfit                * m_symbol.Point();

//---

   /*bool res=false;

   while(!res)

      res=m_trade.Buy(0.10);

   res=false;

   while(!res)

      res=m_trade.Sell(0.23);*/

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

//---

   if(InpSignalsFrequency>=10) // search for trading signals no more than once every 10 seconds

     {

      datetime time_current=TimeCurrent();

      if(time_current-m_last_signal>InpSignalsFrequency)

         ClosePartial();

     }

//--- we work only at the time of the birth of new bar

   datetime time_0=iTime(m_symbol.Name(),Period(),0);

   if(time_0==m_prev_bars)

      return;

   m_prev_bars=time_0;

   if(InpSignalsFrequency<10) // search for trading signals only at the time of the birth of new bar

      ClosePartial();

  }

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

//| Close Partial                                                    |

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

void ClosePartial()

  {

//---

   int size=ArraySize(m_array_identifier);

   bool find=false;

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

     {

      find=false;

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

         if(m_position.SelectByIndex(i))

            if(m_position.Symbol()==m_symbol.Name())

              {

               long identifier = m_position.Identifier();

               if(identifier==m_array_identifier[j])

                 {

                  find=true;

                  break;

                 }

              }

      //---

      if(!find)

        {

         ArrayRemove(m_array_identifier,j,1);

         size=ArraySize(m_array_identifier);

        }

     }

//---

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

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol()==m_symbol.Name())

           {

            long identifier = m_position.Identifier();

            size=ArraySize(m_array_identifier);

            find=false;

            for(int j=0; j<size; j++)

               if(identifier==m_array_identifier[j])

                 {

                  find=true;

                  break;

                 }

            if(find)

               continue;

            //---

            if(m_position.PositionType()==POSITION_TYPE_BUY)

               if(m_position.PriceCurrent()-m_position.PriceOpen()>=m_mim_profit)

                  if(m_trade.PositionClosePartial(m_position.Ticket(),InpVolume,-1))

                    {

                     size=ArraySize(m_array_identifier);

                     ArrayResize(m_array_identifier,size+1);

                     m_array_identifier[size]=identifier;

                     continue;

                    }

            //---

            if(m_position.PositionType()==POSITION_TYPE_SELL)

               if(m_position.PriceOpen()-m_position.PriceCurrent()>=m_mim_profit)

                  if(m_trade.PositionClosePartial(m_position.Ticket(),InpVolume,-1))

                    {

                     size=ArraySize(m_array_identifier);

                     ArrayResize(m_array_identifier,size+1);

                     m_array_identifier[size]=identifier;

                     continue;

                    }

           }

  }

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

Comments