protected override void OnPositionUpdate(Cbi.Position position, double averagePrice, int quantity, Cbi.MarketPosition marketPosition) { //Reset if (position.MarketPosition == MarketPosition.Flat) { SetStopLoss("StartOrder", CalculationMode.Pips, 90, true); CollectOrder = null; //SetStopLoss("StartOrder", CalculationMode.Pips, 90, true); _status = ""; } // if (MyAllOrders != null && !_status.IsNullOrEmpty() && CollectionMIT != null && _status.Equals("Collection") && CollectionMIT.OrderState == OrderState.Filled) // { // //position.BreakEven(MyAllOrders); // Draw.Dot(this, @"MyCustomStrategy" + CurrentBars[0].ToString(), false, 0, Close[0], Brushes.Red); // } //Recover if (_status.Equals("Recover")) { SetProfitTarget("Recover1", CalculationMode.Price, Position.AveragePrice + 1 * TickSize, true); SetProfitTarget("StartOrder", CalculationMode.Price, Position.AveragePrice + 1 * TickSize, true); SetProfitTarget("Recover2", CalculationMode.Price, Position.AveragePrice + 1 * TickSize, true); SetProfitTarget("Recover3", CalculationMode.Price, Position.AveragePrice + 1 * TickSize, true); } }
public void UpdateCurPos(Cbi.Position position, double averagePrice, int quantity, Cbi.MarketPosition marketPosition) { PosAvgPrice = averagePrice; PosQuantity = quantity; MktPosition = marketPosition; PosUnrealizedPnL = position.GetUnrealizedProfitLoss(PerformanceUnit.Currency, InstStrategy.Close[0]); }
protected override void OnPositionUpdate(Cbi.PositionEventArgs positionUpdate) { if (positionUpdate.Position.Account.Name == AccountName && positionUpdate.Position.Instrument == Instrument) { position = (positionUpdate.Operation == Cbi.Operation.Remove ? null : positionUpdate.Position); CurrentValue = (position == null ? 0 : position.GetUnrealizedProfitLoss(Cbi.PerformanceUnit.Currency)); } }
// WARNING!!!! Market position is not order position protected override void OnPositionUpdate(Cbi.Position position, double averagePrice, int quantity, Cbi.MarketPosition marketPosition) { if (position.MarketPosition == MarketPosition.Flat) { } if (position.MarketPosition == MarketPosition.Long) { } if (position.MarketPosition == MarketPosition.Short) { } }
protected override void OnConnectionStatusUpdate(Cbi.ConnectionStatusEventArgs connectionStatusUpdate) { BackColor = null; // reset color CurrentValue = 0; Cbi.Account account = null; Cbi.Position position = null; lock (Cbi.Account.All) account = Cbi.Account.All.FirstOrDefault(o => o.Name == AccountName); if (account != null) { lock (account.Positions) position = account.Positions.FirstOrDefault(o => o.Instrument.FullName == Instrument.FullName); } if (position != null) { CurrentValue = (position.MarketPosition == Cbi.MarketPosition.Long ? 1 : -1) * position.Quantity; } }
/// <summary> /// Called on connection status change /// </summary> /// <param name="e"></param> protected override void OnConnectionStatus(ConnectionStatusEventArgs e) { Value = 0; BackColor = Color.Empty; // reset color lock (Cbi.Globals.Connections) foreach (Connection connection in Cbi.Globals.Connections) { if (connection.Status == ConnectionStatus.Connected || connection.Status == ConnectionStatus.ConnectionLost) { lock (connection.Accounts) foreach (Account account in connection.Accounts) { if (account.Name == AccountName && account.Positions.FindByInstrument(Instrument) != null) { Cbi.Position position = account.Positions.FindByInstrument(Instrument); Value = (position.MarketPosition == MarketPosition.Long ? 1 : -1) * position.Quantity; } } } } }
protected override void OnAccountItemUpdate(Cbi.AccountItemEventArgs accountItemUpdate) { if (AccountName != Account.SimulationAccountName || accountItemUpdate.Account.Name != AccountName || accountItemUpdate.AccountItem != AccountItem.UnrealizedProfitLoss) { return; } lock (accountItemUpdate.Account.Positions) position = accountItemUpdate.Account.Positions.FirstOrDefault(o => o.Instrument.FullName == Instrument.FullName); executions.Clear(); foreach (Cbi.Execution execution in accountItemUpdate.Account.Executions) { if (execution.Instrument == Instrument) { executions.Add(execution); } } realizedPL = Cbi.SystemPerformance.Calculate(executions).AllTrades.TradesPerformance.Currency.CumProfit; CurrentValue = realizedPL + (position == null ? 0 : position.GetUnrealizedProfitLoss(Cbi.PerformanceUnit.Currency)); }
protected override void OnConnectionStatusUpdate(Cbi.ConnectionStatusEventArgs connectionStatusUpdate) { if (connectionStatusUpdate.Status == Cbi.ConnectionStatus.Connected && connectionStatusUpdate.PreviousStatus == Cbi.ConnectionStatus.Connecting) { Cbi.Account account = null; lock (connectionStatusUpdate.Connection.Accounts) account = connectionStatusUpdate.Connection.Accounts.FirstOrDefault(o => o.Name == AccountName); if (account != null) { lock (account.Positions) position = account.Positions.FirstOrDefault(o => o.Instrument.FullName == Instrument.FullName); } } else if (connectionStatusUpdate.Status == Cbi.ConnectionStatus.Disconnected && connectionStatusUpdate.PreviousStatus == Cbi.ConnectionStatus.Disconnecting) { if (position != null && position.Account.Connection == connectionStatusUpdate.Connection) { CurrentValue = 0; position = null; } } }
protected override void OnConnectionStatusUpdate(Cbi.ConnectionStatusEventArgs connectionStatusUpdate) { if (connectionStatusUpdate.Status == Cbi.ConnectionStatus.Connected || connectionStatusUpdate.PreviousStatus == Cbi.ConnectionStatus.Connecting) { Cbi.Account account; lock (connectionStatusUpdate.Connection.Accounts) account = connectionStatusUpdate.Connection.Accounts.FirstOrDefault(o => o.Name == AccountName); if (account != null) { lock (account.Positions) position = account.Positions.FirstOrDefault(o => o.Instrument.FullName == Instrument.FullName); accountDenomination = account.Denomination; executions.Clear(); foreach (Cbi.Execution execution in account.Executions) { if (execution.Instrument == Instrument) { executions.Add(execution); } } realizedPL = Cbi.SystemPerformance.Calculate(executions).AllTrades.TradesPerformance.Currency.CumProfit; } } else if (connectionStatusUpdate.Status == Cbi.ConnectionStatus.Disconnected && connectionStatusUpdate.PreviousStatus == Cbi.ConnectionStatus.Disconnecting) { if (position != null && position.Account.Connection == connectionStatusUpdate.Connection) { CurrentValue = 0; position = null; realizedPL = 0; } } CurrentValue = realizedPL + (position == null ? 0 : position.GetUnrealizedProfitLoss(Cbi.PerformanceUnit.Currency)); }
protected override void OnPositionUpdate(Cbi.Position position, double averagePrice, int quantity, Cbi.MarketPosition marketPosition) { IndicatorProxy.Log2Disk = true; int bsx = BarsSinceExitExecution(0, "", 0); int bse = BarsSinceEntryExecution(0, "", 0); if (PrintOut > 1 && !IsInStrategyAnalyzer) { IndicatorProxy.PrintLog(true, IsLiveTrading(), CurrentBar + ":OnPositionUpdate, CurrentTrade not updated -- " + ";BarsSinceExit, BarsSinceEntry=" + bsx + "," + bse + ";IsUnmanaged=" + IsUnmanaged + ";IsLiveTrading=" + IsLiveTrading() + ";GetMarketPosition=" + GetMarketPosition() + ";marketPosition=" + marketPosition + ";HasPosition=" + HasPosition() + ";CurrentTrade.PosQuantity=" + CurrentTrade.PosQuantity + ";CurrentTrade.MktPosition=" + CurrentTrade.MktPosition + ";quantity=" + quantity + ";GetAvgPrice=" + GetAvgPrice() + ";averagePrice=" + averagePrice); } //Print(position.ToString() + "--MarketPosition=" + position.MarketPosition); CurrentTrade.OnCurPositionUpdate(position, averagePrice, quantity, marketPosition); if (CurrentTrade.MktPosition != null && CurrentTrade.PosAvgPrice != null && CurrentTrade.PosQuantity != null && CurrentTrade.PosUnrealizedPnL != null) { if (PrintOut > 1 && !IsInStrategyAnalyzer) { IndicatorProxy.PrintLog(true, IsLiveTrading(), String.Format("{0}: OnPositionUpdate, CurrentTrade updated -- CurrentTrade.PosAvgPrice: {1}, CurrentTrade.PosQuantit={2}, CurrentTrade.MktPosition={3}, PnL={4}", CurrentBar, CurrentTrade.PosAvgPrice, CurrentTrade.PosQuantity, CurrentTrade.MktPosition, CurrentTrade.PosUnrealizedPnL)); } } }
/// <summary> /// New position created: update position, setup SL/PT orders(the same bar); /// Old position closed: Start a new trade; /// Position is being held: check performane to adjust SL/PT orders; /// All flat: wait for Command/TradeSignal, or detect new position created; /// /// </summary> /// <param name="position"></param> /// <param name="averagePrice"></param> /// <param name="quantity">always>0</param> /// <param name="marketPosition">flat/long/short</param> public virtual void OnCurPositionUpdate(Cbi.Position position, double averagePrice, int quantity, Cbi.MarketPosition marketPosition) { try { if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1) { InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), String.Format("{0}:OnCurPositionUpdate - AvgPrc: {1}, Quant={2}, MktPos={3}, marketPosition={4}, PnL={5}", InstStrategy.CurrentBar, PosAvgPrice, PosQuantity, MktPosition, marketPosition, PosUnrealizedPnL)); } //Position pos = position.MemberwiseClone(); PositionStatus ps = InstStrategy.GetPositionStatus(PosQuantity); switch (ps) { case PositionStatus.NewEstablished: //New position created, setup SL/PT(the same bar) if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1) { InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), String.Format("{0}:PositionStatus.NewEstablished, MktPos={1}, PosQuantity={2}, marketPosition={3}, quantity={4}", InstStrategy.CurrentBar, MktPosition, PosQuantity, marketPosition, quantity)); } UpdateCurPos(position, averagePrice, quantity, marketPosition); /*InstStrategy.CheckExitSignals(); * InstStrategy.SetExitTradeAction(); * InstStrategy.TakeTradeAction();*/ break; case PositionStatus.Liquidate: //Positions were closed, trade is done, init a new trade; if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1) { InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), String.Format("{0}:PositionStatus.Liquidate, MktPos={1}, PosQuantity={2}, marketPosition={3}, quantity={4}", InstStrategy.CurrentBar, MktPosition, PosQuantity, marketPosition, quantity)); } InitNewTrade(); break; case PositionStatus.Hold: //Position is held, change SL/PT by rule/performance, scale in/out occured; //=> this case is replaced by CheckPerformance() from OnBarUpdate, it won't happen here, only scale in/out will happen if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1) { InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), String.Format("{0}:Position is Held, MktPos={1}, marketPosition={2}, PosQuant={3}, Quant={4}", InstStrategy.CurrentBar, MktPosition, marketPosition, PosQuantity, quantity)); } // InstStrategy.CalProfitTargetAmt(PosAvgPrice, InstStrategy.MM_ProfitFactor); // InstStrategy.CalExitOcoPrice(PosAvgPrice, InstStrategy.MM_ProfitFactor); // InstStrategy.SetSimpleExitOCO(TradeAction.EntrySignal.SignalName); break; case PositionStatus.Flat: break; case PositionStatus.ScaledIn: if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1) { InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), String.Format("{0}:PositionStatus.ScaledIn, MktPos={1}, marketPosition={2}, PosQuant={3}, Quant={4}", InstStrategy.CurrentBar, MktPosition, marketPosition, PosQuantity, quantity)); } break; case PositionStatus.ScaledOut: if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1) { InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), String.Format("{0}:PositionStatus.ScaledOut, MktPos={1}, marketPosition={2}, PosQuant={3}, Quant={4}", InstStrategy.CurrentBar, MktPosition, marketPosition, PosQuantity, quantity)); } break; case PositionStatus.UnKnown: break; } /* * if (MktPosition == MarketPosition.Flat) * { * if(marketPosition == MarketPosition.Flat) { * InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), * String.Format("{0}:NoChangeOnPosition, MktPos={1}, marketPosition={2}", * InstStrategy.CurrentBar, MktPosition, marketPosition)); * } else { //New position created, setup SL/PT * InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), * String.Format("{0}:NewOnPosition, MktPos={1}, marketPosition={2}", * InstStrategy.CurrentBar, MktPosition, marketPosition)); * } * //TradeAction.TrailingProfitTargetTics = InstStrategy.GetTicksByCurrency(TradeAction.profitTargetAmt); * //trailingSLTic = GetTicksByCurrency(CurrentTrade.stopLossAmt); * } * else if (marketPosition == MarketPosition.Flat) { //Positions were closed, trade is done, init a new trade; * InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), "InitNewTrade called"); * InitNewTrade(); * } * else //Position is held, change SL/PT by rule/performance, scale in/out occured; * { * InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(), * String.Format("{0}:Position is Held, MktPos={1}, marketPosition={2}, PosQuant={3}, Quant={4}", * InstStrategy.CurrentBar, MktPosition, marketPosition, PosQuantity, quantity)); * InstStrategy.CalProfitTargetAmt(PosAvgPrice, InstStrategy.MM_ProfitFactor); * InstStrategy.CalExitOcoPrice(PosAvgPrice, InstStrategy.MM_ProfitFactor); * InstStrategy.SetSimpleExitOCO(TradeAction.EntrySignal.SignalName); * // SetBracketOrder.OCOOrder.ProfitTargetOrder(OrderSignalName.EntryShort.ToString()); * // SetBracketOrder.OCOOrder.StopLossOrder(OrderSignalName.EntryShort.ToString()); * } */ } catch (Exception ex) { InstStrategy.Print("Exception=" + ex.StackTrace); } }
protected override void OnPositionUpdate(Cbi.Position position, double averagePrice, int quantity, Cbi.MarketPosition marketPosition) { }