public AlligatorTrend(string name, StartProgram startProgram) : base(name, startProgram) { _startProgram = startProgram; // создаем вкладку робота TabCreate(BotTabType.Simple); _tab = TabsSimple[0]; // создаем настроечные параметры робота Regime = CreateParameter("Режим работы бота", "Off", new[] { "On", "Off", "OnlyClosePosition", "OnlyShort", "OnlyLong" }); AlligatorFastLenght = CreateParameter("Длина быстрого алигатора", 100, 50, 200, 10); AlligatorMiddleLenght = CreateParameter("Длина среднего алигатора", 100, 50, 200, 10); AlligatorSlowLenght = CreateParameter("Длина медленного алигатора", 100, 50, 200, 10); Volume = CreateParameter("Объем входа в позицию", 1.0m, 1.0m, 100.0m, 1.0m); MaxPositionCount = CreateParameter("Максимальное количество позиций", 2, 1, 10, 1); Slippage = CreateParameter("Проскальзывание (в шагах цены)", 350, 1, 500, 50); // создаем индикаторы на вкладке робота и задаем для них параметры _alligator = IndicatorsFactory.CreateIndicatorByName("Alligator", name + "Alligator", false); _alligator = (Aindicator)_tab.CreateCandleIndicator(_alligator, "Prime"); _alligator.ParametersDigit[0].Value = AlligatorSlowLenght.ValueInt; _alligator.ParametersDigit[1].Value = AlligatorFastLenght.ValueInt; _alligator.ParametersDigit[2].Value = AlligatorMiddleLenght.ValueInt; _alligator.Save(); // подписываемся на события _tab.CandleFinishedEvent += _tab_CandleFinishedEvent; ParametrsChangeByUser += AlligatorTrend_ParametrsChangeByUser; }
private StrategyParameterInt size_comma_lot; // допустимое количество знаков лота после запятой public Frank_2(string name, StartProgram startProgram) : base(name, startProgram) // конструктор { TabCreate(BotTabType.Simple); // создание простой вкладки _tab = TabsSimple[0]; // записываем первую вкладку в поле kvot_name = "USDT"; // тут надо указать - инициализировать название квотируемой валюты (деньги) tovar_name = "ETH"; // тут надо указать - инициализировать название товара vkl_Robota = CreateParameter("РОБОТ Включен?", false); slippage = CreateParameter("Велич. проскаль.у ордеров", 1m, 1m, 200m, 5m); profit = CreateParameter("ТЭЙКПРОФИТ от рынка На ", 20, 5, 50, 5); greed = CreateParameter("Сколько минимум прибыли ожидать в сделке на каждые 100$ ", 0.55m, 0.25m, 5.5m, 0.05m); // жадность greed_max = CreateParameter("Сколько Максимум прибыли ожидать в сделке на каждые 100$ ", 1.25m, 0.25m, 5.5m, 0.05m); // жадность velich_usrednen = CreateParameter("Усред.уваелич в раз ", 0.01m, 0.01m, 0.5m, 0.01m); do_piram = CreateParameter(" РАСТ. до Пирамиды", 20m, 5m, 200m, 5m); turbo_shift = CreateParameter(" Turbo добавлять", 50m, 5m, 200m, 5m); pir_of = CreateParameter(" ОТКлючить Пирамиду при % товара", 10m, 5m, 100m, 5m); vkl_piramid = CreateParameter("Пирамида включена?", false); prof_on = CreateParameter("Забирать профит с % ", 10m, 5m, 100m, 5m); ckok_profit_stop = CreateParameter("Сколько ПРИБЫЛИ закрывать стоп ордером? ", 0.5m, 0.01m, 10m, 0.01m); vkl_stopa = CreateParameter("Стоп Включен?", true); deltaUsredn = CreateParameter("УСРЕДнять через", 20m, 5m, 50m, 5m); start_per_depo = CreateParameter("СТАРТОВАТЬ со ? % депо)", 5, 5, 20, 5); min_sum = CreateParameter("МИН сумма орд.на бирже($)", 10.1m, 10.1m, 10.1m, 10.1m); komis_birgi = CreateParameter("КОМ биржи в %", 0.2m, 0, 0.1m, 0.1m); uchet_blok_sred_vkl = CreateParameter("Учитывать блокир. средства?", false); n_min = CreateParameter("зависание снимать через N минут ", 1, 1, 20, 1); volum_alarm = CreateParameter("АВАРИЙНЫЙ ОБЪЕМ ПРОДАЖ", 555, 150, 1000, 50); kpit_sum = CreateParameter("Закр. Позицию с УБЫТОКОМ от ", -1m, 10.1m, 10.1m, 10.1m); vkl_met_fix_loss_time = CreateParameter("Закрываться в убыток по времени? ", true); vkl_alarm_volum = CreateParameter("Убыток по ОБЪЕМАМ Закрывать ? ", false); Itogo = CreateParameter("Итого Заработано ", 0m, 0m, 0m, 0m); n_min_lesion = CreateParameter("Закрывать убыток через N минут ", 120, 30, 360, 20); sprint = CreateParameter("Большие объемы это когда больше = ", 101, 50, 200, 50); alarn_persent = CreateParameter("% купленного можно сливать = ", 5, 50, 100, 1); size_comma_lot = CreateParameter("Допустимое знак после запятой", 6, 1, 6, 1); block_in = true; // инициализируем значение блокировки _ma_short = new MovingAverage(name + "Ma5", false); _ma_short = (MovingAverage)_tab.CreateCandleIndicator(_ma_short, "Prime"); _ma_short.Lenght = 5; // присвоение значения _ma_short.Save(); _ma_long = new MovingAverage(name + "Ma20", false); _ma_long = (MovingAverage)_tab.CreateCandleIndicator(_ma_long, "Prime"); _ma_long.Lenght = 20; // присвоение значения _ma_long.Save(); _vol = new Volume(name + "Volum", false); _vol = (Volume)_tab.CreateCandleIndicator(_vol, "nameArea"); _vol.Save(); _tab.BestBidAskChangeEvent += _tab_BestBidAskChangeEvent; // событие изменения лучших цен _tab.OrderUpdateEvent += _tab_OrderUpdateEvent; // событие обновления ордеров _tab.MarketDepthUpdateEvent += _tab_MarketDepthUpdateEvent; // пришел новый стакан _tab.PositionNetVolumeChangeEvent += _tab_PositionNetVolumeChangeEvent; // у позиции изменился объем _tab.PositionClosingSuccesEvent += _tab_PositionClosingSuccesEvent; // позиция успешно закрыта _tab.NewTickEvent += _tab_NewTickEvent; // событие новых тиков } // конструктор
/// <summary> /// создать параметр типа Decimal /// </summary> /// <param name="name">Имя параметра</param> /// <param name="value">Значение по умолчанию</param> /// <param name="start">Первое значение при оптимизации</param> /// <param name="stop">Последнее значение при оптимизации</param> /// <param name="step">Шаг изменения при оптимизации</param> public StrategyParameterDecimal CreateParameter(string name, decimal value, decimal start, decimal stop, decimal step) { StrategyParameterDecimal newParameter = new StrategyParameterDecimal(name, value, start, stop, step); if (_parameters.Find(p => p.Name == name) != null) { throw new Exception("Ахтунг! Параметр с таким именем уже существует!"); } return((StrategyParameterDecimal)LoadParameterValues(newParameter)); }
/// <summary> /// create a Decimal type parameter / /// создать параметр типа Decimal /// </summary> /// <param name="name">param name / Имя параметра</param> /// <param name="value">default value / Значение по умолчанию</param> /// <param name="start">first value / Первое значение при оптимизации</param> /// <param name="stop">last value / Последнее значение при оптимизации</param> /// <param name="step">value step / Шаг изменения при оптимизации</param> public StrategyParameterDecimal CreateParameter(string name, decimal value, decimal start, decimal stop, decimal step) { StrategyParameterDecimal newParameter = new StrategyParameterDecimal(name, value, start, stop, step); if (_parameters.Find(p => p.Name == name) != null) { throw new Exception(OsLocalization.Trader.Label52); } return((StrategyParameterDecimal)LoadParameterValues(newParameter)); }
public List <IIStrategyParameter> GetParameters() { List <IIStrategyParameter> par = new List <IIStrategyParameter>(); for (int i = 0; i < StrategyParameters.Count; i++) { StrategyParameterType type; Enum.TryParse(StrategyParameters[i].Split('$')[0], out type); string name = StrategyParameters[i].Split('$')[2]; IIStrategyParameter param = null; if (type == StrategyParameterType.Bool) { param = new StrategyParameterBool(name, false); param.LoadParamFromString(StrategyParameters[i].Split('$')[1].Split('#')); } else if (type == StrategyParameterType.Decimal) { param = new StrategyParameterDecimal(name, 0, 0, 0, 0); param.LoadParamFromString(StrategyParameters[i].Split('$')[1].Split('#')); } else if (type == StrategyParameterType.Int) { param = new StrategyParameterInt(name, 0, 0, 0, 0); param.LoadParamFromString(StrategyParameters[i].Split('$')[1].Split('#')); } else if (type == StrategyParameterType.String) { param = new StrategyParameterString(name, "", null); param.LoadParamFromString(StrategyParameters[i].Split('$')[1].Split('#')); } else if (type == StrategyParameterType.TimeOfDay) { param = new StrategyParameterTimeOfDay(name, 0, 0, 0, 0); param.LoadParamFromString(StrategyParameters[i].Split('$')[1].Split('#')); } else if (type == StrategyParameterType.Button) { param = new StrategyParameterButton(name); param.LoadParamFromString(StrategyParameters[i].Split('$')[1].Split('#')); } else if (type == StrategyParameterType.Label) { param = new StrategyParameterLabel(name, "", "", 0, 0, System.Drawing.Color.White); param.LoadParamFromString(StrategyParameters[i].Split('$')[1].Split('#')); } par.Add(param); } return(par); }
public decimal _min_lot; // поле хранящее величину минимального лота для биржи public MyBlanks(string name, StartProgram startProgram) : base(name, startProgram) // конструктор робота тут { // инициализация переменных и параметров price = 1; _kom = 0; kvot_val = CreateParameter("КвотВалюта-Инструмент", "USDT"); tovar_val = CreateParameter("Базовая Валюта-Товар", "BTC"); komis_birgi = CreateParameter("КОМ биржи в %", 0.2m, 0, 0.1m, 0.1m); TabCreate(BotTabType.Simple); // создание простой вкладки _tab = TabsSimple[0]; // записываем первую вкладку в поле _tab.MarketDepthUpdateEvent += _tab_MarketDepthUpdateEvent; }
public event Action <MarketFaze> MarketFazeChangeEvent; // событие изменения фазы рынка #endregion /// <summary> /// Конструктор класса робота /// </summary> /// <param name="name">имя робота</param> /// <param name="startProgram">программа, которая запустила робота</param> public OneLegArbitrageMy(string name, StartProgram startProgram) : base(name, startProgram) { //Запоминаем имя программы, которая запустила бота //Это может быть тестер, оптимизатор, терминал _startProgram = startProgram; //Создаем вкладки бота TabCreate(BotTabType.Simple); TabCreate(BotTabType.Index); _tabSec = TabsSimple[0]; _tabIndex = TabsIndex[0]; // создаем настроечные параметры робота LenghtMa = CreateParameter("Lenght MA", 100, 50, 200, 10); LenghtBollinger = CreateParameter("Lenght Bollinger", 100, 50, 200, 10); DeviationBollinger = CreateParameter("Deviation Bollinger", 1, 0.5m, 2.5m, 0.5m); LenghtAtr = CreateParameter("Lenght ATR", 20, 20, 100, 10); MultiplyAtr = CreateParameter("Multiplay ATR", 1, 1, 5, 0.5m); // cоздаем индикаторы _ma = new MovingAverage(name + "MA", false); _ma = (MovingAverage)_tabIndex.CreateCandleIndicator(_ma, "Prime"); _ma.Lenght = LenghtMa.ValueInt; _ma.Save(); _bollinger = new Bollinger(name + "Bollinger", false); _bollinger = (Bollinger)_tabIndex.CreateCandleIndicator(_bollinger, "Prime"); _bollinger.Lenght = LenghtBollinger.ValueInt; _bollinger.Deviation = DeviationBollinger.ValueDecimal; _bollinger.Save(); _atr = new Atr(name + "ATR", false); _atr = (Atr)_tabIndex.CreateCandleIndicator(_atr, "Second"); _atr.Lenght = LenghtAtr.ValueInt; _atr.Save(); // загружаем настроечные параметры робота Load(); // подписываемся на события _tabIndex.SpreadChangeEvent += TabIndex_SpreadChangeEvent; _tabSec.CandleFinishedEvent += TabSec_CandleFinishedEvent; ParametrsChangeByUser += OneLegArbitrage_ParametrsChangeByUser; DeleteEvent += OneLegArbitrage_DeleteEvent; //todo доработать OneLegArbitrage_DeleteEvent, чтобы удалялись все файлы робота }
/// <summary> /// Конструктор класса робота /// </summary> /// <param name="name">Имя робота</param> /// <param name="startProgram">Имя программы, запустившей робота</param> public PairArbitrage(string name, StartProgram startProgram) : base(name, startProgram) { // сохраняем программу, которая запустила робота // это может быть тестер, оптимизатор, терминал _startProgram = StartProgram; // создаем вкладки TabCreate(BotTabType.Simple); TabCreate(BotTabType.Simple); TabCreate(BotTabType.Index); _tab1 = TabsSimple[0]; _tab2 = TabsSimple[1]; _tabIndex = TabsIndex[0]; // создаем оптимизируемые параметры LenghtMA = CreateParameter("LenghtMA", 60, 60, 200, 20); LenghtIvashovMA = CreateParameter("LenghtIvashovMA", 100, 60, 200, 20); LenghtIvashovAverage = CreateParameter("LenghtIvashovAverage", 100, 60, 200, 20); Multiply = CreateParameter("Multiply", 1.0m, 0.6m, 2, 0.2m); // создаем индикаторы _ma = new MovingAverage(name + "ma", false); _ma = (MovingAverage)_tabIndex.CreateCandleIndicator(_ma, "Prime"); _ma.Lenght = LenghtMA.ValueInt; _ma.Save(); _ivashov = new IvashovRange(name + "ivashov", false); _ivashov = (IvashovRange)_tabIndex.CreateCandleIndicator(_ivashov, "Second"); _ivashov.LenghtAverage = LenghtIvashovAverage.ValueInt; _ivashov.LenghtMa = LenghtIvashovMA.ValueInt; _ivashov.Save(); // загружаем настроечные параметры бота Load(); // подписка на событие обновление индекса _tabIndex.SpreadChangeEvent += _tabIndex_SpreadChangeEvent; // подписка на событие успешного открытия сделки по вкладкам _tab1.PositionOpeningSuccesEvent += _tab1_PositionOpeningSuccesEvent; _tab2.PositionOpeningSuccesEvent += _tab2_PositionOpeningSuccesEvent; // подписка на сервисные события ParametrsChangeByUser += PairArbitrage_ParametrsChangeByUser; DeleteEvent += Strategy_DeleteEvent; }
public decimal price; // записываем текущую цену рынка public Depozit(string name, StartProgram startProgram) // конструктор робота : base(name, startProgram) { // инициализация переменных содержащих параметры стратегий vkl_Robota = CreateParameter("РОБОТ Включен?", false); slippage = CreateParameter("Велич. проскаль.у ордеров", 1m, 1m, 50m, 5m); profit = CreateParameter("ТЭЙКПРОФИТ от рынка На ", 15, 5, 50, 5); vkl_profit = CreateParameter("ТЕЙКПРОФИТ включен ЛИ ?", true); veli4_usrednen = CreateParameter("Усред.уваелич в раз ", 0.3m, 1m, 5m, 0.1m); vkl_usrednen = CreateParameter("УСРЕДНЕНИЕ включено ЛИ?", true); deltaUsredn = CreateParameter("УСРЕДнять через", 10m, 5m, 50m, 5m); dola_depa = CreateParameter("Часть депозита на вход", 10, 5, 100, 1); vkl_piramid = CreateParameter("ПИРАМИДА Включена ЛИ?", false); deltaVerx = CreateParameter("ПИРАМИДИТЬСЯ через ", 10m, 5m, 50m, 5m); vkl_stop_los = CreateParameter("Включен ЛИ СТОПЛОС ?", true); zn_stop_los = CreateParameter("СТОП после скок УСРЕД ", 10, 5, 50, 5); stop = CreateParameter("СТОПЛОС ниже на", 25, 5, 100, 5); vel_ma = CreateParameter("MA", 7, 3, 50, 1); // записываем в переменную параметры komis_birgi = CreateParameter("Биржа ЕСТ % учесть", 0.2m, 1m, 1m, 1m); min_lot = CreateParameter("МИН объ.орд у биржи(базовой)", 0.001m, 0.001m, 0.05m, 0.001m); vkl_vol_trade = CreateParameter("СЧИТАТЬ ЛИ объем торгов", true); n_min = CreateParameter("скок минут считать объем", 1, 1, 20, 1); count_candels_hi = CreateParameter("Скок.Хаев.св.читать(вход)", 2, 1, 50, 1); volum_alarm = CreateParameter("АВАРИЙНЫЙ ОБЪЕМ ПРОДАЖ", 450, 150, 1000, 50); volum_piramid = CreateParameter("Объем покуп.для ПИрамиды", 350, 150, 550, 50); TabCreate(BotTabType.Simple); // создание простой вкладки _vklad = TabsSimple[0]; // записываем первую вкладку в поле // создание и инициализация индикатора МА _ma = new MovingAverage(name + "Ma", false); _ma = (MovingAverage)_vklad.CreateCandleIndicator(_ma, "Prime"); _ma.Lenght = vel_ma.ValueInt; // присвоение значения _ma.Save(); _vklad.CandleFinishedEvent += _vklad_CandleFinishedEvent; // подписались на событие завершения новой свечи _vklad.NewTickEvent += _vklad_NewTickEvent; // тики _vklad.MarketDepthUpdateEvent += _vklad_MarketDepthUpdateEvent; // событие пришел стакан _vklad.PositionOpeningSuccesEvent += _vklad_PositionOpeningSuccesEvent; // событие успешного закрытия позиции _vklad.PositionNetVolumeChangeEvent += _vklad_PositionNetVolumeChangeEvent; // изменился объем в позиции }
/// <summary> /// copy parameter list /// копировать список параметров /// </summary> private List <IIStrategyParameter> CopyParameters(List <IIStrategyParameter> paramsToCopy) { List <IIStrategyParameter> newParameters = new List <IIStrategyParameter>(); for (int i = 0; i < paramsToCopy.Count; i++) { IIStrategyParameter newParam = null; if (paramsToCopy[i].Type == StrategyParameterType.Bool) { newParam = new StrategyParameterBool(paramsToCopy[i].Name, ((StrategyParameterBool)paramsToCopy[i]).ValueBool); } else if (paramsToCopy[i].Type == StrategyParameterType.String) { newParam = new StrategyParameterString(paramsToCopy[i].Name, ((StrategyParameterString)paramsToCopy[i]).ValueString, ((StrategyParameterString)paramsToCopy[i]).ValuesString); } else if (paramsToCopy[i].Type == StrategyParameterType.Int) { newParam = new StrategyParameterInt(paramsToCopy[i].Name, ((StrategyParameterInt)paramsToCopy[i]).ValueIntDefolt, ((StrategyParameterInt)paramsToCopy[i]).ValueIntStart, ((StrategyParameterInt)paramsToCopy[i]).ValueIntStop, ((StrategyParameterInt)paramsToCopy[i]).ValueIntStep); ((StrategyParameterInt)newParam).ValueInt = ((StrategyParameterInt)paramsToCopy[i]).ValueIntStart; } else if (paramsToCopy[i].Type == StrategyParameterType.Decimal) { newParam = new StrategyParameterDecimal(paramsToCopy[i].Name, ((StrategyParameterDecimal)paramsToCopy[i]).ValueDecimalDefolt, ((StrategyParameterDecimal)paramsToCopy[i]).ValueDecimalStart, ((StrategyParameterDecimal)paramsToCopy[i]).ValueDecimalStop, ((StrategyParameterDecimal)paramsToCopy[i]).ValueDecimalStep); ((StrategyParameterDecimal)newParam).ValueDecimal = ((StrategyParameterDecimal)paramsToCopy[i]).ValueDecimalStart; } newParameters.Add(newParam); } return(newParameters); }
/// <summary> /// Конструктор /// </summary> /// <param name="name">Имя робота</param> /// <param name="startProgram">Программа, в которой запущен робот</param> public BollingerTrend(string name, StartProgram startProgram) : base(name, startProgram) { _startProgram = startProgram; // создаем вкладку робота Simple TabCreate(BotTabType.Simple); _tab = TabsSimple[0]; // создаем настроечные параметры робота Regime = CreateParameter("Режим работы бота", "Off", new[] { "On", "Off", "OnlyClosePosition", "OnlyShort", "OnlyLong" }); OnDebug = CreateParameter("Включить отладку", false); OnDepositFixed = CreateParameter("Включить режим фикс. депозита", false); DepositFixedSize = CreateParameter("Размер фикс. депозита", 100, 100.0m, 100, 100); DepositNameCode = CreateParameter("Код инструмента, в котором депозит", "USDT", new[] { "USDT", "" }); VolumePercent = CreateParameter("Объем входа в позицию (%)", 50, 40, 300, 10); BollingerPeriod = CreateParameter("Длина болинжера", 100, 50, 200, 10); BollingerDeviation = CreateParameter("Отклонение болинжера", 1.5m, 1.0m, 3.0m, 0.2m); MethodOutOfPosition = CreateParameter("Метод выхода из позиции", "ChannelBoundary", new[] { "ChannelBoundary", "ChannelCenter" }); OnStopForBreakeven = CreateParameter("Вкл. стоп для перевода в безубытк", true); MinProfitOnStopBreakeven = CreateParameter("Мин. профит для перевода в безубытк (%)", 7, 5, 20, 1); Slippage = CreateParameter("Проскальзывание (в шагах цены)", 350, 1, 500, 50); VolumeDecimals = CreateParameter("Кол. знаков после запятой для объема", 4, 4, 10, 1); ShiftTimeExchange = CreateParameter("Разница времени с биржей", 5, -10, 10, 1); // создаем индикаторы на вкладке робота и задаем для них параметры _bollinger = IndicatorsFactory.CreateIndicatorByName("Bollinger", name + "Bollinger", false); _bollinger = (Aindicator)_tab.CreateCandleIndicator(_bollinger, "Prime"); _bollinger.ParametersDigit[0].Value = BollingerPeriod.ValueInt; _bollinger.ParametersDigit[1].Value = BollingerDeviation.ValueDecimal; _bollinger.Save(); // подписываемся на события _tab.CandleFinishedEvent += Tab_CandleFinishedEvent; _tab.PositionClosingFailEvent += Tab_PositionClosingFailEvent; _tab.PositionClosingSuccesEvent += Tab_PositionClosingSuccesEvent; _tab.PositionOpeningFailEvent += Tab_PositionOpeningFailEvent; _tab.MarketDepthUpdateEvent += Tab_MarketDepthUpdateEvent; ParametrsChangeByUser += BollingerTrend_ParametrsChangeByUser; }
public Storog(string name, StartProgram startProgram) : base(name, startProgram) // конструктор робота тут { TabCreate(BotTabType.Simple); // создание простой вкладки _tab = TabsSimple[0]; // записываем первую вкладку в поле // инициализация переменных и параметров price = 1; _kom = 0; zakritie = 0; //последняя позиция закрылась по цене vkl_Robota = CreateParameter("РОБОТ Включен?", false); vkl_stopa = CreateParameter("Стоп Включен?", true); do_stopa = CreateParameter(" РАСТ. до СТОПА", 10m, 5m, 100m, 5m); _uroven = CreateParameter("УРОВЕНЬ Работы", 10000m, 100m, 1000m, 50m); slippage = CreateParameter("Велич. проскаль.у ордеров", 1m, 1m, 50m, 5m); part_tovara = CreateParameter("ИСПОЛЬЗ Товара Часть(1/?)", 2, 2, 50, 1); do_piram = CreateParameter(" РАСТ. до Пирамиды", 10m, 5m, 100m, 5m); profit = CreateParameter("ПРОФИТ от рынка На ", 3, 5, 200, 5); dvig = CreateParameter("Движение верх забрать ", 130, 5, 200, 5); ot_rinka = CreateParameter(" Держаться от рынка", 110, 10, 150, 10); //part_depo = CreateParameter("ИСПОЛЬЗ Часть ДЕПО(1/?)", 10, 2, 50, 1); komis_birgi = CreateParameter("КОМ биржи в %", 0.2m, 0, 0.1m, 0.1m); min_lot = CreateParameter("МИН объ.орд у биржи(базовой)", 0.001m, 0.001m, 0.05m, 0.001m); vel_ma = CreateParameter("MA", 2, 3, 50, 1); // записываем в переменную параметры // создание и инициализация индикатора МА _ma = new MovingAverage(name + "Ma", true); _ma = (MovingAverage)_tab.CreateCandleIndicator(_ma, "Prime"); _ma.Lenght = vel_ma.ValueInt; // присвоение значения _ma.Save(); _tab.CandleFinishedEvent += _tab_CandleFinishedEvent; // подписались на событие завершения новой свечи _tab.NewTickEvent += _tab_NewTickEvent; // тики _tab.MarketDepthUpdateEvent += _tab_MarketDepthUpdateEvent; // событие пришел стакан _tab.PositionOpeningSuccesEvent += _tab_PositionOpeningSuccesEvent; // событие успешного открытия позиции _tab.PositionClosingSuccesEvent += _tab_PositionClosingSuccesEvent; // событие успешного закрытия позиции }
/// <summary> /// place of work flow responsible for optimization /// место работы потока отвечающего за оптимизацию /// </summary> private async void PrimeThreadWorkerPlace() { List <IIStrategyParameter> allParam = _parameters; for (int i = 0; i < _parameters.Count; i++) { if (allParam[i].Type == StrategyParameterType.Int) { ((StrategyParameterInt)allParam[i]).ValueInt = ((StrategyParameterInt)allParam[i]).ValueIntStart; } if (allParam[i].Type == StrategyParameterType.Decimal) { ((StrategyParameterDecimal)allParam[i]).ValueDecimal = ((StrategyParameterDecimal)allParam[i]).ValueDecimalStart; } } List <bool> allOptimezedParam = _parametersOn; // 1 consider how many passes we need to do in the first phase/1 считаем сколько проходов нам нужно сделать в первой фазе List <IIStrategyParameter> optimizedParamToCheckCount = new List <IIStrategyParameter>(); for (int i = 0; i < allParam.Count; i++) { if (allOptimezedParam[i]) { optimizedParamToCheckCount.Add(allParam[i]); ReloadParam(allParam[i]); } } optimizedParamToCheckCount = CopyParameters(optimizedParamToCheckCount); int countBots = 0; bool isStart = true; while (true) { bool isAndOfFaze = false; // all parameters passed/все параметры пройдены for (int i2 = 0; i2 < optimizedParamToCheckCount.Count + 1; i2++) { if (i2 == optimizedParamToCheckCount.Count) { isAndOfFaze = true; break; } if (isStart) { countBots++; isStart = false; break; } if (optimizedParamToCheckCount[i2].Type == StrategyParameterType.Int) { StrategyParameterInt parameter = (StrategyParameterInt)optimizedParamToCheckCount[i2]; if (parameter.ValueInt < parameter.ValueIntStop) { // the current index can increment the value // по текущему индексу можно приращивать значение parameter.ValueInt = parameter.ValueInt + parameter.ValueIntStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizedParamToCheckCount[i3]); } } countBots++; break; } } else if (optimizedParamToCheckCount[i2].Type == StrategyParameterType.Decimal ) { StrategyParameterDecimal parameter = (StrategyParameterDecimal)optimizedParamToCheckCount[i2]; if (parameter.ValueDecimal < parameter.ValueDecimalStop) { // at the current index you can increment the value // по текущему индексу можно приращивать значение parameter.ValueDecimal = parameter.ValueDecimal + parameter.ValueDecimalStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizedParamToCheckCount[i3]); } } countBots++; break; } } } if (isAndOfFaze) { break; } } _countAllServersMax = countBots; SendLogMessage(OsLocalization.Optimizer.Message4 + countBots, LogMessageType.System); // 2 pass the first phase when you need to bypass all the options // 2 проходим первую фазу, когда нужно обойти все варианты List <IIStrategyParameter> optimizedParam = new List <IIStrategyParameter>(); for (int i = 0; i < allParam.Count; i++) { if (allOptimezedParam[i]) { optimizedParam.Add(allParam[i]); } } List <OptimizerFaze> fazes = _master.Fazes; List <IIStrategyParameter> currentParam = CopyParameters(optimizedParam); for (int i2 = 0; i2 < optimizedParam.Count; i2++) { ReloadParam(currentParam[i2]); } List <BotPanel> botsInFaze = new List <BotPanel>(); isStart = true; bool neadToReloadParam = false; while (true) { bool isAndOfFaze = false; // all parameters passed/все параметры пройдены for (int i2 = 0; i2 < currentParam.Count + 1; i2++) { if (i2 == currentParam.Count) { isAndOfFaze = true; break; } if (isStart) { isStart = false; break; } if (currentParam[i2].Type == StrategyParameterType.Int) { StrategyParameterInt parameter = (StrategyParameterInt)currentParam[i2]; if (parameter.ValueInt < parameter.ValueIntStop) { // at the current index you can increment the value // по текущему индексу можно приращивать значение parameter.ValueInt = parameter.ValueInt + parameter.ValueIntStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(currentParam[i3]); } } break; } } else if (currentParam[i2].Type == StrategyParameterType.Decimal ) { StrategyParameterDecimal parameter = (StrategyParameterDecimal)currentParam[i2]; if (parameter.ValueDecimal < parameter.ValueDecimalStop) { // at the current index you can increment the value // по текущему индексу можно приращивать значение parameter.ValueDecimal = parameter.ValueDecimal + parameter.ValueDecimalStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(currentParam[i3]); } } break; } } } if (isAndOfFaze) { break; } while (_servers.Count >= _master.ThreadsCount) { await Task.Delay(2000); } if (_neadToStop) { while (true) { await Task.Delay(1000); if (_servers.Count == 0) { break; } } for (int i = 0; i < botsInFaze.Count; i++) { botsInFaze[i].Delete(); } if (TestReadyEvent != null) { TestReadyEvent(botsInFaze, null); } _primeThreadWorker = null; return; } StartNewBot(allParam, currentParam, fazes[0], botsInFaze, _serverNum.ToString() + " InSample"); } // while enumerating parameters/while по перебору параметров while (true) { await Task.Delay(1000); if (_servers.Count == 0) { break; } } for (int i = 0; i < botsInFaze.Count; i++) { botsInFaze[i].Delete(); } SendLogMessage(OsLocalization.Optimizer.Message5, LogMessageType.System); // 3 filter/3 фильтруем List <BotPanel> botsToOutOfSample = new List <BotPanel>(); EndOfFazeFiltration(botsInFaze, fazes[0], botsToOutOfSample); // 4 do forwards/4 делаем форварды SendLogMessage(OsLocalization.Optimizer.Message6, LogMessageType.System); List <BotPanel> botsOutOfSample = new List <BotPanel>(); for (int i = 0; i < botsToOutOfSample.Count; i++) { while (_servers.Count >= _master.ThreadsCount) { await Task.Delay(2000); } if (_neadToStop) { while (true) { await Task.Delay(1000); if (_servers.Count == 0) { break; } } for (int i2 = 0; i2 < botsOutOfSample.Count; i2++) { botsOutOfSample[i2].Delete(); } if (TestReadyEvent != null) { TestReadyEvent(botsToOutOfSample, botsOutOfSample); } _primeThreadWorker = null; return; } StartNewBot(botsToOutOfSample[i].Parameters, new List <IIStrategyParameter>(), fazes[1], botsOutOfSample, botsToOutOfSample[i].NameStrategyUniq.Replace(" InSample", "") + " OutOfSample"); } while (true) { await Task.Delay(1000); if (_servers.Count == 0) { break; } } for (int i = 0; i < botsOutOfSample.Count; i++) { botsOutOfSample[i].Delete(); } SendLogMessage(OsLocalization.Optimizer.Message7, LogMessageType.System); if (TestReadyEvent != null) { TestReadyEvent(botsInFaze, botsOutOfSample); } _primeThreadWorker = null; }
private async void StartOptimazeFazeInSample(OptimizerFaze faze, OptimazerFazeReport report, List <IIStrategyParameter> allParameters, List <bool> parametersToOptimization) { ReloadAllParam(allParameters); // 2 проходим первую фазу, когда нужно обойти все варианты List <IIStrategyParameter> optimizedParamStart = new List <IIStrategyParameter>(); for (int i = 0; i < allParameters.Count; i++) { if (parametersToOptimization[i]) { optimizedParamStart.Add(allParameters[i]); } } List <IIStrategyParameter> optimizeParamCurrent = CopyParameters(optimizedParamStart); ReloadAllParam(optimizeParamCurrent); bool isStart = true; while (true) { bool isAndOfFaze = false; // all parameters passed/все параметры пройдены for (int i2 = 0; i2 < optimizeParamCurrent.Count + 1; i2++) { if (i2 == optimizeParamCurrent.Count) { isAndOfFaze = true; break; } if (isStart) { isStart = false; break; } if (optimizeParamCurrent[i2].Type == StrategyParameterType.Int) { StrategyParameterInt parameter = (StrategyParameterInt)optimizeParamCurrent[i2]; if (parameter.ValueInt < parameter.ValueIntStop) { // at the current index you can increment the value // по текущему индексу можно приращивать значение parameter.ValueInt = parameter.ValueInt + parameter.ValueIntStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizeParamCurrent[i3]); } } break; } } else if (optimizeParamCurrent[i2].Type == StrategyParameterType.Decimal ) { StrategyParameterDecimal parameter = (StrategyParameterDecimal)optimizeParamCurrent[i2]; if (parameter.ValueDecimal < parameter.ValueDecimalStop) { // at the current index you can increment the value // по текущему индексу можно приращивать значение parameter.ValueDecimal = parameter.ValueDecimal + parameter.ValueDecimalStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizeParamCurrent[i3]); } } break; } } } if (isAndOfFaze) { break; } while (_servers.Count >= _master.ThreadsCount) { Thread.Sleep(50); } if (_neadToStop) { while (true) { Thread.Sleep(50); if (_servers.Count == 0) { break; } } TestReadyEvent?.Invoke(ReportsToFazes); _primeThreadWorker = null; return; } while (_botsInTest.Count >= _master.ThreadsCount) { Thread.Sleep(50); } //SendLogMessage("BotInSample" ,LogMessageType.System); StartNewBot(_parameters, optimizeParamCurrent, report, " InSample"); } while (true) { Thread.Sleep(50); if (_servers.Count == 0) // || _botsInTest.Count == 0) { break; } } SendLogMessage(OsLocalization.Optimizer.Message5, LogMessageType.System); }
public int BotCountOneFaze(List <IIStrategyParameter> param, List <bool> paramsOn) { List <IIStrategyParameter> allParam = param; for (int i = 0; i < allParam.Count; i++) { if (allParam[i].Type == StrategyParameterType.Int) { ((StrategyParameterInt)allParam[i]).ValueInt = ((StrategyParameterInt)allParam[i]).ValueIntStart; } if (allParam[i].Type == StrategyParameterType.Decimal) { ((StrategyParameterDecimal)allParam[i]).ValueDecimal = ((StrategyParameterDecimal)allParam[i]).ValueDecimalStart; } } List <bool> allOptimezedParam = paramsOn; // 1 consider how many passes we need to do in the first phase/ // 1 считаем сколько проходов нам нужно сделать в первой фазе List <IIStrategyParameter> optimizedParamToCheckCount = new List <IIStrategyParameter>(); for (int i = 0; i < allParam.Count; i++) { if (allOptimezedParam[i]) { optimizedParamToCheckCount.Add(allParam[i]); ReloadParam(allParam[i]); } } optimizedParamToCheckCount = CopyParameters(optimizedParamToCheckCount); int countBots = 0; bool isStart = true; while (true) { bool isAndOfFaze = false; // all parameters passed/все параметры пройдены for (int i2 = 0; i2 < optimizedParamToCheckCount.Count + 1; i2++) { if (i2 == optimizedParamToCheckCount.Count) { isAndOfFaze = true; break; } if (isStart) { countBots++; isStart = false; break; } if (optimizedParamToCheckCount[i2].Type == StrategyParameterType.Int) { StrategyParameterInt parameter = (StrategyParameterInt)optimizedParamToCheckCount[i2]; if (parameter.ValueInt < parameter.ValueIntStop) { // the current index can increment the value // по текущему индексу можно приращивать значение parameter.ValueInt = parameter.ValueInt + parameter.ValueIntStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizedParamToCheckCount[i3]); } } countBots++; break; } } else if (optimizedParamToCheckCount[i2].Type == StrategyParameterType.Decimal ) { StrategyParameterDecimal parameter = (StrategyParameterDecimal)optimizedParamToCheckCount[i2]; if (parameter.ValueDecimal < parameter.ValueDecimalStop) { // at the current index you can increment the value // по текущему индексу можно приращивать значение parameter.ValueDecimal = parameter.ValueDecimal + parameter.ValueDecimalStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizedParamToCheckCount[i3]); } } countBots++; break; } } } if (isAndOfFaze) { break; } } return(countBots * (_master.IterationCount * 2)); }
public PriceLavelBot(string name, StartProgram startProgram) : base(name, startProgram) { this.ParametrsChangeByUser += PriceLavelBot_ParametrsChangeByUser; TabCreate(BotTabType.Simple); _tab = TabsSimple[0]; SessionAsia = CreateParameter("Торговать Азию", false); SessionEU = CreateParameter("Торговать Европу", false); SessionUSA = CreateParameter("Торговать Америку", false); SessionRUS = CreateParameter("Торговать Россию", false); SessionDay = CreateParameter("Круглосуточно", false); _TradeSessions = new TradeSessions(name + "_TradeSessions", false, GetListSessionTypes()); _TradeSessions = (TradeSessions)_tab.CreateCandleIndicator(_TradeSessions, "Prime"); _TradeSessions.Save(); PriceLevleLine = new PriceLevleLine(name + "_PriceLevleLine", false); PriceLevleLine = (PriceLevleLine)_tab.CreateCandleIndicator(PriceLevleLine, "Prime"); PriceLevleLine.PaintOn = false; PriceLevleLine.Save(); maLenth = CreateParameter("maLenth", 24, 24, 48, 1); maVolume = new MovingAverage(name + "_maVolume", false); maVolume = (MovingAverage)_tab.CreateCandleIndicator(maVolume, "New1"); maVolume.Lenght = maLenth.ValueInt; maVolume.TypeCalculationAverage = MovingAverageTypeCalculation.Exponential; maVolume.TypePointsToSearch = PriceTypePoints.Volume; maVolume.Save(); maVolumeSlow = new MovingAverage(name + "maVolumeSlow", false); maVolumeSlow = (MovingAverage)_tab.CreateCandleIndicator(maVolumeSlow, "New1"); maVolumeSlow.ColorBase = System.Drawing.Color.Green; maVolumeSlow.Lenght = 48; maVolumeSlow.TypeCalculationAverage = MovingAverageTypeCalculation.Simple; maVolumeSlow.TypePointsToSearch = PriceTypePoints.Volume; maVolumeSlow.Save(); mA = new MovingAverage(name + "mA", false) { Lenght = 9 }; mA = (MovingAverage)_tab.CreateCandleIndicator(mA, "Prime"); mA.Save(); Regime = CreateParameter("Regime", "Off", new[] { "Off", "On" }); UseSafe = CreateParameter("Использовать сейф", true); _Volume = CreateParameter("Volume", 1, 0.00m, 100, 1); MinProfitTraling = CreateParameter("Минимальный профит для трэйлинга", 0.2m, 0.2m, 2, 0.1m); MaxStop = CreateParameter("MaxStop", 1, 1, 10, 0.1m); _Slipage = CreateParameter("_Slipage", 1, 1, 50, 1); leverage = CreateParameter("Маржинальное плечо", 1, 1, 10, 1); StepCount = CreateParameter("Ордеров в лесенке", 1, 1, 10, 1); DepoCurrency = CreateParameter("DepoCurrency", "Currency2", new[] { "Currency1", "Currency2" }); isContract = CreateParameter("Торгуем контрактами", false); PaintLevels = CreateParameter("Отрисовывать уровни", true); Breakeven = CreateParameter("Использовать безубыток", true); NeedBreakeven = Breakeven.ValueBool; DeltaSizeK = CreateParameter("Делитель основного ТФ", 6, 1, 40, 1); _tab.CandleFinishedEvent += _tab_CandleFinishedEvent; _tab.CandleUpdateEvent += _tab_CandleUpdateEvent; _tab.PositionOpeningSuccesEvent += _tab_PositionOpeningSuccesEvent; _tab.NewTickEvent += _tab_NewTickEvent; _tab.FirstTickToDayEvent += _tab_FirstTickToDayEvent; _tab.PositionClosingSuccesEvent += _tab_PositionClosingSuccesEvent; //Младший тайм фрейм TabCreate(BotTabType.Simple); _tab_pattern = TabsSimple[1]; _tab_pattern.CandleFinishedEvent += _tab_pattern_CandleFinishedEvent; delta_pattern = new Delta(name + "_delta", false); delta_pattern = (Delta)_tab_pattern.CreateCandleIndicator(delta_pattern, "New1"); delta_pattern.Save(); Volume_pattern = new Volume(name + "_Volume", false); Volume_pattern = (Volume)_tab_pattern.CreateCandleIndicator(Volume_pattern, "New2"); Volume_pattern.Save(); //график Дельты TabCreate(BotTabType.Simple); _tab_delta = TabsSimple[2]; _tab_delta.CandleFinishedEvent += _tab_delta_CandleFinishedEvent;; delta_delta = new Delta(name + "delta_delta", false); delta_delta = (Delta)_tab_delta.CreateCandleIndicator(delta_delta, "New1"); delta_delta.Save(); Volume_delta = new Volume(name + "delta_Volume", false); Volume_delta = (Volume)_tab_delta.CreateCandleIndicator(Volume_delta, "New2"); Volume_delta.Save(); // lines = new List<LineHorisontal>(); Thread closerThread = new Thread(CloseFailPosition); closerThread.IsBackground = true; closerThread.Start(); }
/// <summary> /// место работы потока отвечающего за оптимизацию /// </summary> private void PrimeThreadWorkerPlace() { List <IIStrategyParameter> allParam = _parameters; for (int i = 0; i < _parameters.Count; i++) { if (allParam[i].Type == StrategyParameterType.Int) { ((StrategyParameterInt)allParam[i]).ValueInt = ((StrategyParameterInt)allParam[i]).ValueIntStart; } if (allParam[i].Type == StrategyParameterType.Decimal) { ((StrategyParameterDecimal)allParam[i]).ValueDecimal = ((StrategyParameterDecimal)allParam[i]).ValueDecimalStart; } } List <bool> allOptimezedParam = _parametersOn; // 1 считаем сколько проходов нам нужно сделать в первой фазе List <IIStrategyParameter> optimizedParamToCheckCount = new List <IIStrategyParameter>(); for (int i = 0; i < allParam.Count; i++) { if (allOptimezedParam[i]) { optimizedParamToCheckCount.Add(allParam[i]); ReloadParam(allParam[i]); } } optimizedParamToCheckCount = CopyParameters(optimizedParamToCheckCount); int countBots = 0; bool isStart = true; while (true) { bool isAndOfFaze = false; // все параметры пройдены for (int i2 = 0; i2 < optimizedParamToCheckCount.Count + 1; i2++) { if (i2 == optimizedParamToCheckCount.Count) { isAndOfFaze = true; break; } if (isStart) { countBots++; isStart = false; break; } if (optimizedParamToCheckCount[i2].Type == StrategyParameterType.Int) { StrategyParameterInt parameter = (StrategyParameterInt)optimizedParamToCheckCount[i2]; if (parameter.ValueInt < parameter.ValueIntStop) { // по текущему индексу можно приращивать значение parameter.ValueInt = parameter.ValueInt + parameter.ValueIntStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizedParamToCheckCount[i3]); } } countBots++; break; } } else if (optimizedParamToCheckCount[i2].Type == StrategyParameterType.Decimal ) { StrategyParameterDecimal parameter = (StrategyParameterDecimal)optimizedParamToCheckCount[i2]; if (parameter.ValueDecimal < parameter.ValueDecimalStop) { // по текущему индексу можно приращивать значение parameter.ValueDecimal = parameter.ValueDecimal + parameter.ValueDecimalStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizedParamToCheckCount[i3]); } } countBots++; break; } } } if (isAndOfFaze) { break; } } _countAllServersMax = countBots; SendLogMessage("Количество ботов для обхода: " + countBots, LogMessageType.System); // 2 проходим первую фазу, когда нужно обойти все варианты List <IIStrategyParameter> optimizedParam = new List <IIStrategyParameter>(); for (int i = 0; i < allParam.Count; i++) { if (allOptimezedParam[i]) { optimizedParam.Add(allParam[i]); } } List <OptimizerFaze> fazes = _master.Fazes; List <IIStrategyParameter> currentParam = CopyParameters(optimizedParam); for (int i2 = 0; i2 < optimizedParam.Count; i2++) { ReloadParam(currentParam[i2]); } List <BotPanel> botsInFaze = new List <BotPanel>(); isStart = true; bool neadToReloadParam = false; while (true) { bool isAndOfFaze = false; // все параметры пройдены for (int i2 = 0; i2 < currentParam.Count + 1; i2++) { if (i2 == currentParam.Count) { isAndOfFaze = true; break; } if (isStart) { isStart = false; break; } if (currentParam[i2].Type == StrategyParameterType.Int) { StrategyParameterInt parameter = (StrategyParameterInt)currentParam[i2]; if (parameter.ValueInt < parameter.ValueIntStop) { // по текущему индексу можно приращивать значение parameter.ValueInt = parameter.ValueInt + parameter.ValueIntStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // сбрасываем все предыдущие параметры в ноль ReloadParam(currentParam[i3]); } } break; } } else if (currentParam[i2].Type == StrategyParameterType.Decimal ) { StrategyParameterDecimal parameter = (StrategyParameterDecimal)currentParam[i2]; if (parameter.ValueDecimal < parameter.ValueDecimalStop) { // по текущему индексу можно приращивать значение parameter.ValueDecimal = parameter.ValueDecimal + parameter.ValueDecimalStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // сбрасываем все предыдущие параметры в ноль ReloadParam(currentParam[i3]); } } break; } } } if (isAndOfFaze) { break; } while (_servers.Count >= _master.ThreadsCount) { Thread.Sleep(2000); } if (_neadToStop) { while (true) { Thread.Sleep(1000); if (_servers.Count == 0) { break; } } for (int i = 0; i < botsInFaze.Count; i++) { botsInFaze[i].Delete(); } if (TestReadyEvent != null) { TestReadyEvent(botsInFaze, null); } _primeThreadWorker = null; return; } StartNewBot(allParam, currentParam, fazes[0], botsInFaze, _serverNum.ToString() + " InSample"); } // while по перебору параметров while (true) { Thread.Sleep(1000); if (_servers.Count == 0) { break; } } for (int i = 0; i < botsInFaze.Count; i++) { botsInFaze[i].Delete(); } SendLogMessage("InSample этап закончен. Фильтруем данные...", LogMessageType.System); // 3 фильтруем List <BotPanel> botsToOutOfSample = new List <BotPanel>(); EndOfFazeFiltration(botsInFaze, fazes[0], botsToOutOfSample); // 4 делаем форварды SendLogMessage("Фильтрация окончена. Делаем форвардные тесты...", LogMessageType.System); List <BotPanel> botsOutOfSample = new List <BotPanel>(); for (int i = 0; i < botsToOutOfSample.Count; i++) { while (_servers.Count >= _master.ThreadsCount) { Thread.Sleep(2000); } if (_neadToStop) { while (true) { Thread.Sleep(1000); if (_servers.Count == 0) { break; } } for (int i2 = 0; i2 < botsOutOfSample.Count; i2++) { botsOutOfSample[i2].Delete(); } if (TestReadyEvent != null) { TestReadyEvent(botsToOutOfSample, botsOutOfSample); } _primeThreadWorker = null; return; } StartNewBot(botsToOutOfSample[i].Parameters, new List <IIStrategyParameter>(), fazes[1], botsOutOfSample, botsToOutOfSample[i].NameStrategyUniq.Replace(" InSample", "") + " OutOfSample"); } while (true) { Thread.Sleep(1000); if (_servers.Count == 0) { break; } } for (int i = 0; i < botsOutOfSample.Count; i++) { botsOutOfSample[i].Delete(); } SendLogMessage("Оптимизация закончена.", LogMessageType.System); if (TestReadyEvent != null) { TestReadyEvent(botsInFaze, botsOutOfSample); } _primeThreadWorker = null; }