//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseAllBuyPositions() { for(int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); long PositionDirection = PositionGetInteger(POSITION_TYPE); if(PositionDirection== POSITION_TYPE_BUY) { closed = false; while(!closed && RetriesToClose > 0) { if(Trade.PositionClose(ticket) == true) { closed = true; } else { RetriesToClose--; Sleep(1000); if(RetriesToClose == 0) { Print("Position with ticket ",ticket," could not be closed after 5 retries"); } } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseAllSellPositions() { for(int i=PositionsTotal()-1; i>=0; i--) { ulong ticket = PositionGetTicket(i); long PositionDirection = PositionGetInteger(POSITION_TYPE); if(PositionDirection== POSITION_TYPE_SELL) { closed = false; while(!closed && RetriesToClose > 0) { if(Trade.PositionClose(ticket) == true) { closed = true; } else { RetriesToClose--; Sleep(1000); if(RetriesToClose == 0) { Print("Position with ticket ",ticket," could not be closed after 5 retries"); } } } } } }
Later I improved the code in case some operation was lost along the way, but it is not the case
I've been hesitating a bit between the two versions because I'm a little sleepy, but definitely neither of them works as expected
void OnTick() { double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double DrawDown = ((Equity - Balance) / Equity) * 100; if(DrawDown >= DrawdownAllowed) { CloseAllBuyPositions(); CloseAllSellPositions(); }
double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double DrawDown = ((Balance - Equity)/ Balance)*100; if(DrawDown >= DrawdownAllowed) { CloseAllBuyPositions(); CloseAllSellPositions(); }
My last try. I give up
double DrawdownAllowed = 2.0; double balance; double equity; double max_equity =0; equity = AccountInfoDouble(ACCOUNT_EQUITY); balance = AccountInfoDouble(ACCOUNT_BALANCE); max_equity = MathMax(equity, max_equity); double DD = (max_equity - equity)/max_equity*100; if(DD >= DrawdownAllowed) { CloseAllBuyPositions(); CloseAllSellPositions(); }
That is not how you measure drawdown. Your equation "DrawDown = ((Equity - Balance) / Equity) * 100" is not how you measure drawdown.
void OnTick( void ) { static double dbEquityMaximum = WRONG_VALUE, dbBalanceMaximum = WRONG_VALUE; double dbEquityCurrent = AccountInfoDouble( ACCOUNT_EQUITY ), dbBalanceCurrent = AccountInfoDouble( ACCOUNT_BALANCE ); dbEquityMaximum = fmax( dbEquityCurrent, dbEquityMaximum ); dbBalanceMaximum = fmax( dbBalanceCurrent, dbBalanceMaximum ); double dbEquityDrawdown = dbEquityMaximum - dbEquityCurrent, dbBalanceDrawdown = dbBalanceMaximum - dbBalanceCurrent, dbEquityDrawdownRelative = dbEquityDrawdown / dbEquityMaximum, dbBalanceDrawdownRelative = dbBalanceDrawdown / dbBalanceMaximum; };
Please note that with the above equations, a positive value is a drawdown, and a negative value is NOT drawdown.
If you prefer negative to be a drawdown, then change it to ( Current - Maximum ) instead of ( Maximum - Current ) as I used above.
That is not how you measure drawdown. Your equation "DrawDown = ((Equity - Balance) / Equity) * 100" is not how you measure drawdown.
Please note that with the above equations, a positive value is a drawdown, and a negative value is NOT drawdown.
If you prefer negative to be a drawdown, then change it to ( Current - Maximum ) instead of ( Maximum - Current ) as I used above.
Things I've learned from your answer:
1. WRONG_VALUE
2. fmax
3. The rest of what you have written
You are my n1 mentor! THANKS!
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I'm trying to do something very simple, but at the same time it's resisting me. I want to close the operations when the DD exceeds a value.
But when the backtest ends, I check it and the value has not been respected, what could it be due to?
Any ideas guys? Thank you in advance
void OnTick() { double Balance = AccountInfoDouble(ACCOUNT_BALANCE); double Equity = AccountInfoDouble(ACCOUNT_EQUITY); double DrawDown = ((Equity - Balance) / Equity) * 100; if(DrawDown >= DrawdownAllowed) { CloseAllBuyPositions(); CloseAllSellPositions(); } //....all rest code }The funny thing about the case is that when I check the chart, I don't see that upper Drawdown, and I have the feeling that everything is fine. However, the report says that it has even reached 5%
Maximum Balance Drawdown: 561.25 (4.71%)
Maximum Equity Reduction: 666.34 (5.59%)
Relative balance sheet reduction: 4.71% (561.25)
Relative equity reduction: 5.59% (666.34)
Note - I thought this could be because running the backtest on OHLC M1 had moved the price further. However, it happens exactly the same on every tick based on actual ticks.