/// <summary> /// проверить Реактивацию прогрузив систему новым тиком /// </summary> private void ChekReActivator(Trade trade) { // если ордер отозван // и цена пересекла цену переактивации // и время активации не кончалось // вызываем переактивацию стопов и уровней на пробой // отключаем активатор if (_reActivatorIsOn == false) { return; } if (_reActivatorOrder.State == OrderStateType.Fail || _reActivatorOrder.State == OrderStateType.Done || _reActivatorOrder.VolumeExecute != 0) { // ордер с ошибкой или уже частично исполнен _reActivatorIsOn = false; return; } if (_reActivatorOrder.State != OrderStateType.Done && _reActivatorOrder.State != OrderStateType.Cancel) { // ордер ещё выставлен return; } if (DateTime.Now > _reActivatorMaxTime) { _reActivatorIsOn = false; return; } if (_reActivatorOrder.Side == Side.Buy && trade.Price <= _reActivatorPrice) { if (AlertIsOn) { AlertMessageManager.ThrowAlert(null, NameStrategyUniq, "Подошли к уровню выставления ордера после его отзыва. Перевыставляем"); } _tab.SetNewLogMessage("Перевыставляем ордер, бот: " + NameStrategyUniq, LogMessageType.System); _reActivatorIsOn = false; ReActivateOrder(_reActivatorOrder); } else if (_reActivatorOrder.Side == Side.Sell && trade.Price >= _reActivatorPrice) { if (AlertIsOn) { AlertMessageManager.ThrowAlert(null, NameStrategyUniq, "Подошли к уровню выставления ордера после его отзыва. Перевыставляем"); } _tab.SetNewLogMessage("Перевыставляем ордер, бот: " + NameStrategyUniq, LogMessageType.System); _reActivatorIsOn = false; ReActivateOrder(_reActivatorOrder); } }
private void AttachStateManagers() { StateMgr.AddGameState(currentPlayer); FloatingTextMgr = new FloatingTextManager(this); StateMgr.AddGameState(FloatingTextMgr); LevelEnv = new LevelEnvironment(); StateMgr.AddGameState(LevelEnv); AlertMessageMgr = new AlertMessageManager(this, 0.5f); StateMgr.AddGameState(AlertMessageMgr); SpectatorActionMgr = new SpectatorActionsManager(); StateMgr.AddGameState(SpectatorActionMgr); ScreenShakingMgr = new ScreenShakingManager(this); StateMgr.AddGameState(ScreenShakingMgr); }
// отзыв заявок по времени и отступу /// <summary> /// слежение за выставленными и ещё не исполненными ордерами /// </summary> void WatcherOpenPosition() { while (true) { Thread.Sleep(1000); // этот метод создан для того, чтобы инициализировать закрытие // не полностью открытых ордеров в конце периода if (StartProgram == StartProgram.IsTester) { // если тестируем return; } Thread.Sleep(1000); try { List <Position> positions = _tab.PositionsOpenAll; if (positions == null || positions.Count == 0) { continue; } // смотрим первый выход - 3 секунды List <Order> myOrderToFirstClose = new List <Order>(); for (int i = 0; i < positions.Count; i++) { if (positions[i].OpenOrders.Count == 1 && positions[i].OpenOrders[0].State == OrderStateType.Activ && positions[i].Comment != "Second") { myOrderToFirstClose.Add(positions[i].OpenOrders[positions[i].OpenOrders.Count - 1]); } if (positions[i].CloseOrders != null && positions[i].CloseOrders.Count == 1 && positions[i].CloseOrders[positions[i].CloseOrders.Count - 1].State == OrderStateType.Activ) { myOrderToFirstClose.Add(positions[i].CloseOrders[positions[i].CloseOrders.Count - 1]); } } for (int i = 0; i < myOrderToFirstClose.Count; i++) { if (myOrderToFirstClose[i].TimeCallBack.AddSeconds(3) < _tab.TimeServerCurrent) { _reActivatorIsOn = false; _tab.CloseOrder(myOrderToFirstClose[i]); } } // смотрим классический выход List <Order> myOrder = new List <Order>(); for (int i = 0; i < positions.Count; i++) { if (positions[i].OpenOrders[positions[i].OpenOrders.Count - 1].State == OrderStateType.Activ) { myOrder.Add(positions[i].OpenOrders[positions[i].OpenOrders.Count - 1]); } if (positions[i].CloseOrders != null && positions[i].CloseOrders[positions[i].CloseOrders.Count - 1].State == OrderStateType.Activ) { myOrder.Add(positions[i].CloseOrders[positions[i].CloseOrders.Count - 1]); } } for (int i = 0; i < myOrder.Count; i++) { Order order = myOrder[i]; // бежим по коллекции ордеров if (order.State != OrderStateType.Done && order.State != OrderStateType.Fail && order.State != OrderStateType.None) { // если какойто не исполнен полностью DateTime startTime = order.TimeCallBack; DateTime marketTime = _tab.TimeServerCurrent; if (startTime == DateTime.MinValue || startTime == DateTime.MaxValue) { continue; } if (startTime.AddSeconds(LagTimeToOpenClose.TotalSeconds) < marketTime) { _tab.CloseOrder(order); Thread.Sleep(2000); if (AlertIsOn) { AlertMessageManager.ThrowAlert(Properties.Resources.wolf01, NameStrategyUniq, "Отзываем ордер по времени"); } _tab.SetNewLogMessage("Отзываем ордер по времени", LogMessageType.System); } else { decimal priceBid = _tab.PriceBestBid; decimal priceAsk = _tab.PriceBestAsk; if (order.Side == Side.Buy && order.Price + LagPunctToOpenClose * _tab.Securiti.PriceStep < priceAsk) { _tab.CloseOrder(order); Thread.Sleep(2000); if (AlertIsOn) { AlertMessageManager.ThrowAlert(Properties.Resources.wolf01, NameStrategyUniq, "Отзываем ордер по отклонению"); } _tab.SetNewLogMessage("Отзываем ордер по отклонению", LogMessageType.System); } if (order.Side == Side.Sell && order.Price - LagPunctToOpenClose * _tab.Securiti.PriceStep > priceBid) { _tab.CloseOrder(order); Thread.Sleep(2000); if (AlertIsOn) { AlertMessageManager.ThrowAlert(Properties.Resources.wolf01, NameStrategyUniq, "Отзываем ордер по отклонению"); } _tab.SetNewLogMessage("Отзываем ордер по отклонению", LogMessageType.System); } } } else if (order.State == OrderStateType.Fail) { if (AlertIsOn) { AlertMessageManager.ThrowAlert(Properties.Resources.wolf01, NameStrategyUniq, "Ошибка выставления ордера"); } myOrder.Remove(order); i--; } } } catch (Exception) { // ignore } } }
/// <summary> /// проверить условия на вход в позицию /// </summary> private void TryOpenPosition(List <Candle> candles) { decimal damping; decimal avgHigh2; decimal avgLow3; decimal avgLow2; decimal avgHigh3; decimal avgHighShifted; decimal avgLowShifted; try { if (((MovingAverage)_smaHigh4Period).Values.Count - 1 - 10 < 0) { return; } damping = ((Line)_dampIndex).Values[((Line)_dampIndex).Values.Count - 1]; avgHigh2 = ((MovingAverage)_smaHigh2Period).Values[((MovingAverage)_smaHigh2Period).Values.Count - 1]; // SMA.Series(High, 2); avgLow3 = ((MovingAverage)_smaLow3Period).Values[((MovingAverage)_smaLow3Period).Values.Count - 1]; //SMA.Series(Low, 3); avgLow2 = ((MovingAverage)_smaLow3Period).Values[((MovingAverage)_smaLow3Period).Values.Count - 1]; //SMA.Series(Low, 3); avgHigh3 = ((MovingAverage)_smaHigh3Period).Values[((MovingAverage)_smaHigh3Period).Values.Count - 1]; //SMA.Series(High, 3); avgHighShifted = ((MovingAverage)_smaHigh4Period).Values[((MovingAverage)_smaHigh4Period).Values.Count - 1 - 10]; //SMA.Series(High, 4) >> 10; avgLowShifted = ((MovingAverage)_smaLow4Period).Values[((MovingAverage)_smaLow4Period).Values.Count - 1 - 10]; //SMA.Series(Low, 4) >> 10; } catch (Exception error) { _tab.SetNewLogMessage(error.ToString(), LogMessageType.Error); return; } if (EmulatorIsOn) { int currentEmuPos = GetCurrentPosition(); if (currentEmuPos != 0) { return; } } if (damping < 1 && (candles[candles.Count - 1].Close > avgHigh2) && (avgLow3 > avgHighShifted)) { _tab.SetNewLogMessage("Системный вход в лонг. Время: " + candles[candles.Count - 1].TimeStart, LogMessageType.Signal); if (StartProgram == StartProgram.IsTester) { _tab.BuyAtMarket(Volume); } else { _tab.BuyAtLimit(Volume, candles[candles.Count - 1].Close + _tab.Securiti.PriceStep * SlipageOpenFirst); // ЗДЕСЬ!!!!!!!!!!!!!! } return; } else if (damping < 1 && (candles[candles.Count - 1].Close < avgLow2) && (avgHigh3 < avgLowShifted)) { _tab.SetNewLogMessage("Системный вход в шорт. Время: " + candles[candles.Count - 1].TimeStart, LogMessageType.Signal); if (StartProgram == StartProgram.IsTester) { _tab.SellAtMarket(Volume); } else { _tab.SellAtLimit(Volume, candles[candles.Count - 1].Close - _tab.Securiti.PriceStep * SlipageOpenFirst); // ЗДЕСЬ!!!!!!!!!!!!!! } return; } else if (damping <= 1) { if (AlertIsOn) { AlertMessageManager.ThrowAlert(Properties.Resources.Duck, NameStrategyUniq, "Внимание! DI меньше 1, но входа не произошло. На следующей свече возможно открытие"); } } }