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


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

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

Теги:


Спасибо:




20 Ответов
VassilSanych

Фотография
Дата: 26.03.2013
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 26.03.2013
Ответить


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

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


Студия?
Спасибо:

Макс

Фотография
Дата: 26.03.2013
Ответить


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


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

Автор топика
Спасибо:

Макс

Фотография
Дата: 26.03.2013
Ответить


Студия?[/quote]

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

Moadip

Фотография
Автор статей Программист
Дата: 26.03.2013
Ответить


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

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

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

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


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



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

VassilSanych

Фотография
Дата: 27.03.2013
Ответить


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

Код
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");

Спасибо:

esper

Фотография
Программист
Дата: 27.03.2013
Ответить


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

Макс

Фотография
Дата: 27.03.2013
Ответить


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

VassilSanych

Фотография
Дата: 27.03.2013
Ответить


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

Можно загрузить её под другим именем

Спасибо:

VassilSanych

Фотография
Дата: 27.03.2013
Ответить


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

esper

Фотография
Программист
Дата: 27.03.2013
Ответить


VassilSanych Перейти
Можно загрузить её под другим именем

Что именно имеется ввиду? Extern alias?
Спасибо:

VassilSanych

Фотография
Дата: 27.03.2013
Ответить


esper Перейти
VassilSanych Перейти
Можно загрузить её под другим именем

Что именно имеется ввиду? Extern alias?

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

esper

Фотография
Программист
Дата: 27.03.2013
Ответить


VassilSanych Перейти
Нет. Просто тупо подложить переименованную сборку.
(предположение. не пробовал)

Было бы прикольно, если бы работалоBigGrin А Extern alias это на этапе добавления ссылок.

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


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

Макс

Фотография
Дата: 27.03.2013
Ответить


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

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

VassilSanych

Фотография
Дата: 27.03.2013
Ответить


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

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

Спасибо:

VassilSanych

Фотография
Дата: 27.03.2013
Ответить


esper Перейти
VassilSanych Перейти
Нет. Просто тупо подложить переименованную сборку.
(предположение. не пробовал)

Было бы прикольно, если бы работалоBigGrin А Extern alias это на этапе добавления ссылок.

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

Спасибо: esper

esper

Фотография
Программист
Дата: 27.03.2013
Ответить


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

Получается, что при загрузке только имя файла проверяется, FullName для сборки может быть один и тот же?
Спасибо:

VassilSanych

Фотография
Дата: 27.03.2013
Ответить


esper Перейти
Получается, что при загрузке только имя файла проверяется, FullName для сборки может быть один и тот же?

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

VassilSanych

Фотография
Дата: 28.03.2013
Ответить


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

VassilSanych

Фотография
Дата: 30.03.2013
Ответить


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

Спасибо, не надо.
Имея небольшой опыт работы с Гидрой, я уже имею премирное представление о том, что там может копошиться в коробке Studio.
Даже пробовать не буду.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy