Exemple #1
0
        private void OpenStepLimit(Position pos)
        {
            NeadStepOpen = false;
            decimal _volOst = LastPositionVolume_All - pos.OpenVolume;
            decimal v       = pos.OpenVolume;
            decimal price   = pos.EntryPrice;
            decimal step    = Math.Abs(pos.EntryPrice - LastStop) / (StepCount.ValueInt);

            for (int i = 1; i < StepCount.ValueInt; i++)
            {
                v = GetVol(Math.Min(_volOst, v + 2 * v));
                if (v > 0)
                {
                    if (pos.Direction == Side.Buy)
                    {
                        price = price - step;
                        if (price > LastStop)
                        {
                            _tab.BuyAtLimitToPosition(pos, price, v);
                        }
                    }
                    if (pos.Direction == Side.Sell)
                    {
                        price = price + step;
                        if (price < LastStop)
                        {
                            _tab.SellAtLimitToPosition(pos, price, v);
                        }
                    }
                }
                _volOst = _volOst - v;
            }
        }
Exemple #2
0
        /// <summary>
        /// Открытие позиции шорт по лимиту
        /// </summary>
        /// <returns>Позиция, которая будет открыта</returns>
        private Position OpenShort(Position position = null)

        {
            // определяем объем и цену входа в позицию шорт
            decimal volumePosition = GetVolumePosition(_tab.PriceBestBid, DepositNameCode.ValueString);
            decimal pricePosition  = GetPriceSell(volumePosition);

            // если объем входа в позицию посчитался не корректно, то не продаем
            if (volumePosition <= 0)
            {
                _tab.SetNewLogMessage($"OpenShort:  некорректный объем - {volumePosition}. Продажа не возможна.", Logging.LogMessageType.Error);

                // сброс сигнала входа в шорт по реверсной системе
                _signalInShort = false;

                return(null);
            }

            // если цена входа в позицию посчиталась не корректно, то не продаем
            if (pricePosition <= 0)
            {
                _tab.SetNewLogMessage($"OpenShort:  некорректная цена - {pricePosition}. Продажа не возможна.", Logging.LogMessageType.User);

                // сброс сигнала входа в шорт по реверсной системе
                _signalInShort = false;

                return(null);
            }

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

            if (position == null)
            {
                // вход в позицию шорт по лимиту
                position = _tab.SellAtLimit(volumePosition, pricePositionWithSlippage);

                if (OnDebug.ValueBool)
                {
                    _tab.SetNewLogMessage($"Отладка. Открытие шорта по лимиту:  объем - {volumePosition}, цена - {pricePosition}, цена с проск. - {pricePositionWithSlippage}.", Logging.LogMessageType.User);
                }
            }
            else
            {
                // повторный вход в позицию шорт по лимиту
                _tab.SellAtLimitToPosition(position, pricePositionWithSlippage, volumePosition);

                if (OnDebug.ValueBool)
                {
                    _tab.SetNewLogMessage($"Отладка. Повторное открытие шорта {position.Number} по лимиту:  объем - {volumePosition}, цена - {pricePosition}, цена с проск. - {pricePositionWithSlippage}.", Logging.LogMessageType.User);
                }
            }

            // сброс флага входа в шорт по реверсной системе
            _signalInShort = false;

            return(position);
        }
Exemple #3
0
        /// <summary>
        /// logic open position
        /// логика открытия первой позиции и дополнительного входа
        /// </summary>
        private void LogicOpenPosition(List <Candle> candles)
        {
            if (_LastCandleTime != candles[candles.Count - 1].TimeStart)
            {
                _LastCandleTime = candles[candles.Count - 1].TimeStart;
            }
            else
            {
                return;
            }
            List <Position> openPositions = _tab.PositionsOpenAll;

            if (openPositions == null || openPositions.Count == 0)
            {
                // long
                if (Regime.ValueString != "OnlyShort")
                {
                    decimal priceEnter = _lastPcUp + (_lastAtr * KofAtr);
                    _tab.BuyAtStop(VolumeFix1.ValueDecimal, priceEnter + Slipage.ValueDecimal, priceEnter, StopActivateType.HigherOrEqual);
                }

                // Short
                if (Regime.ValueString != "OnlyLong")
                {
                    decimal priceEnter = _lastPcDown - (_lastAtr * KofAtr);
                    _tab.SellAtStop(VolumeFix1.ValueDecimal, priceEnter - Slipage.ValueDecimal, priceEnter, StopActivateType.LowerOrEqyal);
                }
                return;
            }

            openPositions = _tab.PositionsOpenAll;
            for (int i = 0; openPositions != null && i < openPositions.Count; i++)
            {
                if (openPositions[i].State == PositionStateType.Open)
                {
                    if (openPositions[i].Direction == Side.Buy)
                    {
                        if (openPositions[i].OpenVolume < (VolumeFix1.ValueDecimal + VolumeFix2.ValueDecimal) &&
                            candles[candles.Count - 1].Close < _lastPcUp - (_lastAtr * KofAtr))
                        {
                            decimal priceEnter = _lastPcUp - (_lastAtr * KofAtr);
                            _tab.BuyAtLimitToPosition(openPositions[i], priceEnter, VolumeFix2.ValueDecimal);
                        }
                    }
                    else
                    {
                        if (openPositions[i].OpenVolume <(VolumeFix1.ValueDecimal + VolumeFix2.ValueDecimal) &&
                                                         candles[candles.Count - 1].Close> _lastPcUp - (_lastAtr * KofAtr))
                        {
                            decimal priceEnter = _lastPcDown + (_lastAtr * KofAtr);
                            _tab.SellAtLimitToPosition(openPositions[i], priceEnter, VolumeFix2.ValueDecimal);
                        }
                    }
                }
            }
        }