← Atrás

Несколько стратегий через quik

Как запускать несколько стратегий через quik ? Если мне надо поправить одну, то приходиться все выключать и перезапускать после правки. 2-й quik не выход т.к. если будет 3-4 стратегии.

Есть какие то варианты, чтобы можно было остановить одну стратегию, ее поправить и перезапустить в то время как остальные продолжают работать?

¿Le resultó útil este tema?

Compartir tema

Comentarios (20)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

VassilSanych
VassilSanych

Динамическая подгрузка dll. Динамическое конфигурирование.

Макс
Макс Autor

VassilSanych: Динамическая подгрузка dll. Динамическое конфигурирование.

есть пример? не умею это делать.

Moadip
Moadip

Если стратегия "вживлена" в оболочку через которую запускается робот, то придется переписывать.

Механизм примерно такой: Есть dll в которой лежат классы стратегий, как вариант на каждую стратегию отдельная dll. В оболочке подгружается данная либа. Через рефлексию вытаскиваются типы(классы стратегий). Создаются и запускаются стратегии.

В итоге получается стратегию можно отлаживать отдельно(если она в отдельной dll) пока работает бот. И потом в любой момент подгрузить эту dll, создать и запустить стратегию вместе с текущей.

Макс:

VassilSanych: Динамическая подгрузка dll. Динамическое конфигурирование.

есть пример? не умею это делать.

На codeplex лежат исходники гидры. Источники сделаны в виде плагинов - dll, которые подгружаются при запуске, затем через рефлексию берутся типы(классы) и создаются объекты.

VassilSanych
VassilSanych

Макс: есть пример? не умею это делать.

var strategyLib = Assembly.LoadFrom(Path.Combine(dir, fileName));
var strategyType = strategyLib.GetExportedTypes()
		.FirstOrDefault(x => 
			typeof(IStrategyFactory).IsAssignableFrom(x));
if (strategyType != null)
{
	var strategyFactory = (IStrategyFactory)strategyLib
		.CreateInstance(strategyType.FullName);
	return strategyFactory.Create();
}
else
	throw new NotImplementedException("strategyLib does not implement IStrategyFactory");
Mikhail Sukhov
Mikhail Sukhov

Макс: Как запускать несколько стратегий через quik ? Если мне надо поправить одну, то приходиться все выключать и перезапускать после правки. 2-й quik не выход т.к. если будет 3-4 стратегии.

Есть какие то варианты, чтобы можно было остановить одну стратегию, ее поправить и перезапустить в то время как остальные продолжают работать?

Студия?

Макс
Макс Autor

Студия?

нет 4.1.7 давно работает один робот, хочу 2-й алгоритм добавить не трогая 1-й.

esper
esper

Динамическая подгрузка это конечно хорошо, но нельзя просто так выгрузить ранее загруженную сборку, а значит нельзя и повторно ее загрузить после правки.

VassilSanych
VassilSanych

esper: Динамическая подгрузка это конечно хорошо, но нельзя просто так выгрузить ранее загруженную сборку, а значит нельзя и повторно ее загрузить после правки. Можно загрузить её под другим именем

Макс
Макс Autor

А кто-нибудь торгует несколько стратегий через quik? Как Вы это реализовали?

VassilSanych
VassilSanych

Ещё можно:

  • использовать MEF
  • Shadow Copy, как в ASP.NET
    • собственно можно напрямую использовать ASP.NET. Это добавит системе устойчивости.
  • отдельный AppDomain (правда придётся налаживать междоменное взаимодействие)
  • использовать скрипты В любом случае необходимо профилировать память на предмет хвостов от использованного кода. Иначе течь будет обязательно.
esper
esper

VassilSanych: Можно загрузить её под другим именем Что именно имеется ввиду? Extern alias?

VassilSanych
VassilSanych

esper:

VassilSanych: Можно загрузить её под другим именем Что именно имеется ввиду? Extern alias? Нет. Просто тупо подложить переименованную сборку. (предположение. не пробовал) PS Extern alias вроде как для references, а мы их обходим.

esper
esper

VassilSanych: Нет. Просто тупо подложить переименованную сборку. (предположение. не пробовал) Было бы прикольно, если бы работало😀 А Extern alias это на этапе добавления ссылок.

  • MEF, скорее всего, так же не поможет.
  • Можно загружать стратегии в отдельный AppDomain, но будет много проблем с маршалингом данных и не ясно, что с производительностью.
  • Скрипты отличный вариант, лучше даже просто CodeDomProvider использовать

А можно просто использовать S#.Studio, где этот функционал идет из коробки.

VassilSanych
VassilSanych

esper:

VassilSanych: Нет. Просто тупо подложить переименованную сборку. (предположение. не пробовал) Было бы прикольно, если бы работало😀 А Extern alias это на этапе добавления ссылок. Заинтриговали меня. Проверил. Нормально работает загрузка двух стратегий из двух копий одной библиотеки. В том-то и дело, что ссылок у нас никаких нет при динамической загрузке.

esper
esper

VassilSanych: Заинтриговали меня. Проверил. Нормально работает загрузка двух стратегий из двух копий одной библиотеки. В том-то и дело, что ссылок у нас никаких нет при динамической загрузке. Получается, что при загрузке только имя файла проверяется, FullName для сборки может быть один и тот же?

VassilSanych
VassilSanych

esper: Получается, что при загрузке только имя файла проверяется, FullName для сборки может быть один и тот же? Хрен его знает. Ковырял рефлектором. Дальше определённого уровня не пускает посмотреть. Причём LoadFrom не ругается, но грузит прошлую сборку. А LoadFile грузит новую.

VassilSanych
VassilSanych

esper: А можно просто использовать S#.Studio, где этот функционал идет из коробки. Спасибо, не надо. Имея небольшой опыт работы с Гидрой, я уже имею премирное представление о том, что там может копошиться в коробке Studio. Даже пробовать не буду.

Макс
Макс Autor

Всем спасибо за советы. Но все это теория. А есть кто-нибудь реально торгющий несколько стратегий через quik ?

Мне еще приходит идея сделать типа шлюза, который будет подключаться к квику, а все остальные роботы будут подключаться к шлюзу, получать данные и отправлять туда заявки, но все это велосипед, который не хочется изобретать...

VassilSanych
VassilSanych

Макс: но все это велосипед, который не хочется изобретать... Велосипед изобретать придётся по-любому. Потому что во-первых это уже вопрос конечной реализации, а она у каждого своя - по своим отдельным требованиям. А во-вторых, можно конечно поискать, кто её вам бесплатно откроет, но я бы не надеялся.

VassilSanych
VassilSanych

PS Кстати Assembly.LoadFile dll не лочит. Но повторно не загружает. Так что переименовывать-таки надо. Некоторые особенности: Assembli.LoadFrom загружает референсные библиотеки из целевой папки Assembly.LoadFile загружает референсные библиотеки из стартовой папки