コード例 #1
0
        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);
            }
        }
コード例 #2
0
 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]);
 }
コード例 #3
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));
     }
 }
コード例 #4
0
 // 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)
     {
     }
 }
コード例 #5
0
        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;
            }
        }
コード例 #6
0
 /// <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;
                         }
                     }
             }
         }
 }
コード例 #7
0
        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));
        }
コード例 #8
0
        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;
                }
            }
        }
コード例 #9
0
ファイル: ProfitLoss.cs プロジェクト: theprofe8/nt8
        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));
        }
コード例 #10
0
        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));
                }
            }
        }
コード例 #11
0
        /// <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);
            }
        }
コード例 #12
0
 protected override void OnPositionUpdate(Cbi.Position position, double averagePrice,
                                          int quantity, Cbi.MarketPosition marketPosition)
 {
 }