Position Close Partial Panel

Author: Copyright © 2021, Vladimir Karputov
Price Data Components
Series array that contains tick volumes of each bar
0 Views
0 Downloads
0 Favorites
Position Close Partial Panel
ÿþ//+------------------------------------------------------------------+

//|                                              TradingEngine31.mqh |

//|                              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   "3.154"

#property description "barabashkakvn Class Trading engine 3.154"

//---

#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\SymbolInfo.mqh>

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

//| Class CTradingEngine31                                           |

//| Appointment: Class Expert Advisor.                               |

//|              Derives from class CObject.                         |

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

class CTradingEngine31 : public CObject

  {

protected:

   //---

   CPositionInfo     m_position;                   // object of CPositionInfo class

   CTrade            m_trade;                      // object of CTrade class

   CSymbolInfo       m_symbol;                     // object of CSymbolInfo class

   //---

   double            m_partial;                    // Partial closure percentage

   //---



private:



public:

                     CTradingEngine31();

                    ~CTradingEngine31();

   //--- Expert initialization function

   int               OnInit(string _TradeSymbol,

                            double _InpPartial

                           );

   //--- Expert deinitialization function

   void              OnDeinit(const int reason);

   //--- Expert tick function

   void              OnTick();

   //--- TradeTransaction function

   void              OnTradeTransaction(const MqlTradeTransaction &trans,

                                        const MqlTradeRequest &request,

                                        const MqlTradeResult &result);

   //--- Close Partial

   void              ClosePartial(void);



protected:

   //--- Lot Check

   double            LotCheck(double lots,CSymbolInfo &symbol);





  };

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

//| Constructor                                                      |

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

CTradingEngine31::CTradingEngine31() :

   m_partial(50)

  {

  }

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

//|                                                                  |

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

CTradingEngine31::~CTradingEngine31()

  {

  }

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

//| Expert initialization function                                   |

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

int CTradingEngine31::OnInit(string _TradeSymbol,

                             double _InpPartial

                            )

  {

//---

   ResetLastError();

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

      return(INIT_FAILED);

   m_partial                  = _InpPartial;

   Print(m_partial);

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void CTradingEngine31::OnDeinit(const int reason)

  {

//---

  }

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

//| Expert tick function                                             |

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

void CTradingEngine31::OnTick(void)

  {

//---

  }

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

//| TradeTransaction function                                        |

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

void CTradingEngine31::OnTradeTransaction(const MqlTradeTransaction &trans,

      const MqlTradeRequest &request,

      const MqlTradeResult &result)

  {

//---

  }

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

//| Lot Check                                                        |

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

double CTradingEngine31::LotCheck(double lots,CSymbolInfo &symbol)

  {

//--- calculate maximum volume

   double volume=NormalizeDouble(lots,2);

   double stepvol=symbol.LotsStep();

   if(stepvol>0.0)

      volume=stepvol*MathFloor(volume/stepvol);

//---

   double minvol=symbol.LotsMin();

   if(volume<minvol)

      volume=0.0;

//---

   double maxvol=symbol.LotsMax();

   if(volume>maxvol)

      volume=maxvol;

//---

   return(volume);

  }

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

//| Close Partial                                                    |

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

void CTradingEngine31::ClosePartial(void)

  {

//---

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

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

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

           {

            double pos_volume=m_position.Volume();

            double volume=LotCheck(pos_volume*m_partial/100.0,m_symbol);

            if(volume==0.0)

               Print("ERROR! volume==0.0 (",m_position.Ticket(),")");

            else

              {

               if(!m_trade.PositionClosePartial(m_position.Ticket(),volume,-1))

                  Print("ERROR Position Close Partial! (",m_position.Ticket(),") pos volume ",DoubleToString(pos_volume,2)," volume ",DoubleToString(pos_volume));

              }

           }

  }

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

//|                                 Position Close Partial Panel.mq5 |

//|                              Copyright © 2021, Vladimir Karputov |

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

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

#property copyright "Copyright © 2021, Vladimir Karputov"

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

#property version   "1.000"

//---

//#include "TradingEngine31.mqh"

CTradingEngine31 m_trading_engine;           // object of CTradingEngine31 class

//---

#include <Controls\Dialog.mqh>

#include <Controls\Button.mqh>

//--- input parameters

input double   InpPartial     = 50;          // Partial closure percentage

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

//| defines                                                          |

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

//--- indents and gaps

#define INDENT_LEFT                         (11)      // indent from left (with allowance for border width)

#define INDENT_TOP                          (11)      // indent from top (with allowance for border width)

//--- for buttons

#define BUTTON_WIDTH                        (180)     // size by X coordinate

#define BUTTON_HEIGHT                       (20)      // size by Y coordinate

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

//| Class CControlsDialog                                            |

//| Usage: main dialog of the Controls application                   |

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

class CControlsDialog : public CAppDialog

  {

private:

   CButton           m_button_close_partial;              // the button object



public:

                     CControlsDialog(void);

                    ~CControlsDialog(void);

   //--- create

   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);

   //--- chart event handler

   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);



protected:

   //--- create dependent controls

   bool              CreateButtonClosePartial(void);

   //--- handlers of the dependent controls events

   void              OnClickButtonClosePartial(void);

  };

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

//| Event Handling                                                   |

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

EVENT_MAP_BEGIN(CControlsDialog)

ON_EVENT(ON_CLICK,m_button_close_partial,OnClickButtonClosePartial)

EVENT_MAP_END(CAppDialog)

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

//| Constructor                                                      |

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

CControlsDialog::CControlsDialog(void)

  {

  }

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

//| Destructor                                                       |

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

CControlsDialog::~CControlsDialog(void)

  {

  }

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

//| Create                                                           |

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

bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)

  {

   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))

      return(false);

//--- create dependent controls

   if(!CreateButtonClosePartial())

      return(false);

//--- succeed

   return(true);

  }

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

//| Create the "Button Close All" buttom                             |

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

bool CControlsDialog::CreateButtonClosePartial(void)

  {

//--- coordinates

   int x1=INDENT_LEFT;

   int y1=INDENT_TOP;

   int x2=x1+BUTTON_WIDTH;

   int y2=y1+BUTTON_HEIGHT;

//--- create

   if(!m_button_close_partial.Create(m_chart_id,m_name+"Button Close Partial",m_subwin,x1,y1,x2,y2))

      return(false);

   if(!m_button_close_partial.Text("Close Partial ("+DoubleToString(InpPartial,0)+"%)"))

      return(false);

   if(!Add(m_button_close_partial))

      return(false);

   return(true);

  }

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

//| Event handler                                                    |

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

void CControlsDialog::OnClickButtonClosePartial(void)

  {

   m_trading_engine.ClosePartial();

  }

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

//| Global Variables                                                 |

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

CControlsDialog ExtDialog;

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

//| Expert initialization function                                   |

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

int OnInit()

  {

//---

   int init=m_trading_engine.OnInit(Symbol(),InpPartial);

   if(init!=INIT_SUCCEEDED)

      return(init);

//--- create application dialog

   if(!ExtDialog.Create(0,"Position Close Partial Panel",0,40,90,250,160))

      return(INIT_FAILED);

//--- run application

   ExtDialog.Run();

//--- succeed

   return(INIT_SUCCEEDED);

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

//---

   m_trading_engine.OnTick();

  }

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

//| TradeTransaction function                                        |

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

void OnTradeTransaction(const MqlTradeTransaction &trans,

                        const MqlTradeRequest &request,

                        const MqlTradeResult &result)

  {

//---

   m_trading_engine.OnTradeTransaction(trans,request,result);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

   m_trading_engine.OnDeinit(reason);

//--- destroy dialog

   ExtDialog.Destroy(reason);

  }

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

//| Expert chart event function                                      |

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

void OnChartEvent(const int id,         // event ID

                  const long& lparam,   // event parameter of the long type

                  const double& dparam, // event parameter of the double type

                  const string& sparam) // event parameter of the string type

  {

   ExtDialog.ChartEvent(id,lparam,dparam,sparam);

  }

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

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