Positions - Partial Close event
            
                 11 Feb 2022, 17:04
            
                    
Hello,
As far as I've noticed, only fully closed positions do fall under Positions Closed event.
Thus, I would like to know what could be a solution to track this kind of event, when a position is not fully but only partially closed.
Thank you!
Replies
                     ncel01
                     14 Feb 2022, 14:10
                                    
RE:
amusleh said:
Hi,
You can use Position Modified event for partial closes.
Hi amusleh,
Thanks for your reply.
It makes sense in fact. I forgot about this event.
Is there a way to filter (within this event) a modified position for a partial close only?
My intention is to provide instructions in case of a partial close only, but it can also happen that a position has been modified for TP, SL, etc.
Thank you!
@ncel01
                     amusleh
                     15 Feb 2022, 09:11
                                    
Hi,
You can do something like this:
using cAlgo.API;
using System.Collections.Generic;
namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class NewcBot : Robot
    {
        private Dictionary<int, double> _positionsVolume = new Dictionary<int, double>(100);
        protected override void OnStart()
        {
            foreach (var position in Positions)
            {
                _positionsVolume.Add(position.Id, position.VolumeInUnits);
            }
            Positions.Opened += Positions_Opened;
            Positions.Closed += Positions_Closed;
            Positions.Modified += Positions_Modified;
        }
        private void Positions_Closed(PositionClosedEventArgs obj)
        {
            if (_positionsVolume.ContainsKey(obj.Position.Id))
            {
                _positionsVolume.Remove(obj.Position.Id);
            }
        }
        private void Positions_Opened(PositionOpenedEventArgs obj)
        {
            _positionsVolume.Add(obj.Position.Id, obj.Position.VolumeInUnits);
        }
        private void Positions_Modified(PositionModifiedEventArgs obj)
        {
            if (_positionsVolume.ContainsKey(obj.Position.Id))
            {
                var positionPreviousVolume = _positionsVolume[obj.Position.Id];
                if (positionPreviousVolume == obj.Position.VolumeInUnits)
                {
                    // It means volume desn't changed
                }
                // volume changed
                else
                {
                    // new volume added
                    if (positionPreviousVolume < obj.Position.VolumeInUnits)
                    {
                        Print("Position {0} volume increased, new volume: {1} | previous volume: {2}", obj.Position.Id, obj.Position.VolumeInUnits, positionPreviousVolume);
                    }
                    // position partially closed
                    else
                    {
                        Print("Position {0} partially closed, new volume: {1} | previous volume: {2}", obj.Position.Id, obj.Position.VolumeInUnits, positionPreviousVolume);
                    }
                }
                _positionsVolume[obj.Position.Id] = obj.Position.VolumeInUnits;
            }
            else
            {
                _positionsVolume.Add(obj.Position.Id, obj.Position.VolumeInUnits);
            }
        }
    }
}
@amusleh
                     ncel01
                     15 Feb 2022, 23:04
                                    
RE:
amusleh said:
Hi,
You can do something like this:
using cAlgo.API; using System.Collections.Generic; namespace cAlgo.Robots { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class NewcBot : Robot { private Dictionary<int, double> _positionsVolume = new Dictionary<int, double>(100); protected override void OnStart() { foreach (var position in Positions) { _positionsVolume.Add(position.Id, position.VolumeInUnits); } Positions.Opened += Positions_Opened; Positions.Closed += Positions_Closed; Positions.Modified += Positions_Modified; } private void Positions_Closed(PositionClosedEventArgs obj) { if (_positionsVolume.ContainsKey(obj.Position.Id)) { _positionsVolume.Remove(obj.Position.Id); } } private void Positions_Opened(PositionOpenedEventArgs obj) { _positionsVolume.Add(obj.Position.Id, obj.Position.VolumeInUnits); } private void Positions_Modified(PositionModifiedEventArgs obj) { if (_positionsVolume.ContainsKey(obj.Position.Id)) { var positionPreviousVolume = _positionsVolume[obj.Position.Id]; if (positionPreviousVolume == obj.Position.VolumeInUnits) { // It means volume desn't changed } // volume changed else { // new volume added if (positionPreviousVolume < obj.Position.VolumeInUnits) { Print("Position {0} volume increased, new volume: {1} | previous volume: {2}", obj.Position.Id, obj.Position.VolumeInUnits, positionPreviousVolume); } // position partially closed else { Print("Position {0} partially closed, new volume: {1} | previous volume: {2}", obj.Position.Id, obj.Position.VolumeInUnits, positionPreviousVolume); } } _positionsVolume[obj.Position.Id] = obj.Position.VolumeInUnits; } else { _positionsVolume.Add(obj.Position.Id, obj.Position.VolumeInUnits); } } } }
amusleh,
That's clear. Thanks for the extra clarifications!
@ncel01
                     icollocollo
                     25 Apr 2022, 17:34
                                    
RE: RE:
ncel01 said:
amusleh said:
Hi,
You can do something like this:
using cAlgo.API; using System.Collections.Generic; namespace cAlgo.Robots { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class NewcBot : Robot { private Dictionary<int, double> _positionsVolume = new Dictionary<int, double>(100); protected override void OnStart() { foreach (var position in Positions) { _positionsVolume.Add(position.Id, position.VolumeInUnits); } Positions.Opened += Positions_Opened; Positions.Closed += Positions_Closed; Positions.Modified += Positions_Modified; } private void Positions_Closed(PositionClosedEventArgs obj) { if (_positionsVolume.ContainsKey(obj.Position.Id)) { _positionsVolume.Remove(obj.Position.Id); } } private void Positions_Opened(PositionOpenedEventArgs obj) { _positionsVolume.Add(obj.Position.Id, obj.Position.VolumeInUnits); } private void Positions_Modified(PositionModifiedEventArgs obj) { if (_positionsVolume.ContainsKey(obj.Position.Id)) { var positionPreviousVolume = _positionsVolume[obj.Position.Id]; if (positionPreviousVolume == obj.Position.VolumeInUnits) { // It means volume desn't changed } // volume changed else { // new volume added if (positionPreviousVolume < obj.Position.VolumeInUnits) { Print("Position {0} volume increased, new volume: {1} | previous volume: {2}", obj.Position.Id, obj.Position.VolumeInUnits, positionPreviousVolume); } // position partially closed else { Print("Position {0} partially closed, new volume: {1} | previous volume: {2}", obj.Position.Id, obj.Position.VolumeInUnits, positionPreviousVolume); } } _positionsVolume[obj.Position.Id] = obj.Position.VolumeInUnits; } else { _positionsVolume.Add(obj.Position.Id, obj.Position.VolumeInUnits); } } } }
amusleh,
That's clear. Thanks for the extra clarifications!Is it possible to use this position modified in another Method? @amusleh
@icollocollo
                     icollocollo
                     26 Apr 2022, 09:10
                                    
RE: RE: RE: RE:
amusleh said:
icollocollo said:
ncel01 said:
amusleh,
That's clear. Thanks for the extra clarifications!Is it possible to use this position modified in another Method? @amusleh
Hi,
What do you mean by using the position on another method?
I was looking for a way to stop my positions from bwing modified twice in a cbot but i realized this is and event so i think i will try to use an if logic to implement that. Thank you
@icollocollo

amusleh
14 Feb 2022, 09:01
Hi,
You can use Position Modified event for partial closes.
@amusleh