Exemple #1
0
        /// <summary>
        /// NewTrade: Setup EnOrder
        /// EndTrade: Clean up En, SL, PT orders
        /// </summary>
        /// <param name="execution"></param>
        /// <param name="executionId"></param>
        /// <param name="price"></param>
        /// <param name="quantity"></param>
        /// <param name="marketPosition"></param>
        /// <param name="orderId"></param>
        /// <param name="time"></param>
        public virtual void OnCurExecutionUpdate(Execution execution, string executionId,
                                                 double price, int quantity, MarketPosition marketPosition, string orderId, DateTime time)
        {
            try {
                if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1)
                {
                    InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(),
                                                         InstStrategy.CurrentBar + ":OnCurExecutionUpdate"
                                                         + ";executionId=" + executionId
                                                         + ";orderId=" + orderId
                                                         + ";execution.Order.Name=" + execution.Order.Name
                                                         + ";marketPosition=" + marketPosition
                                                         + ";quantity=" + quantity
                                                         + ";price=" + price
                                                         );
                }
                PositionStatus ps = InstStrategy.GetPositionStatus(PosQuantity);
                switch (ps)
                {
                case PositionStatus.NewEstablished:                        //New position created, setup SL/PT
                    if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1)
                    {
                        InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(),
                                                             String.Format("{0}:OnCurExecutionUpdate PositionStatus.NewEstablished, MktPos={1}, PosQuantity={2}, marketPosition={3}, quantity={4}",
                                                                           InstStrategy.CurrentBar, MktPosition, PosQuantity, marketPosition, quantity));
                    }
                    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}:OnCurExecutionUpdate PositionStatus.Liquidate, MktPos={1}, PosQuantity={2}, marketPosition={3}, quantity={4}",
                                                                           InstStrategy.CurrentBar, MktPosition, PosQuantity, marketPosition, quantity));
                    }
                    //InitNewTrade();
                    break;

                case PositionStatus.Hold:
                    break;

                case PositionStatus.Flat:
                    break;

                case PositionStatus.ScaledIn:
                    break;

                case PositionStatus.ScaledOut:
                    break;

                case PositionStatus.UnKnown:
                    break;
                }
            } catch (Exception ex) {
                InstStrategy.Print("Exception=" + ex.StackTrace);
            }
        }
Exemple #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="order"></param>
        /// <param name="limitPrice"></param>
        /// <param name="stopPrice"></param>
        /// <param name="quantity"></param>
        /// <param name="filled"></param>
        /// <param name="averageFillPrice"></param>
        /// <param name="orderState"></param>
        /// <param name="time"></param>
        /// <param name="error"></param>
        /// <param name="comment"></param>
        public virtual void OnCurOrderUpdate(Cbi.Order order, double limitPrice, double stopPrice,
                                             int quantity, int filled, double averageFillPrice,
                                             Cbi.OrderState orderState, DateTime time, Cbi.ErrorCode error, string comment)
        {
            if (!this.InstStrategy.IsInStrategyAnalyzer && InstStrategy.PrintOut > 1)
            {
                InstStrategy.IndicatorProxy.PrintLog(true, InstStrategy.IsLiveTrading(),
                                                     String.Format("{0}:OnCurOrderUpdate, limitPrice={1}, stopPrice={2}, quantity={3},\t\n filled={4}, averageFillPrice={5}, orderState={6}",
                                                                   InstStrategy.CurrentBar, limitPrice, stopPrice, quantity, filled, averageFillPrice, orderState));
            }
            try {
//			    if (order.Name == "myEntryOrder" && orderState != OrderState.Filled)
//			      entryOrder = order;


//			    if (entryOrder != null && entryOrder == order)
//			    {
//			        Print(order.ToString());
//			        if (order.OrderState == OrderState.Filled)
//			              entryOrder = null;
//			    }
                //GetBracketOrderSubType(order);

                //InstStrategy.IndicatorProxy.TraceMessage(this.Name, 1);
                if (BracketOrder.EntryOrder != null && BracketOrder.EntryOrder == order)
                {
                    if (orderState == OrderState.Cancelled ||
                        //order.OrderState == OrderState.Filled ||
                        orderState == OrderState.Rejected ||
                        orderState == OrderState.Unknown)
                    {
                        barsSinceEnOrd          = 0;
                        BracketOrder.EntryOrder = null;
                    }
                }

                //InstStrategy.IndicatorProxy.TraceMessage(this.Name, 1);
                if (BracketOrder.TrailingSLOrder.EntryOrder != null && BracketOrder.TrailingSLOrder.EntryOrder == order)
                {
                    if (orderState == OrderState.Cancelled ||
                        orderState == OrderState.Rejected ||
                        orderState == OrderState.Unknown)
                    {
                        barsSinceEnOrd = 0;
                        BracketOrder.TrailingSLOrder.EntryOrder = null;
                    }
                }
            } catch (Exception ex) {
                InstStrategy.Print("Exception=" + ex.StackTrace);
            }
        }
Exemple #3
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);
            }
        }
Exemple #4
0
        public int barsSinceEnOrd = 0;        //Bar count since the en order issued

        #endregion

        #region Money Mgmt variables

//		public double profitTargetAmt = 350;//36 Default(450-650 USD) setting for MM_ProfitTargetAmt
//		public int profitTargetTic = 36;//Ticks of profit target
//		public int profitTgtIncTic = 6;//8 Default tick Amt for ProfitTarget increase Amt
//		public int profitLockMinTic = 16;//24 Default ticks Amt for Min Profit locking
//		public int profitLockMaxTic = 30;//80 Default ticks Amt for Max Profit locking

//		public double stopLossAmt = 200;//16 ticks Default setting for stopLossAmt
//		public int stopLossTic = 16;//16 Default setting for stopLossTic
//		public int stopLossIncTic = 4;//4 Default tick Amt for StopLoss increase Amt

//		public double breakEvenAmt = 150;//150 the profits amount to trigger setting breakeven order

//		public double trailingSLAmt = 100;//300 Default setting for trailing Stop Loss Amt
//		public int trailingSLTic = 4;//Ticks for trailing stop loss order
//		public double traillingSLPercent = 1;//Percent for trailing stop loss order

//		public bool slTrailing = false;//Trailing stop loss
//		public bool ptTrailing = false;//Trailing profit target

        /// <summary>
        /// Use price for the internal unified CalculationMode
        /// since the stop loss over breakeven will be negative,
        /// and it is easy to find conflict with SL/PT/TLSL price in OCO order;
        /// SL, PT Amt and Tic are non-changable after tradeObj is init for new trade,
        /// the price is changable to ajust during the exit OCO lifecycle;
        /// </summary>
//		public CalculationMode PTCalculationMode = CalculationMode.Currency;//Profit target CalMode
//		public CalculationMode SLCalculationMode = CalculationMode.Currency;//Stoploss CalMode
//		public CalculationMode BECalculationMode = CalculationMode.Currency;//Breakeven CalMode
//		public CalculationMode TLSLCalculationMode = CalculationMode.Ticks;//Trailing SL CalMode

//		public double DailyLossLmt = -200;//-300 the daily loss limit amount
//		public double ProfitFactor = 0.5;//PT/SL ratio
        //public int MaxOpenPosition = 1; //Quantity of the total contracts allowed to trade for the strategy

//		public double profitTargetPrice = 0;//Runtime var. For trailing PT using the price to set OCO order
//		public double stopLossPrice = 0;//Runtime var; Using price to set OCO order, since Amt could be negative
//		public double trailingSLPrice = 0;//Runtime var. Price for trailing stoploss price
//		public int trailingPTTic = 16;//Runtime var. Ticks for trailing ProfitTarget, using ticks to record current PT

        #endregion

        #region Trade Methods

        private string GetNewTradeID()
        {
            return("TD-" + InstStrategy.GetBarTimestampStr(0));
        }