Exemple #1
0
    /// <summary>
    /// logic close position
    /// логика зыкрытия позиции и открытие по реверсивной системе
    /// </summary>
    private void LogicClosePosition(List <Candle> candles, Position position)
    {
        if (position.Direction == Side.Buy)
        {
            if (_lastBullsPrice + _lastBearsPrice < -Step.ValueDecimal)
            {
                _tab.CloseAtLimit(position, _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep, position.OpenVolume);

                if (Regime.ValueString != "OnlyLong" && Regime.ValueString != "OnlyClosePosition")
                {
                    _tab.SellAtLimit(Volume.ValueDecimal, _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }

        if (position.Direction == Side.Sell)
        {
            if (_lastBullsPrice + _lastBearsPrice > Step.ValueDecimal)
            {
                _tab.CloseAtLimit(position, _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep, position.OpenVolume);

                if (Regime.ValueString != "OnlyShort" && Regime.ValueString != "OnlyClosePosition")
                {
                    _tab.BuyAtLimit(Volume.ValueDecimal, _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }
    }
Exemple #2
0
        /// <summary>
        /// logic close position
        /// логика зыкрытия позиции и открытие по реверсивной системе
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position position)
        {
            if (position.Direction == Side.Buy)
            {
                if (_lastWr > Upline.Value)
                {
                    _tab.CloseAtLimit(position, _lastPrice - Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyLong && Regime != BotTradeRegime.OnlyClosePosition)
                    {
                        _tab.SellAtLimit(VolumeFix, _lastPrice - Slipage);
                    }
                }
            }

            if (position.Direction == Side.Sell)
            {
                if (_lastWr < Downline.Value)
                {
                    _tab.CloseAtLimit(position, _lastPrice + Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyShort && Regime != BotTradeRegime.OnlyClosePosition)
                    {
                        _tab.BuyAtLimit(VolumeFix, _lastPrice + Slipage);
                    }
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// logic close position
        /// логика зыкрытия позиции и открытие по реверсивной системе
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position position)
        {
            if (position.Direction == Side.Buy)
            {
                if (_lastMacdUp < _lastMacdDown && _lastMom < 100)
                {
                    _tab.CloseAtLimit(position, _lastClose - Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyLong && Regime != BotTradeRegime.OnlyClosePosition)
                    {
                        _tab.SellAtLimit(VolumeFix, _lastClose - Slipage);
                    }
                }
            }

            if (position.Direction == Side.Sell)
            {
                if (_lastMacdUp > _lastMacdDown && _lastMom > 100)
                {
                    _tab.CloseAtLimit(position, _lastClose + Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyShort && Regime != BotTradeRegime.OnlyClosePosition)
                    {
                        _tab.BuyAtLimit(VolumeFix, _lastClose + Slipage);
                    }
                }
            }
        }
Exemple #4
0
    /// <summary>
    /// logic close position
    /// логика зыкрытия позиции и открытие по реверсивной системе
    /// </summary>
    private void LogicClosePosition(List <Candle> candles, Position position)
    {
        if (position.State == PositionStateType.Closing)
        {
            return;
        }
        if (position.Direction == Side.Buy)
        {
            if (_secondRsi >= Upline.Value && _firstRsi <= Upline.Value)
            {
                _tab.CloseAtLimit(position,
                                  _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep, position.OpenVolume);

                if (Regime.ValueString != "OnlyLong" && Regime.ValueString != "OnlyClosePosition")
                {
                    _tab.SellAtLimit(Volume.ValueDecimal,
                                     _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }
        if (position.Direction == Side.Sell)
        {
            if (_secondRsi <= Downline.Value && _firstRsi >= Downline.Value)
            {
                _tab.CloseAtLimit(position,
                                  _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep, position.OpenVolume);

                if (Regime.ValueString != "OnlyShort" && Regime.ValueString != "OnlyClosePosition")
                {
                    _tab.BuyAtLimit(Volume.ValueDecimal,
                                    _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }
    }
Exemple #5
0
        /// <summary>
        /// logic close position
        /// логика закрытия позиции
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position openPosition)
        {
            if (openPosition.Direction == Side.Buy)
            {
                if (_lastPriceC > _pivotR3)
                {
                    _tab.CloseAtLimit(openPosition, _lastPriceC - Slipage, openPosition.OpenVolume);
                }
                if (_lastPriceC < openPosition.EntryPrice - openPosition.EntryPrice / 100m * Stop)
                {
                    _tab.CloseAtMarket(openPosition, openPosition.OpenVolume);
                }
            }

            if (openPosition.Direction == Side.Sell)
            {
                if (_lastPriceC < _pivotS3)
                {
                    _tab.CloseAtLimit(openPosition, _lastPriceC + Slipage, openPosition.OpenVolume);
                }
                if (_lastPriceC > openPosition.EntryPrice + openPosition.EntryPrice / 100m * Stop)
                {
                    _tab.CloseAtMarket(openPosition, openPosition.OpenVolume);
                }
            }
        }
Exemple #6
0
        /// <summary>
        /// Закрытие позиции лонг (продажа)
        /// </summary>
        /// <param name="position">Позиция, которая будет закрыта</param>
        private void CloseLong(Position position)
        {
            // получить цену из стакана, по которой можно продать весь объем для закрытия позиции лонг
            decimal volumePosition = position.OpenVolume;
            decimal pricePosition  = GetPriceSell(volumePosition);

            // если цена выхода из позиции посчиталась правильно, тогда выход из позиции по лимиту
            if (pricePosition > 0)
            {
                // из цены выхода из позиции вычитаем проскальзывание (продаем дешевле)
                decimal priceClosePosition = pricePosition - Slippage.ValueInt * _tab.Securiti.PriceStep;

                // выход из позиции лонг по лимиту
                _tab.CloseAtLimit(position, priceClosePosition, volumePosition);

                if (OnDebug.ValueBool)
                {
                    _tab.SetNewLogMessage($"Отладка. Закрытие лонга по лимиту: объем - {volumePosition}, цена - {pricePosition}, цена с проск.- {priceClosePosition}.", Logging.LogMessageType.User);
                }
            }
            // если цена выхода не посчиталась, тогда выход из позиции лонг по маркету
            else
            {
                _tab.CloseAtMarket(position, volumePosition);
                _tab.SetNewLogMessage($"CloseLong: Некорректная цена выхода. Закрытие лонга по маркету: объем - {volumePosition}.", Logging.LogMessageType.Error);
            }

            return;
        }
Exemple #7
0
        /// <summary>
        /// логика закрытия позиции
        /// </summary>
        private void LogicClosePosition(Position position, List <Candle> candles)
        {
            if (position.State == PositionStateType.Closing)
            {
                return;
            }
            decimal moving = _moving.Values[_moving.Values.Count - 1];

            decimal lastClose = candles[candles.Count - 1].Close;

            if (position.Direction == Side.Buy)
            {
                if (lastClose > moving)
                {
                    _tab.CloseAtLimit(position, lastClose - Slipage, position.OpenVolume);
                }
            }

            if (position.Direction == Side.Sell)
            {
                if (lastClose < moving)
                {
                    _tab.CloseAtLimit(position, lastClose + Slipage, position.OpenVolume);
                }
            }
        }
Exemple #8
0
    /// <summary>
    /// logic close position
    /// логика зыкрытия позиции
    /// </summary>
    private void LogicClosePosition(List <Candle> candles, Position position)
    {
        if (position.Direction == Side.Buy && position.State == PositionStateType.Open)
        {
            if (_lastRviDown > 0 && _lastRviUp < _lastRviDown)
            {
                _tab.CloseAtLimit(position, _lastPrice - Slippage.ValueInt, position.OpenVolume);

                if (Regime.ValueString != "OnlyLong" && Regime.ValueString != "OnlyClosePosition")
                {
                    _tab.SellAtLimit(Volume.ValueDecimal, _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }

        if (position.Direction == Side.Sell && position.State == PositionStateType.Open)
        {
            if (_lastRviDown < 0 && _lastRviUp > _lastRviDown)
            {
                _tab.CloseAtLimit(position, _lastPrice + Slippage.ValueInt, position.OpenVolume);

                if (Regime.ValueString != "OnlyShort" && Regime.ValueString != "OnlyClosePosition")
                {
                    _tab.BuyAtLimit(Volume.ValueDecimal, _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }
    }
Exemple #9
0
        /// <summary>
        /// logic close position
        /// логика зыкрытия позиции и открытие по реверсивной системе
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position position)
        {
            if (position.Direction == Side.Buy)
            {
                if (_lastClose <= _lastLow + ((_lastHigh - _lastLow) / 3) && _lastOpen <= _lastLow + ((_lastHigh - _lastLow) / 3) &&
                    _lastSma > _lastClose)
                {
                    _tab.CloseAtLimit(position, _lastClose - Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyLong && Regime != BotTradeRegime.OnlyClosePosition)
                    {
                        _tab.SellAtLimit(VolumeFix, _lastClose - Slipage);
                    }
                }
            }

            if (position.Direction == Side.Sell)
            {
                if (_lastClose >= _lastHigh - ((_lastHigh - _lastLow) / 3) && _lastOpen >= _lastHigh - ((_lastHigh - _lastLow) / 3) &&
                    _lastSma < _lastClose)
                {
                    _tab.CloseAtLimit(position, _lastClose + Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyShort && Regime != BotTradeRegime.OnlyClosePosition)
                    {
                        _tab.BuyAtLimit(VolumeFix, _lastClose + Slipage);
                    }
                }
            }
        }
Exemple #10
0
        /// <summary>
        /// check exit from position
        /// проверить выходы из позиций
        /// </summary>
        private void CheckExit()
        {
            List <Position> positions = _tab1.PositionsOpenAll;

            if (positions == null || positions.Count == 0)
            {
                return;
            }

            decimal smaShortNow  = _smaShort.Values[_smaShort.Values.Count - 1];
            decimal smaShortLast = _smaShort.Values[_smaShort.Values.Count - 2];
            decimal smaLong      = _smaLong.Values[_smaLong.Values.Count - 1];
            decimal smaLongLast  = _smaLong.Values[_smaLong.Values.Count - 1];

            if (smaShortNow == 0 || smaLong == 0 ||
                smaShortLast == 0 || smaLongLast == 0)
            {
                return;
            }

            if (smaShortLast < smaLongLast &&
                smaShortNow > smaLong)
            {
                List <Position> positions1 = _tab1.PositionOpenLong;
                List <Position> positions2 = _tab2.PositionOpenShort;

                if (positions1 != null && positions1.Count != 0)
                {
                    Position pos1 = positions1[0];
                    _tab1.CloseAtLimit(pos1, _tab1.PriceBestBid - Slipage1, pos1.OpenVolume);
                }

                if (positions2 != null && positions2.Count != 0)
                {
                    Position pos2 = positions2[0];
                    _tab2.CloseAtLimit(pos2, _tab2.PriceBestAsk + Slipage1, pos2.OpenVolume);
                }
            }

            if (smaShortLast > smaLongLast &&
                smaShortNow < smaLong)
            {
                List <Position> positions1 = _tab1.PositionOpenShort;
                List <Position> positions2 = _tab2.PositionOpenLong;

                if (positions1 != null && positions1.Count != 0)
                {
                    Position pos1 = positions1[0];
                    _tab1.CloseAtLimit(pos1, _tab1.PriceBestAsk + Slipage1, pos1.OpenVolume);
                }

                if (positions2 != null && positions2.Count != 0)
                {
                    Position pos2 = positions2[0];
                    _tab2.CloseAtLimit(pos2, _tab2.PriceBestBid - Slipage1, pos2.OpenVolume);
                }
            }
        }
Exemple #11
0
        /// <summary>
        /// Закрытие позиции лонг (продажа)
        /// </summary>
        /// <param name="position">Позиция, которая будет закрыта</param>
        private void CloseLong(Position position)
        {
            decimal volumePosition = position.OpenVolume;

            // цена выхода из позиции (продаем дешевле)
            decimal priceClosePosition = _tab.PriceBestBid - Slippage.ValueInt * _tab.Securiti.PriceStep;

            // выход из позиции лонг по лимиту
            _tab.CloseAtLimit(position, priceClosePosition, volumePosition);
        }
        private void CloseShort(Position shortPosition)
        {
            // если позиция уже закрывается, то ничего не делаем
            if (shortPosition.CloseActiv)
            {
                return;
            }

            // выставляем лимитную заявку на закрытие позиции шорт (покупаем)
            _tabSec.CloseAtLimit(shortPosition,
                                 _tabSec.PriceBestAsk + Slippage * _tabSec.Securiti.PriceStep,
                                 shortPosition.OpenVolume);
        }
Exemple #13
0
        private void CloseAllPositions()
        {
            List <Position> openPositions = _tab.PositionsOpenAll;

            Position[] poses = openPositions.ToArray();

            decimal lastBestBuy  = _tab.PriceBestBid;
            decimal lastBestSell = _tab.PriceBestAsk;

            for (int i = 0; poses != null && i < poses.Length; i++)
            {
                if (poses[i].State == PositionStateType.Open ||
                    poses[i].State == PositionStateType.ClosingFail)
                {
                    if (poses[i].CloseActiv)
                    {
                        continue;
                    }
                    if (poses[i].Direction == Side.Buy)
                    {
                        decimal price          = lastBestSell;
                        decimal priceToPercent =
                            poses[i].EntryPrice + poses[i].EntryPrice * (PersentFromBorder.ValueDecimal / 100 / 2);

                        if ((poses[i].CloseOrders == null ||
                             poses[i].CloseOrders.Count < 3) &&
                            priceToPercent > price)
                        {
                            price = priceToPercent;
                        }
                        _tab.CloseAtLimit(poses[i], price, poses[i].OpenVolume);
                    }
                    if (poses[i].Direction == Side.Sell)
                    {
                        decimal price          = lastBestBuy;
                        decimal priceToPercent = poses[i].EntryPrice - poses[i].EntryPrice * (PersentFromBorder.ValueDecimal / 100 / 2);

                        if ((poses[i].CloseOrders == null ||
                             poses[i].CloseOrders.Count < 3) &&
                            priceToPercent < price)
                        {
                            price = priceToPercent;
                        }

                        _tab.CloseAtLimit(poses[i], price, poses[i].OpenVolume);
                    }
                }
            }

            Thread.Sleep(200);
        }
Exemple #14
0
        private void _tab_PositionOpeningSuccesEvent(Position obj)
        {
            if (
                (obj.Direction == Side.Buy && LastStop > obj.EntryPrice) ||
                (obj.Direction == Side.Sell && LastStop < obj.EntryPrice) ||
                LastStop == 0
                )
            {
                LastStop = GetStopLevel(obj.Direction, obj.EntryPrice);
            }
            //выставим новые стопы

            _tab.CloseAtServerTrailingStop(obj, LastStop, LastStop);
            if (NeadStepOpen)
            {
                OpenStepLimit(obj);
            }
            //        _tab.CloseAtProfit(obj, 2*(obj.EntryPrice - LastStop)+ obj.EntryPrice, 2 * (obj.EntryPrice - LastStop) + obj.EntryPrice);

            //_tab.CloseAtTrailingStop(obj, LastStop, LastStop);
            if (UseSafe.ValueBool)
            {
                decimal fixPOs = 2 * obj.EntryPrice - LastStop;
                decimal vol    = obj.OpenVolume / 2;
                if (isContract.ValueBool)
                {
                    vol = (int)vol;
                }
                _tab.CloseAtLimit(obj, fixPOs, vol);
            }
            if (Breakeven.ValueBool)
            {
                NeedBreakeven = true;
            }
        }
Exemple #15
0
 /// <summary>
 /// logic close position
 /// логика зыкрытия позиции и открытие по реверсивной системе
 /// </summary>
 private void LogicClosePosition(Position position, BotTabSimple tab, decimal lastRsi)
 {
     if (position.Direction == Side.Buy)
     {
         if (lastRsi > Upline.ValueInt)
         {
             tab.CloseAtLimit(position, tab.PriceBestBid - Slippage.ValueInt * tab.Securiti.PriceStep, position.OpenVolume);
         }
     }
     if (position.Direction == Side.Sell)
     {
         if (lastRsi < Downline.ValueInt)
         {
             tab.CloseAtLimit(position, tab.PriceBestAsk + Slippage.ValueInt * tab.Securiti.PriceStep, position.OpenVolume);
         }
     }
 }
Exemple #16
0
    /// <summary>
    /// logic close position
    /// логика зыкрытия позиции и открытие по реверсивной системе
    /// </summary>
    private void LogicClosePosition(List <Candle> candles, Position position)
    {
        if (position.Direction == Side.Buy)
        {
            if (_stocLastDown > Upline.Value && _stocLastDown < _stocLastUp)
            {
                _tab.CloseAtLimit(
                    position,
                    _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep,
                    position.OpenVolume);

                if (Regime.ValueString != "OnlyLong" && Regime.ValueString != "OnlyClosePosition")
                {
                    List <Position> positions = _tab.PositionsOpenAll;
                    if (positions.Count >= 2)
                    {
                        return;
                    }

                    _tab.SellAtLimit(Volume.ValueDecimal, _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }

        if (position.Direction == Side.Sell)
        {
            if (_stocLastDown < Downline.Value && _stocLastDown > _stocLastUp)
            {
                _tab.CloseAtLimit(
                    position,
                    _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep,
                    position.OpenVolume);

                if (Regime.ValueString != "OnlyShort" && Regime.ValueString != "OnlyClosePosition")
                {
                    List <Position> positions = _tab.PositionsOpenAll;
                    if (positions.Count >= 2)
                    {
                        return;
                    }
                    _tab.BuyAtLimit(Volume.ValueDecimal, _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }
    }
Exemple #17
0
        /// <summary>
        /// logic close position
        /// логика зыкрытия позиции
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position position)
        {
            if (position.Direction == Side.Buy)
            {
                if (_lastClose < _lastSma - Step)
                {
                    _tab.CloseAtLimit(position, _lastClose - Slipage, position.OpenVolume);
                }
            }

            if (position.Direction == Side.Sell)
            {
                if (_lastClose > _lastSma + Step)
                {
                    _tab.CloseAtLimit(position, _lastClose - Slipage, position.OpenVolume);
                }
            }
        }
        private void TryCloseShortPositions()
        {
            // получаем все позиции шорт
            List <Position> positions = _tab.PositionOpenShort;

            for (int i = 0; i < positions.Count; i++)
            {
                // если позиция уже закрывается, то ничего не делаем
                if (positions[i].CloseActiv)
                {
                    continue;
                }
                // выставляем лимитную заявку на закрытие позиции шорт (покупаем)
                // дополнительно добавил проскальзывание
                _tab.CloseAtLimit(positions[i],
                                  _tab.PriceBestAsk + Slippage * _tab.Securiti.PriceStep,
                                  positions[i].OpenVolume);
            }
        }
Exemple #19
0
        /// <summary>
        /// logic close position
        /// логика зыкрытия позиции и открытие по реверсивной системе
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position position)
        {
            decimal lastClose = candles[candles.Count - 1].Close;

            if (position.Direction == Side.Buy)
            {
                if (lastClose < _lastMa || _lastRsi > Upline.Value)
                {
                    _tab.CloseAtLimit(position, _lastPrice - Slipage, position.OpenVolume);
                }
            }
            if (position.Direction == Side.Sell)
            {
                if (lastClose > _lastMa || _lastRsi < Downline.Value)
                {
                    _tab.CloseAtLimit(position, _lastPrice + Slipage, position.OpenVolume);
                }
            }
        }
Exemple #20
0
    /// <summary>
    /// logic close position
    /// логика зыкрытия позиции и открытие по реверсивной системе
    /// </summary>
    private void LogicClosePosition(List <Candle> candles, Position position)
    {
        if (position.State == PositionStateType.Closing ||
            position.CloseActiv == true ||
            (position.CloseOrders != null && position.CloseOrders.Count > 0))
        {
            return;
        }

        if (position.Direction == Side.Buy)
        {
            if (_lastPrice < _bolLastDown)
            {
                _tab.CloseAtLimit(
                    position,
                    _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep,
                    position.OpenVolume);

                if (Regime.ValueString != "OnlyLong" &&
                    Regime.ValueString != "OnlyClosePosition")
                {
                    _tab.SellAtLimit(Volume.ValueDecimal, _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }
        if (position.Direction == Side.Sell)
        {
            if (_lastPrice > _bolLastUp)
            {
                _tab.CloseAtLimit(
                    position,
                    _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep,
                    position.OpenVolume);

                if (Regime.ValueString != "OnlyShort" &&
                    Regime.ValueString != "OnlyClosePosition")
                {
                    _tab.BuyAtLimit(Volume.ValueDecimal, _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }
    }
Exemple #21
0
        /// <summary>
        /// close position logic
        /// логика закрытия позиции
        /// </summary>
        private void LogicClosePosition(Position position, List <Candle> candles)
        {
            if (position.State != PositionStateType.Open)
            {
                return;
            }

            if (position.Direction == Side.Buy)
            {
                if (_lastPrice < _lastMiddleAlligator)
                {
                    _tab.CloseAtLimit(position, _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep, position.OpenVolume);
                }
            }

            if (position.Direction == Side.Sell)
            {
                if (_lastPrice > _lastMiddleAlligator)
                {
                    _tab.CloseAtLimit(position, _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep, position.OpenVolume);
                }
            }
        }
Exemple #22
0
        /// <summary>
        /// logic close position
        /// логика зыкрытия позиции и открытие по реверсивной системе
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position position)
        {
            if (position.State != PositionStateType.Open)
            {
                return;
            }

            if (position.Direction == Side.Buy)
            {
                if (_lastPriceL < _lastPriceChDown)
                {
                    _tab.CloseAtLimit(position, _lastPriceC - Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyLong &&
                        Regime != BotTradeRegime.OnlyClosePosition &&
                        _tab.PositionsOpenAll.Count < 3)
                    {
                        _tab.SellAtLimit(VolumeFix, _lastPriceC - Slipage);
                    }
                }
            }

            if (position.Direction == Side.Sell)
            {
                if (_lastPriceH > _lastPriceChUp)
                {
                    _tab.CloseAtLimit(position, _lastPriceC + Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyShort && Regime
                        != BotTradeRegime.OnlyClosePosition &&
                        _tab.PositionsOpenAll.Count < 3)
                    {
                        _tab.BuyAtLimit(VolumeFix, _lastPriceC + Slipage);
                    }
                }
            }
        }
Exemple #23
0
        /// <summary>
        /// logic close position
        /// логика зыкрытия позиции и открытие по реверсивной системе
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position position)
        {
            if (position.State != PositionStateType.Open ||
                position.CloseActiv == true ||
                (position.CloseOrders != null && position.CloseOrders.Count > 0))
            {
                return;
            }

            if (position.Direction == Side.Buy)
            {
                if (_lastClose <= _lastLow + ((_lastHigh - _lastLow) / 3) && _lastOpen <= _lastLow + ((_lastHigh - _lastLow) / 3) &&
                    _lastSma > _lastClose)
                {
                    _tab.CloseAtLimit(position, _lastClose - Slipage, position.OpenVolume);

                    if (Regime == BotTradeRegime.On)  // Fix: Открываем реверсивную сделку только если торгуем и в лонг и в шорт
                    {
                        _tab.SellAtLimit(VolumeFix, _lastClose - Slipage);
                    }
                }
            }

            else if (position.Direction == Side.Sell)
            {
                if (_lastClose >= _lastHigh - ((_lastHigh - _lastLow) / 3) && _lastOpen >= _lastHigh - ((_lastHigh - _lastLow) / 3) &&
                    _lastSma < _lastClose)
                {
                    _tab.CloseAtLimit(position, _lastClose + Slipage, position.OpenVolume);

                    if (Regime == BotTradeRegime.On)  // Fix: Открываем реверсивную сделку только если торгуем и в лонг и в шорт
                    {
                        _tab.BuyAtLimit(VolumeFix, _lastClose + Slipage);
                    }
                }
            }
        }
Exemple #24
0
        /// <summary>
        /// logic close position
        /// логика зыкрытия позиции и открытие по реверсивной системе
        /// </summary>
        private void LogicClosePosition(List <Candle> candles, Position position)
        {
            if (position.State != PositionStateType.Open ||
                position.CloseActiv == true ||
                (position.CloseOrders != null && position.CloseOrders.Count > 0))
            {
                return;
            }

            if (position.Direction == Side.Buy)
            {
                if (_lastClose <= _lastLow + ((_lastHigh - _lastLow) / 3) && _lastOpen <= _lastLow + ((_lastHigh - _lastLow) / 3) &&
                    _lastSma > _lastClose)
                {
                    _tab.CloseAtLimit(position, _lastClose - Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyLong && Regime != BotTradeRegime.OnlyClosePosition)
                    {
                        _tab.SellAtLimit(VolumeFix, _lastClose - Slipage);
                    }
                }
            }

            else if (position.Direction == Side.Sell)
            {
                if (_lastClose >= _lastHigh - ((_lastHigh - _lastLow) / 3) && _lastOpen >= _lastHigh - ((_lastHigh - _lastLow) / 3) &&
                    _lastSma < _lastClose)
                {
                    _tab.CloseAtLimit(position, _lastClose + Slipage, position.OpenVolume);

                    if (Regime != BotTradeRegime.OnlyLong && Regime != BotTradeRegime.OnlyClosePosition)
                    {
                        _tab.BuyAtLimit(VolumeFix, _lastClose + Slipage);
                    }
                }
            }
        }
Exemple #25
0
    /// <summary>
    /// logic close position
    /// логика зыкрытия позиции и открытие по реверсивной системе
    /// </summary>
    private void LogicClosePosition(List <Candle> candles, Position position, List <Position> allPos)
    {
        if (position.State != PositionStateType.Open)
        {
            return;
        }

        if (position.Direction == Side.Buy)
        {
            if (_lastCci > Upline.Value)
            {
                _tab.CloseAtLimit(position, _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep, position.OpenVolume);

                if (Regime.ValueString != "OnlyLong" &&
                    Regime.ValueString != "OnlyClosePosition" &&
                    allPos.Count < 3)
                {
                    _tab.SellAtLimit(Volume.ValueDecimal, _lastPrice - Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }

        if (position.Direction == Side.Sell)
        {
            if (_lastCci < Downline.Value)
            {
                _tab.CloseAtLimit(position, _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep, position.OpenVolume);

                if (Regime.ValueString != "OnlyShort" &&
                    Regime.ValueString != "OnlyClosePosition" &&
                    allPos.Count < 3)
                {
                    _tab.BuyAtLimit(Volume.ValueDecimal, _lastPrice + Slippage.ValueInt * _tab.Securiti.PriceStep);
                }
            }
        }
    }
Exemple #26
0
        /// <summary>
        /// ошибка с закрытием заявки
        /// </summary>
        void _tab_PositionClosingFailEvent(Position position)
        {
            if (position.OpenVolume > 0)
            {
                position.State = PositionStateType.Open;
            }
            if (position.OpenVolume < 0)
            {
                position.State = PositionStateType.ClosingSurplus;
            }
            if (StartProgram == StartProgram.IsTester)
            {
                return;
            }
            if (_positionToClose != null && _positionToClose.Number == position.Number)
            {
                return;
            }

            if (position.OpenVolume == 0)
            {
                return;
            }

            if (position.CloseOrders.Count > 1)
            {
                return;
            }

            if (position.Direction == Side.Buy)
            {
                decimal price = _tab.PriceBestAsk - SlipageCloseSecond * _tab.Securiti.PriceStep;
                _tab.CloseAtLimit(position, price, position.OpenVolume);
            }
            else if (position.Direction == Side.Sell)
            {
                decimal price = _tab.PriceBestBid + SlipageCloseSecond * _tab.Securiti.PriceStep;
                _tab.CloseAtLimit(position, price, position.OpenVolume);
            }
        }
Exemple #27
0
        /// <summary>
        /// close position
        /// закрываем позицию по номеру
        /// </summary>
        private void NeadToClose(int positionNum)
        {
            Position pos;

            pos = _tab1.PositionsOpenAll.Find(position => position.Number == positionNum);

            if (pos != null)
            {
                decimal price;

                if (pos.Direction == Side.Buy)
                {
                    price = _tab1.CandlesAll[_tab1.CandlesAll.Count - 1].Close - _tab1.Securiti.PriceStep * 10;
                }
                else
                {
                    price = _tab1.CandlesAll[_tab1.CandlesAll.Count - 1].Close + _tab1.Securiti.PriceStep * 10;
                }

                _tab1.CloseAtLimit(pos, price, pos.OpenVolume);
                return;
            }

            pos = _tab2.PositionsOpenAll.Find(position => position.Number == positionNum);

            if (pos != null)
            {
                decimal price;

                if (pos.Direction == Side.Buy)
                {
                    price = _tab2.CandlesAll[_tab2.CandlesAll.Count - 1].Close - _tab2.Securiti.PriceStep * 10;
                }
                else
                {
                    price = _tab2.CandlesAll[_tab2.CandlesAll.Count - 1].Close + _tab2.Securiti.PriceStep * 10;
                }

                _tab2.CloseAtLimit(pos, price, pos.OpenVolume);
            }
        }
        public void TryEmergencyClosePosition(BotTabSimple bot, Position position)
        {
            if (TypeDoubleExitOrder == OrderPriceType.Market)
            {
                bot.CloseAtMarket(position, position.OpenVolume);
            }
            else if (TypeDoubleExitOrder == OrderPriceType.Limit)
            {
                decimal price;
                if (position.Direction == Side.Buy)
                {
                    price = bot.PriceBestBid - GetEmergencyExitDistance(bot, position);
                }
                else
                {
                    price = bot.PriceBestAsk + GetEmergencyExitDistance(bot, position);
                }

                bot.CloseAtLimit(position, price, position.OpenVolume);
            }
        }
Exemple #29
0
        /// <summary>
        /// событие завершения свечи
        /// </summary>
        void _tab_CandleFinishedEvent(List <Candle> candles)
        {
            if (Regime == BotTradeRegime.Off)
            {
                return;
            }

            List <Position> positions = _tab.PositionsOpenAll;


            if (positions.Count < MaxPosition)
            {
                if (CheckInter(PatternsToOpen, candles, candles.Count - 1, WeigthToInter))
                {
                    InterInNewPosition(candles[candles.Count - 1].Close);
                }
            }

            for (int i = 0; i < positions.Count; i++)
            {
                if (positions[i].State != PositionStateType.Open)
                {
                    continue;
                }
                decimal priceExit;

                priceExit = CheckExit(positions[i], PatternsToClose, candles, candles.Count - 1, candles[candles.Count - 1].Close);

                if (priceExit == 0)
                {
                    continue;
                }

                _tab.CloseAtLimit(positions[i], priceExit, positions[i].OpenVolume);
            }
        }
Exemple #30
0
        /// <summary>
        /// Логика закрытия позиций
        /// </summary>
        /// <param name="candles">Свечи индекса</param>
        /// <param name="positions1">Открытые позиции по инструменту 1</param>
        /// <param name="positions2">Открытые позиции по инструменту 2</param>
        private void LogicToClose(List <Position> positions1, List <Position> positions2)
        {
            // если позиции по инструментам не в состоянии Open, то ничего не делаем
            // Проблема. Если по какой-то причине открылись только одной ногой, то при этом условии мы никогда не закроемся.

            /*
             * if (positions1.Count != 0 && positions1[0].State != PositionStateType.Open ||
             *  positions2.Count != 0 && positions2[0].State != PositionStateType.Open)
             * {
             *  return;
             * }
             */

            // закрытие позиций, которые открылись, когда индекс (спред) был ниже канала
            if (_lastIndex > _lastMA + _lastIvashov * Multiply.ValueDecimal)
            {
                if (positions1.Count != 0 &&
                    positions1[0].State == PositionStateType.Open &&
                    positions1[0].Direction != Side1)
                {
                    if (positions1[0].Direction == Side.Buy)
                    {
                        _tab1.CloseAtLimit(positions1[0],
                                           _tab1.PriceBestBid - Slippage1 * _tab1.Securiti.PriceStep,
                                           positions1[0].OpenVolume);
                    }
                    else if (positions1[0].Direction == Side.Sell)
                    {
                        _tab1.CloseAtLimit(positions1[0],
                                           _tab1.PriceBestAsk + Slippage1 * _tab1.Securiti.PriceStep,
                                           positions1[0].OpenVolume);
                    }
                }

                if (positions2.Count != 0 &&
                    positions2[0].State == PositionStateType.Open &&
                    positions2[0].Direction != Side2)
                {
                    if (positions2[0].Direction == Side.Buy)
                    {
                        _tab2.CloseAtLimit(positions2[0],
                                           _tab2.PriceBestBid - Slippage2 * _tab2.Securiti.PriceStep,
                                           positions2[0].OpenVolume);
                    }
                    else if (positions2[0].Direction == Side.Sell)
                    {
                        _tab2.CloseAtLimit(positions2[0],
                                           _tab2.PriceBestAsk + Slippage2 * _tab2.Securiti.PriceStep,
                                           positions2[0].OpenVolume);
                    }
                }
            }
            // закрытие позиций, которые открылись, когда индекс (спред) был выше канала
            else if (_lastIndex < _lastMA - _lastIvashov * Multiply.ValueDecimal)
            {
                if (positions1.Count != 0 &&
                    positions1[0].State == PositionStateType.Open &&
                    positions1[0].Direction == Side1)
                {
                    if (positions1[0].Direction == Side.Buy)
                    {
                        _tab1.CloseAtLimit(positions1[0],
                                           _tab1.PriceBestBid - Slippage1 * _tab1.Securiti.PriceStep,
                                           positions1[0].OpenVolume);
                    }
                    else if (positions1[0].Direction == Side.Sell)
                    {
                        _tab1.CloseAtLimit(positions1[0],
                                           _tab1.PriceBestAsk + Slippage1 * _tab1.Securiti.PriceStep,
                                           positions1[0].OpenVolume);
                    }
                }

                if (positions2.Count != 0 &&
                    positions2[0].State == PositionStateType.Open &&
                    positions2[0].Direction == Side2)
                {
                    if (positions2[0].Direction == Side.Buy)
                    {
                        _tab2.CloseAtLimit(positions2[0],
                                           _tab2.PriceBestBid - Slippage2 * _tab2.Securiti.PriceStep,
                                           positions2[0].OpenVolume);
                    }
                    else if (positions2[0].Direction == Side.Sell)
                    {
                        _tab2.CloseAtLimit(positions2[0],
                                           _tab2.PriceBestAsk + Slippage2 * _tab2.Securiti.PriceStep,
                                           positions2[0].OpenVolume);
                    }
                }
            }
        }