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; } }
/// <summary> /// Открытие позиции лонг по лимиту /// </summary> /// <returns>Позиция, которая будет открыта</returns> private Position OpenLong(Position position = null) { // Определяем объем и цену входа в позицию лонг decimal volumePosition = GetVolumePosition(_tab.PriceBestAsk, DepositNameCode.ValueString); decimal pricePosition = GetPriceBuy(volumePosition); // Если объем входа в позицию посчитался не корректно, то не покупаем if (volumePosition <= 0) { _tab.SetNewLogMessage($"OpenLong: некорректный объем - {volumePosition}. Покупка не возможна.", Logging.LogMessageType.Error); // сброс сигнала входа в лонг по реверсной системе _signalInLong = false; return(null); } // если цена входа в позицию посчиталась не корректно, то не покупаем if (pricePosition <= 0) { _tab.SetNewLogMessage($"OpenLong: некорректная цена - {pricePosition}. Покупка не возможна.", Logging.LogMessageType.Error); // сброс сигнала входа в лонг по реверсной системе _signalInLong = false; return(null); } // покупаем по лимиту // к цене входа в позицию добавляем проскальзывание (покупаем дороже) decimal pricePositionWithSlippage = pricePosition + Slippage.ValueInt * _tab.Securiti.PriceStep; if (position == null) { // вход в позицию лонг по лимиту position = _tab.BuyAtLimit(volumePosition, pricePositionWithSlippage); if (OnDebug.ValueBool) { _tab.SetNewLogMessage($"Отладка. Открытие лонга по лимиту: объем - {volumePosition}, цена - {pricePosition}, цена с проск. - {pricePositionWithSlippage}.", Logging.LogMessageType.User); } } else { // повторный вход в позицию лонг по лимиту _tab.BuyAtLimitToPosition(position, pricePositionWithSlippage, volumePosition); if (OnDebug.ValueBool) { _tab.SetNewLogMessage($"Отладка. Повторное открытие лонга {position.Number} по лимиту: объем - {volumePosition}, цена - {pricePosition}, цена с проск. - {pricePositionWithSlippage}.", Logging.LogMessageType.User); } } // сброс флага входа в лонг по реверсной системе _signalInLong = false; return(position); }
/// <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); } } } } }