1
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