void Fix_loss() // метод выхода из позиции с убытком { List <Position> positions = _tab.PositionsOpenAll; if (positions.Count != 0) { if (vkl_alarm_volum.ValueBool == false) // закрываться с убытком при больших объёмах продаж на рынке? { return; } if (percent_tovara > alarn_persent.ValueInt && // если товара куплено больше % alarn_persent.ValueInt ask_vol_tr > _tmpArarm) // если объемы продаж выше аварийных { _tab.CloseAllAtMarket(); Console.WriteLine(" АВАРийные объемы продаж были " + ask_vol_tr); Console.WriteLine(" Закрыли сделку! товара было на " + percent_tovara + " %"); Thread.Sleep(1500); Payment_profit(); Console.WriteLine(" АВАРИЯ! закрылись с убытком " + temp_profit); vkl_Robota.ValueBool = false; // выключаем работу } if (ask_vol_tr > _tmpArarm) // если объемы продаж выше аварийных { block_in = true; // включаем блокировку усреднения и старта Console.WriteLine("АВАРийный объем продаж!!!! " + ask_vol_tr + " БЛОКИРОВАЛИ усреднение и старт робота "); vkl_Robota.ValueBool = false; // выключаем работу } int ups = _tab.PositionsLast.MyTrades.Count; if (ups <= 1) { return; } if (vkl_met_fix_loss_time.ValueBool == false) { return; } decimal loss = _tab.PositionsLast.ProfitPortfolioPunkt; // смотрим есть ли убыток DateTime last_tred_time = _tab.PositionsLast.MyTrades[ups - 1].Time; // берем время последнего трейда позиции DateTime time_expectation = last_tred_time.AddMinutes(n_min_lesion.ValueInt); // добавляем время ожидания if (time_expectation < real_time && // если вышло время ожидания percent_tovara > alarn_persent.ValueInt && // если товара куплено > alarn_persent % loss > kpit_sum.ValueDecimal && // если убыток меньше критического loss < kpit_sum.ValueDecimal / 2) // но убыток больше половины критического { _tab.CloseAllAtMarket(); // тогда закрываемся Payment_profit(); Console.WriteLine("Закрылись с убытком!!! " + temp_profit); Console.WriteLine("Время позиции в убытке дольше " + n_min_lesion.ValueInt + " минут"); Console.WriteLine(" товара было на " + percent_tovara + " %"); Thread.Sleep(1500); } } }
private void TradeLogic(List <Candle> candles) { if (candles.Count < 5) { return; } // если уже есть открытые позиции - закрываем и выходим if (_tab.PositionsOpenAll != null && _tab.PositionsOpenAll.Count != 0) { _tab.CloseAllAtMarket(); return; } // если закрытие последней свечи выше закрытия предыд - покупаем if (candles[candles.Count - 1].Close > candles[candles.Count - 2].Close) { _tab.BuyAtMarket(1); } // если закрытие последней свечи ниже закрытия предыд - продаем if (candles[candles.Count - 1].Close < candles[candles.Count - 2].Close) { _tab.SellAtMarket(1); } }
private void _vkl_MarketDepthUpdateEvent(MarketDepth marketDepth) // начинается работа с этого метода { if (count < _machka.Lenght) { return; } List <Position> positions = _vkl.PositionsOpenAll; volum_ma = _machka.Values[_machka.Values.Count - 1]; Percent_birgi(); // расчет величины в пунктах процента биржи if (_vkl.PositionsOpenAll.Count != 0) // { if (_vkl.MarketDepth.Bids[0].Price > _vkl.PositionsLast.EntryPrice) // цена выше закупки профитимся { Save_prifit(); Piramida(); } if (_vkl.MarketDepth.Asks[0].Price < _vkl.PositionsLast.EntryPrice) //цена ниже закупки усредняемся { Usrednenie(); StopLoss(); } } if (Vkl == false) // выключение работает как закрытие открытой позиции //с наименьшим убытком (проценты биржи) и не дает возможности открыть новую { if (_vkl.PositionsOpenAll.Count != 0) { if (_vkl.MarketDepth.Bids[0].Price > _vkl.PositionsLast.EntryPrice) { if (_vkl.PositionsLast.ProfitPortfolioPunkt > 0.1m) { _vkl.CloseAllAtMarket(); } } Thread.Sleep(5000); } return; } if (_vkl.PositionsOpenAll.Count == 0) // если не в рынке, открываемся по рынку { if (volum_ma < _vkl.MarketDepth.Asks[0].Price) // если цена выше уровня машки { if (last_hi_candl < _vkl.MarketDepth.Asks[0].Price) // если цена выше последнего хая { _mnog = 1; // начальная инициализация для вычисления количества входов Piramida dola_depa = old_vol_dv; //при отсутствие позиции присваивается значение взятое при старте оса (из файла) ZaprosBalahca(); Rac4et_baz_bal(); if (tek_bal_potfela / dola_depa > 10.1m) { _vkl.BuyAtMarket(Okreglenie(Depo / dola_depa)); Kol_Trad(); _vkl_PositionNetVolumeChangeEvent(positions[0]); } } } } }
void Fix_loss() // метод выхода из позиции с убытком { List <Position> positions = _tab.PositionsOpenAll; if (positions.Count != 0) { decimal loss = _tab.PositionsLast.ProfitPortfolioPunkt; // смотрим есть ли убыток Percent_tovara(); if (loss < kpit_sum.ValueDecimal && // если убыток достиг kpit_sum.ValueDecimal percent_tovara > alarn_persent.ValueInt && // если товара куплено больше % ask_vol_tr > volum_alarm.ValueInt) // если объемы продаж выше аварийных { _tab.CloseAllAtMarket(); Payment_profit(); Console.WriteLine(" АВАРИЯ ! закрылись с убытком " + temp_profit); Console.WriteLine(" АВАРийные объемы продаж были " + ask_vol_tr); Console.WriteLine(" товара было на " + percent_tovara + " %"); Thread.Sleep(1500); //vkl_Robota.ValueBool = false; //Console.WriteLine("РОБОТ ВЫКЛЮЧЕН ! "); } int ups = _tab.PositionsLast.MyTrades.Count; if (ups <= 1) { return; } if (vkl_met_fix_loss.ValueBool == false) { return; } DateTime last_tred_time = _tab.PositionsLast.MyTrades[ups - 1].Time; // берем время последнего трейда позиции DateTime time_expectation = last_tred_time.AddMinutes(n_min_lesion.ValueInt); // добавляем время ожидания if (time_expectation < real_time && // если вышло время ожидания percent_tovara > alarn_persent.ValueInt && // если товара куплено > alarn_persent % loss > kpit_sum.ValueDecimal && // если убыток меньше критического loss < kpit_sum.ValueDecimal / 2) // но убыток больше половины критического { _tab.CloseAllAtMarket(); // тогда закрываемся Payment_profit(); Console.WriteLine("Закрылись с убытком!!! " + temp_profit); Console.WriteLine("Время позиции в убытке дольше " + n_min_lesion.ValueInt + " минут"); Console.WriteLine(" товара было на " + percent_tovara + " %"); Thread.Sleep(1500); } } }
// логика /// <summary> /// событие завершения свечи /// </summary> private void Strateg_CandleFinishedEvent(List <Candle> candles) { if (Regime == BotTradeRegime.Off) { ClearLines(); return; } if (candles.Count < 2) { return; } // распределяем логику в зависимости от текущей позиции List <Position> openPosition = _tab.PositionsOpenAll; if (candles[candles.Count - 1].TimeStart.DayOfWeek == DayOfWeek.Friday && candles[candles.Count - 1].TimeStart.Hour >= 18) {// если у нас пятница вечер if (openPosition != null && openPosition.Count != 0) { _tab.CloseAllAtMarket(); } return; } if (_lastReloadLineTime == DateTime.MinValue || candles[candles.Count - 1].TimeStart.DayOfWeek == DayOfWeek.Monday && candles[candles.Count - 1].TimeStart.Hour < 11 && _lastReloadLineTime.Day != candles[candles.Count - 1].TimeStart.Day) {// если у нас понедельник утро _lastReloadLineTime = candles[candles.Count - 1].TimeStart; ReloadLines(candles); } if (PaintOn) { RepaintLines(); } else { ClearLines(); } if (Regime == BotTradeRegime.OnlyClosePosition) { // если у бота включен режим "только закрытие" return; } LogicOpenPosition(candles); }
// logic / логика /// <summary> /// candle completion event / /// событие завершения свечи /// </summary> private void Strateg_CandleFinishedEvent(List <Candle> candles) { if (Regime == BotTradeRegime.Off) { ClearLines(); return; } if (candles.Count < 2) { return; } List <Position> openPosition = _tab.PositionsOpenAll; if (candles[candles.Count - 1].TimeStart.DayOfWeek == DayOfWeek.Friday && candles[candles.Count - 1].TimeStart.Hour >= 18) {//if we have friday evening если у нас пятница вечер if (openPosition != null && openPosition.Count != 0) { _tab.CloseAllAtMarket(); } return; } if (_lastReloadLineTime == DateTime.MinValue || candles[candles.Count - 1].TimeStart.DayOfWeek == DayOfWeek.Monday && candles[candles.Count - 1].TimeStart.Hour < 11 && _lastReloadLineTime.Day != candles[candles.Count - 1].TimeStart.Day) {//if we have monday morning если у нас понедельник утро _lastReloadLineTime = candles[candles.Count - 1].TimeStart; ReloadLines(candles); } if (PaintOn) { RepaintLines(); } else { ClearLines(); } if (Regime == BotTradeRegime.OnlyClosePosition) { // if the bot has the "close only" mode enabled // если у бота включен режим "только закрытие" return; } LogicOpenPosition(candles); }
/// <summary> /// экстренное закрытие всех позиций /// </summary> public void CloseAndOffAllToMarket() { try { string message = "Риск менеджер предупреждает о превышении дневного лимита убытков! Дальнейшие торги остановлены! Робот: " + NameStrategyUniq; ShowMessageInNewThread(message); for (int i = 0; i < _botTabs.Count; i++) { if (_botTabs[i].GetType().Name == "BotTabSimple") { BotTabSimple bot = (BotTabSimple)_botTabs[i]; bot.CloseAllAtMarket(); bot.Portfolio = null; } } } catch (Exception error) { SendNewLogMessage(error.ToString(), LogMessageType.Error); } }
/// <summary> /// emergency closing of all positions / /// экстренное закрытие всех позиций /// </summary> public void CloseAndOffAllToMarket() { try { string message = OsLocalization.Trader.Label54 + NameStrategyUniq; ShowMessageInNewThread(message); for (int i = 0; i < _botTabs.Count; i++) { if (_botTabs[i].GetType().Name == "BotTabSimple") { BotTabSimple bot = (BotTabSimple)_botTabs[i]; bot.CloseAllAtMarket(); bot.Portfolio = null; } } } catch (Exception error) { SendNewLogMessage(error.ToString(), LogMessageType.Error); } }