2020-10-18 11:05:18 +02:00
using MtApi.Monitors.Triggers ;
namespace MtApi.Monitors
{
public class ModifiedOrdersMonitor : MtMonitorBase
{
#region Fields
2024-06-16 13:57:50 +03:00
private List < MtOrder >? _lastOrders ;
2020-10-18 11:05:18 +02:00
#endregion
#region Properties
/// <summary>
/// Define on which types of modification this monitor should raise <see cref="OrdersModified"/>
/// </summary>
public OrderModifiedTypes OrderModifiedTypes { get ; set ; }
#endregion
#region Events
/// <summary>
/// Will be raised when this monitor detects changes on open orders
/// </summary>
2024-06-16 13:57:50 +03:00
public event EventHandler < ModifiedOrdersEventArgs >? OrdersModified ;
2020-10-18 11:05:18 +02:00
#endregion
#region ctor
public ModifiedOrdersMonitor ( MtApiClient apiClient , IMonitorTrigger monitorTrigger , OrderModifiedTypes orderModifiedTypes = OrderModifiedTypes . All , bool syncTrigger = false )
: base ( apiClient , monitorTrigger , syncTrigger )
{
_lastOrders = GetOrders ();
OrderModifiedTypes = orderModifiedTypes ;
}
#endregion
/// <summary>
/// Requests all current open orders
/// </summary>
/// <returns></returns>
2024-06-16 13:57:50 +03:00
private List < MtOrder >? GetOrders () => IsMtConnected ? ApiClient . GetOrders ( OrderSelectSource . MODE_TRADES ) : null ;
2020-10-18 11:05:18 +02:00
protected override void OnTriggerRaised ()
{
if ( _lastOrders == null )
{
_lastOrders = GetOrders ();
return ;
}
2024-06-16 13:57:50 +03:00
var currentOrders = GetOrders () ?? ([]);
2020-10-18 11:05:18 +02:00
OrderModifiedTypes omt = OrderModifiedTypes ;
var mtModifiedOrders = currentOrders
. Select ( co => new MtModifiedOrder ( _lastOrders . FirstOrDefault ( x => x . Ticket == co . Ticket ), co ))
. ToList ();
2024-06-16 13:57:50 +03:00
List < MtModifiedOrder > modifiedOrders = new ();
2020-10-18 11:05:18 +02:00
modifiedOrders . AddRange ( GetMtModifiedOrdersWithModType ( mtModifiedOrders , omt , OrderModifiedTypes . TakeProfit )); //If the takeprofit were changed between both calls
modifiedOrders . AddRange ( GetMtModifiedOrdersWithModType ( mtModifiedOrders , omt , OrderModifiedTypes . StopLoss )); //If the stoploss were changed between both calls
modifiedOrders . AddRange ( GetMtModifiedOrdersWithModType ( mtModifiedOrders , omt , OrderModifiedTypes . Operation )); //If an order changed from limit / stop order to an open order
2024-06-16 13:57:50 +03:00
2020-10-18 11:05:18 +02:00
if ( modifiedOrders . Count > 0 )
OrdersModified ?. Invoke ( this , new ModifiedOrdersEventArgs ( modifiedOrders ));
_lastOrders = currentOrders ;
}
2024-06-16 13:57:50 +03:00
2020-10-18 11:05:18 +02:00
private static IEnumerable < MtModifiedOrder > GetMtModifiedOrdersWithModType ( IEnumerable < MtModifiedOrder > orders , OrderModifiedTypes globalSearchFlag , OrderModifiedTypes modifiedType )
=> globalSearchFlag . HasFlag ( modifiedType ) ? orders . Where ( o => o . ModifyType . HasFlag ( modifiedType )) : new List < MtModifiedOrder >();
}
}