/// <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); } }
/// <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); } }
/// <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); } }
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)); }