public IMonitor_Door Run(Monitor_UnderlyingPrice.Signal signal) { if (signal == Monitor_UnderlyingPrice.Signal.Rebalance) { // Canceling 상태로 재빨리 옮겨야 한다. Monitor_Door_Canceling next = new Monitor_Door_Canceling(_parent, _orders); return next; } // 위험해 보이는 주문은 취소하고 너무 많이 취소 했다면 다시 진행하도록 한다. int canceledCountThisTurn = CancelDangerousOrders(); _canceledOrderCount += canceledCountThisTurn; int cancedOrderPercent = 100 * _canceledOrderCount / (1 + _orders.Count); if (cancedOrderPercent >= 10) { Monitor_Door_Canceling next = new Monitor_Door_Canceling(_parent, _orders); return next; } int emptyChannel = GetEmptyChannelCount(); for (int i = 0; i < emptyChannel; ++i) { EnterNewDoorOrder(); } return this; }
public IMonitor_Door Run(Monitor_UnderlyingPrice.Signal signal) { if (_parent.EnterAfterCancel) { // rebalancing signal이 오고 AutoEnter 상태라면 Entering state로 변경 Monitor_Door_Entering next = new Monitor_Door_Entering(_parent); return next; } return this; }
public MonitorController_Door(STR_Door parent) { Parent = parent; double targetStrikeOffset = Parent.Input.DoorStrikeOffset; double moveBuffer = Parent.Input.MoveBuffer; MonitorPrice = new Monitor_UnderlyingPrice(targetStrikeOffset, moveBuffer); _monitorDoor = new Monitor_Door_Ready(this); _futureCode = KospiFutureUtil.Ins().KFI.Code; _monitorTime = DateUtil.GetTodayDateTime(12 + 2 + Const.kHourAdjustment_End, 59, 59); this.EnterAfterCancel = false; this.EnterMinCount = true; }
public IMonitor_Door Run(Monitor_UnderlyingPrice.Signal signal) { // 모든 주문이 Cancel되면 Ready상태로 간다. if (IsAllDone()) { Monitor_Door_Ready next = new Monitor_Door_Ready(_parent); return next; } int emptyCount = GetEmptyChannelCount(); for (int i = 0; i < emptyCount; ++i) { CancelOrder(); } return this; }