Stop Balance Percentage

Author: Copyright © 2019, Vladimir Karputov
0 Views
0 Downloads
0 Favorites
Stop Balance Percentage
ÿþ//+------------------------------------------------------------------+

//|                                      Stop Balance Percentage.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"

/*

   barabashkakvn Trading engine 3.023

*/

#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\SymbolInfo.mqh>

#include <Trade\AccountInfo.mqh>

CPositionInfo  m_position;                   // trade position object

CTrade         m_trade;                      // trading object

CSymbolInfo    m_symbol;                     // symbol info object

CAccountInfo   m_account;                    // account info wrapper

//--- input parameters

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

input double   InpBalanceStop       = 5;           // Balance Stop, %

input double   InpBalanceStep       = 1;           // Balance Step, %

//---

input bool     InpPrintLog          = false;       // Print log

input ulong    InpMagic             = 486528768;   // Magic number

//---

ulong    ExtSlippage             = 10;       // Slippage

bool     ExtNeedCloseAll         = false;    //

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

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

double   m_prev_balance          = 0.0;      //

double   m_stop_balance          = 0.0;      //

double   m_step_balance          = 0.0;      //

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

//| Expert initialization function                                   |

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

int OnInit()

  {

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

      return(INIT_FAILED);

//---

   m_trade.SetExpertMagicNumber(InpMagic);

   m_trade.SetMarginMode();

   m_trade.SetTypeFillingBySymbol(m_symbol.Name());

   m_trade.SetDeviationInPoints(ExtSlippage);



   double balance=m_account.Balance();

   m_stop_balance=balance*(InpBalanceStop/100.0);

   m_step_balance=balance*(InpBalanceStep/100.0);

   m_prev_balance=balance-m_stop_balance;

   Comment("Stop on: ",DoubleToString(m_prev_balance,2));

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---



  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

//---

   if(ExtNeedCloseAll)

     {

      if(IsPositionExists())

        {

         CloseAllPositions();

         return;

        }

      else

        {

         ExtNeedCloseAll=false;

         double balance=m_account.Balance();

         m_stop_balance=balance*(InpBalanceStop/100.0);

         m_step_balance=balance*(InpBalanceStep/100.0);

         m_prev_balance=balance-m_stop_balance;

         Comment("Stop on: ",DoubleToString(m_prev_balance,2));

        }

     }

//---

   if(InpTrailingFrequency>=10) // trailing no more than once every 10 seconds

     {

      datetime time_current=TimeCurrent();

      if(time_current-ExtLastTrailing>10)

        {

         Trailing();

         ExtLastTrailing=time_current;

        }

     }

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

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

   if(time_0==ExtPrevBars)

      return;

   ExtPrevBars=time_0;

   if(InpTrailingFrequency<10) // trailing only at the time of the birth of new bar

     {

      Trailing();

     }

//---

  }

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

//| TradeTransaction function                                        |

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

void OnTradeTransaction(const MqlTradeTransaction &trans,

                        const MqlTradeRequest &request,

                        const MqlTradeResult &result)

  {

//---



  }

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

//| Trailing                                                         |

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

void Trailing()

  {

   double profit_all_positions=ProfitAllPositions();

   double balance=m_account.Balance();

//--- close all positions

   if(balance+profit_all_positions<=m_prev_balance)

     {

      ExtNeedCloseAll=true;

      return;

     }

//---

   m_stop_balance=balance*(InpBalanceStop/100.0);

   m_step_balance=balance*(InpBalanceStep/100.0);

//---

   if(balance+profit_all_positions>=m_prev_balance+m_stop_balance+m_step_balance)

     {

      m_prev_balance=balance+profit_all_positions-m_stop_balance;

      Comment("Stop on: ",DoubleToString(m_prev_balance,2));

     }

  }

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

//| Is position exists                                               |

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

bool IsPositionExists(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

         return(true);

//---

   return(false);

  }

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

//| Close all positions                                              |

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

void CloseAllPositions()

  {

   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

         m_trade.PositionClose(m_position.Ticket()); // close a position

  }

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

//| Profit all positions                                             |

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

double ProfitAllPositions(void)

  {

   double profit=0.0;



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

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

         profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();

//---

   return(profit);

  }

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

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