public void Close(GF.Api.Positions.IPosition position, Action action) { if (_resultActions.ContainsKey(position)) { return; } var orders = GetPositionOrders(position).ToList(); if (orders.Any()) { CancelAll(orders); } else { if (position.Net.Volume == 0) { action(); return; } PlaceExitOrder(position); } _resultActions[position] = action; }
public void ExitPosition(GF.Api.Positions.IPosition position, GF.Api.Positions.PositionChangedEventArgs e) { var volume = GetPositionVolume(position); var side = volume > 0 ? OrderSide.Sell : OrderSide.BuyToCover; Console.WriteLine("Initiating order..."); PlaceOrder(gfClient, e.ContractPosition.Contract.ElectronicContract, OrderSide.Sell, Math.Abs(volume)); }
private void PlaceExitOrder(GF.Api.Positions.IPosition avgPosition) { OrderDraft orderDraft = new OrderDraftBuilder() .WithAccountID(avgPosition.Account.ID) .WithContractID(avgPosition.Contract.ID) .WithSide(avgPosition.Net.Volume > 0 ? OrderSide.Sell : OrderSide.Buy) .WithOrderType(OrderType.Market) .WithQuantity(Math.Abs(avgPosition.Net.Volume)) .WithComments("Exit") .Build(); IReadOnlyList <OrderDraftValidationError> validationErrors = _client.Orders.Drafts.Validate(orderDraft); if (validationErrors.Any()) { throw new Exception($"Exit Order Draft validation error: {validationErrors.First()}"); } _client.Orders.SendOrder(orderDraft); }
private int GetPositionVolume(GF.Api.Positions.IPosition position) { // return position.Net.Volume; //Does this not work?? return(position.Short.Volume - position.Long.Volume); }
public IEnumerable <GF.Api.Orders.IOrder> GetPositionOrders(GF.Api.Positions.IPosition position) { return(GetPositionOrders(position.Account, position.Contract)); }