/// <summary> /// Call from OnUserDealData /// </summary> /// <param name="isin"></param> /// <param name="bp"></param> protected override void UpdateMonitorPosisionsAll(string isin, CBotPos bp) { base.UpdateMonitorPosisionsAll(isin, bp); BindTradersDispatcher(); if (_tradersDispatcher == null) { _tradersDispatcher = _dealingServer.TradersDispatcher; } if (_tradersDispatcher != null) { _tradersDispatcher.EnqueueUpdatUserPositionsMonitor(this, BotId); _tradersDispatcher.EnqueueUpdateVm(BotId); } lock (MonitorPositionsAll) { CBotPos pos = new CBotPos(); if (MonitorPositionsAll.TryGetValue(isin, out pos)) { _subBots[isin].OnUpdatePosition(pos); } } }
protected override void RecalcBotStructs(CBotEventStruct botEvent) { try { base.RecalcBotStructs(botEvent); if (MonitorMarketDataAll.ContainsKey(m_isin)) { MonitorMarketData = MonitorMarketDataAll[m_isin]; } if (MonitorPositionsAll.ContainsKey(m_isin)) { MonitorPositions = MonitorPositionsAll[m_isin]; } lock (MonitorOrdersAll) { if (MonitorOrdersAll.ContainsKey(m_isin)) { MonitorOrders = MonitorOrdersAll[m_isin]; } } mxCurrentStocks[m_isin].WaitOne(); if (m_currentStocks.ContainsKey(m_isin) && m_currentStocks[m_isin].ContainsKey(Direction.Down) && m_currentStocks[m_isin].ContainsKey(Direction.Up) ) { if (m_currentStocks[m_isin][Direction.Down].Count > 0 && m_currentStocks[m_isin][Direction.Down][0].Price > 0) { MonitorMarketData.Bid = m_currentStocks[m_isin][Direction.Down][0].Price; } if (m_currentStocks[m_isin][Direction.Up].Count > 0 && m_currentStocks[m_isin][Direction.Up][0].Price > 0) { MonitorMarketData.Ask = m_currentStocks[m_isin][Direction.Up][0].Price; } } } catch (Exception e) { Error("RecalcBotStructs bot=" + Name, e); } finally { mxCurrentStocks[m_isin].ReleaseMutex(); } }
protected override void RecalcBotLogics(CBotEventStruct botEvent) { base.RecalcBotLogics(botEvent); //------------------------ INITIAL BLOCK ---------------------------------------------------------------------------- if (IsState(EnmStrategyStates._010_Initial)) { //tempo for debugging CloseAllPositions(); // DisableBot(); if (m_TimeframeAnalyzer == null) { m_TimeframeAnalyzer = _dealingServer.DealBox.DealsStruct[m_isin].TimeFrameAnalyzer; } UpdateLastHighLow(); if (m_HighLast != 0 && m_LowLast != 0) { SetState(EnmStrategyStates._020_WaitingForExtremumBrake); } } //----------------------------------------------------------------------------------------------------------------------------------- //--------------------- WAITING FOR EXTREMUM BLOCK------------------------------------------------------------------------------------- else if (IsState(EnmStrategyStates._020_WaitingForExtremumBrake)) { if (botEvent.EventCode == EnmBotEventCode.OnTFUpdate) { string stTF = (((BotEventTF)botEvent.Data).TFUpdate).ToString(); } else if (botEvent.EventCode == EnmBotEventCode.OnTFChanged) { string stTF = (((BotEventTF)botEvent.Data).TFUpdate).ToString(); if (stTF == m_parTF) { DateTime dtn = DateTime.Now; DateTime dt = ((CTimeFrameInfo)((BotEventTF)botEvent.Data).TFI).Dt;; //m_ClosedTFPrice = ((CTimeFrameInfo)((BotEventTF)botEvent.Data).TFI).ClosePrice; m_HighCurrent = ((CTimeFrameInfo)((BotEventTF)botEvent.Data).TFI).HighPrice; m_LowCurrent = ((CTimeFrameInfo)((BotEventTF)botEvent.Data).TFI).LowPrice; m_ClosedTFVolume = ((CTimeFrameInfo)((BotEventTF)botEvent.Data).TFI).Volume; //m_TimeframeAnalyzer.GetTFIByDate(m_parTF, dt).ClosePrice; if (WasBreakedExtermum()) { if (m_ClosedTFVolume > m_parVolume) { Log("m_ClosedTFVolume=" + m_ClosedTFVolume); SetState(EnmStrategyStates._030_ExtremumWasBrake); } else { //SetState(EnmStrategyStates._020_WaitingForExtremumBrake); Log("m_ClosedTFVolume <= m_parVolume Not enough volume. m_ClosedTFVolume=" + m_ClosedTFVolume + " m_parVolume=" + m_parVolume); UpdateLastHighLow(); } } } } } //--------------------- WAITING FOR EXTREMUM BLOCK------------------------------------------------------------------------------------- else if (IsState(EnmStrategyStates._030_ExtremumWasBrake)) { StartTimer("DelayAfterExtremumBrake"); SetState(EnmStrategyStates._040_DelayAfterExtremumBrake); } //--------------------- END WAITING FOR EXTREMUM BLOCK--------------------------------------------------------- //--------------------- DELAY AFTER EXTREMUM BLOCK----------------------------------------------------------------- else if (IsState(EnmStrategyStates._040_DelayAfterExtremumBrake)) { if (botEvent.EventCode == EnmBotEventCode.OnTimer && (string)botEvent.Data == "DelayAfterExtremumBrake") { SetState(EnmStrategyStates._050_BeforeOpenPosition); } } //-------------------------------------------------------------------------------------------------------- else if (IsState(EnmStrategyStates._050_BeforeOpenPosition)) { if (m_brkDir == EnmBrkDir.DOWN) { AddMarketOrder(m_isin, /*OrderDirection.Buy*/ EnmOrderDir.Buy, m_parLot); } else if (m_brkDir == EnmBrkDir.UP) { AddMarketOrder(m_isin, /*OrderDirection.Sell*/ EnmOrderDir.Sell, m_parLot); } SetState(EnmStrategyStates._060_WaitOpenedPos); // StartTimer( } else if (IsState(EnmStrategyStates._060_WaitOpenedPos)) { //TO DO - move to base classes if (MonitorPositionsAll.ContainsKey(m_isin) && Math.Abs(MonitorPositionsAll[m_isin].Amount) == m_parLot) { SetState(EnmStrategyStates._070_AfterOpenedPosition); } } else if (IsState(EnmStrategyStates._070_AfterOpenedPosition)) { if (IsStopLossWasBroken()) { CloseAllPositions(); SetState(EnmStrategyStates._081_AfterStoplossWasBroken); } if (IsTakeProfitWasBroken()) { CloseAllPositions(); SetState(EnmStrategyStates._082_AfterTakeProfitWasBroken); } } else if (IsState(EnmStrategyStates._081_AfterStoplossWasBroken)) { if (MonitorPositionsAll.ContainsKey(m_isin) && Math.Abs(MonitorPositionsAll[m_isin].Amount) == 0) { SetState(EnmStrategyStates._010_Initial); } } else if (IsState(EnmStrategyStates._082_AfterTakeProfitWasBroken)) { if (MonitorPositionsAll.ContainsKey(m_isin) && Math.Abs(MonitorPositionsAll[m_isin].Amount) == 0) { SetState(EnmStrategyStates._010_Initial); } } }