Determining the maximum gain of a position since running the bot

Created at 30 Jul 2019, 16:27
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
TH

therealnakedtrader

Joined 23.07.2019

Determining the maximum gain of a position since running the bot
30 Jul 2019, 16:27


Hi, 

I am trying to determine the maximum pips gained by the positions in the current chart. I am able to read the contents of a position into a list and an array. But, I cant figure out how to compare the values. When I try to print the number of pips gained, it shows the current pips. Any suggestions on how to store the values so that I can compare with the current pip gained after every tick? 

Thank you. 

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using System.Collections.Generic;
namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class Positions_Max_Gain : Robot
    {
        public string stringPositionList;
        public List<Position> positionList = new List<Position>();
        Position[] array;
        protected override void OnStart()
        {
            Print("Starting bot to record position size...");
            foreach (var position in Positions)
            {
                if (position.SymbolName == Chart.SymbolName)
                {
                    positionList.Add(position);
                    Print("Position added to list: " + position.Id);
                }
            }
            Print("PositionList count: " + positionList.Count);
            array = positionList.ToArray();
        }

        protected override void OnTick()
        {
// To do: add code to store max gain in Pips for each position since running this bot
            foreach (Position e in positionList)
            {
                Print(e.Id + " has " + e.Pips + " pips");
            }

            Print(array.Length);
            Print(array[0]);
            foreach (var position in Positions)
            {
// comparison logic goes here 

            }
        }
        protected override void OnStop()
        {
        }
    }
}

 


@therealnakedtrader
Replies

PanagiotisCharalampous
30 Jul 2019, 16:34

Hi therealnakedtrader,

Try the example below

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class NewcBot : Robot
    {

        double _maxPips;
        protected override void OnStart()
        {
            // Put your initialization logic here
        }

        protected override void OnTick()
        {
            if (Positions.Count > 0)
            {
                _maxPips = Math.Max(_maxPips, Positions.Max(x => x.Pips));
            }
            Print("Max Pips: " + _maxPips);
        }

        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}

Best Regards,

Panagiotis


@PanagiotisCharalampous

therealnakedtrader
30 Jul 2019, 16:42

RE:

Panagiotis Charalampous said:

Hi therealnakedtrader,

Try the example below

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class NewcBot : Robot
    {

        double _maxPips;
        protected override void OnStart()
        {
            // Put your initialization logic here
        }

        protected override void OnTick()
        {
            if (Positions.Count > 0)
            {
                _maxPips = Math.Max(_maxPips, Positions.Max(x => x.Pips));
            }
            Print("Max Pips: " + _maxPips);
        }

        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}

Best Regards,

Panagiotis

Thanks, Panagiotis. This seems to work for all positions as a whole. I am trying to determine the max pips gained by each position. But, I think I can find a way to make this work now. Thanks again. 


@therealnakedtrader

PanagiotisCharalampous
30 Jul 2019, 16:57

Hi therealnakedtrader,

Then you can consider this

using System;
using System.Collections.Generic;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class NewcBot : Robot
    {
        Dictionary<Position, double> _positions;

        protected override void OnStart()
        {
            _positions = new Dictionary<Position, double>();
            Positions.Opened += Positions_Opened;
            foreach (var position in Positions)
                _positions.Add(position, 0);
        }

        private void Positions_Opened(PositionOpenedEventArgs obj)
        {
            _positions.Add(obj.Position, 0);
        }

        protected override void OnTick()
        {
            foreach (var position in Positions)
            {
                _positions[position] = Math.Max(_positions[position], position.Pips);
            }            
        }

        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}

Best Regards,

Panagiotis


@PanagiotisCharalampous

therealnakedtrader
30 Jul 2019, 17:08

RE:

Panagiotis Charalampous said:

Hi therealnakedtrader,

Then you can consider this

using System;
using System.Collections.Generic;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class NewcBot : Robot
    {
        Dictionary<Position, double> _positions;

        protected override void OnStart()
        {
            _positions = new Dictionary<Position, double>();
            Positions.Opened += Positions_Opened;
            foreach (var position in Positions)
                _positions.Add(position, 0);
        }

        private void Positions_Opened(PositionOpenedEventArgs obj)
        {
            _positions.Add(obj.Position, 0);
        }

        protected override void OnTick()
        {
            foreach (var position in Positions)
            {
                _positions[position] = Math.Max(_positions[position], position.Pips);
            }            
        }

        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}

Best Regards,

Panagiotis

Yep! This one worked just right. Thanks heaps, Panagiotis. 


@therealnakedtrader