← Zurück

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

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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (20)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

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 загружает референсные библиотеки из стартовой папки