Topics

Forum Topics not found

Replies

ezequieltp97
07 May 2021, 17:17

RE: Risk Calculation Funcrion

ranjicgnr said:

You can create your own. The below is mine. You can modify if you want.

 

public class RiskManagementService : IRiskManagementService
    {

        private readonly IAccount _account;
        private readonly Symbol _symbol;

        public RiskManagementService(IAccount account, Symbol symbol)
        {
            _account = account;
            _symbol = symbol;
        }

        public double CalculateBuyQty(double riskPercent, double stopLoss, double askPrice, double minimumQty, double maximumQty, 
            StopValueType stopValueType, out bool isLimitReached, out double currentRisk)
        {
            isLimitReached = false;
            currentRisk = riskPercent;
            double balance = _account.Balance;
            double riskAmount = balance * riskPercent * 0.01;
            double longRiskPoints = askPrice - stopLoss;
            if(stopValueType == StopValueType.Pips)
            {
                longRiskPoints = _symbol.PipSize * stopLoss;
            }
            double volumeinLots = Math.Floor(((riskAmount / longRiskPoints) / _symbol.LotSize) * 100) / 100;
            if(volumeinLots < minimumQty)
            {
                volumeinLots = minimumQty;
                isLimitReached = true;
                currentRisk = Math.Ceiling(((longRiskPoints * _symbol.QuantityToVolumeInUnits(volumeinLots) * 10000) / balance) * 0.01);
            }
            if(volumeinLots > maximumQty)
            {
                volumeinLots = maximumQty;
                currentRisk = Math.Ceiling(((longRiskPoints * _symbol.QuantityToVolumeInUnits(volumeinLots) * 10000) / balance) * 0.01);
                isLimitReached = true;
            }

            return volumeinLots;
        }

        public double CalculateSellQty(double riskPercent, double stopLoss, double bidPrice, double minimumQty, double maximumQty, 
            StopValueType stopValueType, out bool isLimitReached, out double currentRisk)
        {
            isLimitReached = false;
            currentRisk = riskPercent;
            double balance = _account.Balance;
            double riskAmount = balance * riskPercent * 0.01;
            double shortRiskPoints = stopLoss - bidPrice;
            if (stopValueType == StopValueType.Pips)
            {
                shortRiskPoints = _symbol.PipSize * stopLoss;
            }
            double volumeinLots = Math.Floor(((riskAmount / shortRiskPoints) / _symbol.LotSize) * 100) / 100;
            if (volumeinLots < minimumQty)
            {
                volumeinLots = minimumQty;
                isLimitReached = true;
                currentRisk = Math.Ceiling(((shortRiskPoints * _symbol.QuantityToVolumeInUnits(volumeinLots) * 10000) / balance) * 0.01);
            }
            if (volumeinLots > maximumQty)
            {
                volumeinLots = maximumQty;
                currentRisk = Math.Ceiling(((shortRiskPoints * _symbol.QuantityToVolumeInUnits(volumeinLots) * 10000) / balance) * 0.01);
                isLimitReached = true;
            }
            return volumeinLots;
        }
    }

    public interface IRiskManagementService
    {
        double CalculateBuyQty(double riskPercent, double stopLossPrice, double askPrice, double minimumQty, double maximumQty, 
            StopValueType stopValueType, out bool isLimitReached, out double currentRisk);
        double CalculateSellQty(double riskPercent, double stopLossPrice, double bidPrice, double minimumQty, double maximumQty, 
            StopValueType stopValueType, out bool isLimitReached, out double currentRisk);
    }

    public enum StopValueType
    {
        Absolute,
        Pips
    }
}

Hi Sir! Excuse me, could you explain to me how to correctly place the code in CTrader? I copied and pasted it but when compiling it gave me an error (No algo source file was found in "New cBot.csproj")  Is it possible that you can send a screenshot or something? Thank you!


@ezequieltp97