lots-calculate function

cTrader
11
Votes

m17qarock since: 08 Apr 2020;

  08 Apr 2020, 11:34
lots-calculate function

1.Please add a lots-calculate function:

Trader decide risk X % and stoploss X pips, and system calculate how many lots we should trade.

(It's really useful for day trading)

2.Add 2 hotkey:

Active symbol Panel: show/not show 

Trade watch : show/not show 

genappsforex since: 25 Nov 2019;

  08 Apr 2020, 14:07
automation

lots calculate also in automate

Just test and run

Shares4UsDevelopment since: 14 Oct 2018;

  13 Apr 2020, 10:41
RE: automation

genappsforex said:

lots calculate also in automate

agree

Reneemar862 since: 12 Jun 2020;

  12 Jun 2020, 07:03
RE: automation

mywegmansconnect said:

lots calculate also in automate 

Agree me too

ranjicgnr since: 22 Apr 2021;

  28 Apr 2021, 14:54
Risk Calculation Funcrion

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

ezequieltp97 since: 07 May 2021;

  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!