How to calculate daily and monthly drawdown in cAlgo.
Created at 03 Sep 2016, 17:51
How to calculate daily and monthly drawdown in cAlgo.
03 Sep 2016, 17:51
Hello,
How to calculate daily and monthly drawdown in cAlgo.
Thanks.
Replies
amusleh
13 Apr 2022, 11:53
Hi,
This might help you:
using cAlgo.API;
using System;
using System.Globalization;
using System.Linq;
namespace NewcBot
{
[Robot(AccessRights = AccessRights.None)]
public class NewcBot : Robot
{
private const string DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";
[Parameter("Initial Balance", DefaultValue = 10000)]
public double InitialBalance { get; set; }
[Parameter("Start Time", DefaultValue = DATE_FORMAT)]
public string StartTime { get; set; }
[Parameter("End Time", DefaultValue = DATE_FORMAT)]
public string EndTime { get; set; }
protected override void OnStart()
{
DateTime startTime, endTime;
if (!DateTime.TryParseExact(StartTime, DATE_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out startTime))
{
Print("Invalid start time");
Stop();
}
if (!DateTime.TryParseExact(EndTime, DATE_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out endTime))
{
Print("Invalid end time");
Stop();
}
var history = from trade in History
where trade.EntryTime >= startTime && trade.EntryTime <= endTime
where trade.ClosingTime >= startTime && trade.ClosingTime <= endTime
orderby trade.ClosingTime
select trade;
var troughValue = InitialBalance;
var peakValue = InitialBalance;
var currentBalance = InitialBalance;
var tradeCount = 0;
var maxDrawdown = 0.0;
DateTime? peakTime = null;
DateTime? troughTime = null;
foreach (var trade in history)
{
// As we don't have account registration date we use the first trade
// closing time as initial value for peak and trough times
if (peakTime.HasValue == false) peakTime = trade.EntryTime;
if (troughTime.HasValue == false) troughTime = peakTime;
tradeCount++;
currentBalance += trade.NetProfit;
var isPeakOrTroughChanged = false;
if (currentBalance > peakValue)
{
peakValue = currentBalance;
isPeakOrTroughChanged = true;
peakTime = trade.ClosingTime;
}
if (currentBalance < troughValue)
{
troughValue = currentBalance;
isPeakOrTroughChanged = true;
troughTime = trade.ClosingTime;
}
if (isPeakOrTroughChanged && peakTime < troughTime)
{
var currentDrawdown = (troughValue - peakValue) / peakValue * 100;
if (currentDrawdown < maxDrawdown)
{
maxDrawdown = currentDrawdown;
}
}
}
Print("Peak Value: {0} | Trough Value: {1} | Max DD %: {2} | # Of Trades: {3}", peakValue, troughValue, maxDrawdown, tradeCount);
}
}
}
You have to pass the initial account balance and start/end time for max drawdown period.
@amusleh
fxctrader
13 Apr 2022, 04:36
Can ADMIN help on this?
Also finding a way to determine daily DD? Any sample would be highly appreciated.
Thanks.