Господа кодеры, прошу идейного совета, но с практическими направлениями. Есть задача портировать генерируемые стратегией в NT трейды на OEC Trader. Т.к. я сишарплю, а парни за стенкой ноудджиесят, получить у них качественный совет не получилось.
Текущее решение сделано в режиме хелоуворлда — пишем генерируемые трейды StreamWriter'ом в ТХТ, потом слушаем ТХТ файл
FileSystemWatcher'ом и торгуем в ОЕС.
Когда работает одна стратежка, то все выглядит чин-чин, но ессно когда одновременно работают 2+ стратежки, то при вызове StreamWriter по концу часа несколькими идеями код матерится (файл блаблабла занят другим процессом). Делать многопоточный кастыль для передачи трейдов через ТХТ? Мне кажется это некошерно… Смотрю в сторону WCF… Но там не нашел применимых примеров. Там только калькуляторы, которые я не могу в мозгу перевернуть в то, что мне нужно.
Так вот вопрос — абстрагируясь от NT и ОЕС (они умеют обычный C# без проблем), что лучше выбрать для решения задачи? Если аргументы в пользу ТХТ+Thread, то я готов подвинуться религией. Если в сторону WCF, то пните в нормальный пример. Не калькулятор, а где через службу одна прога отправляет что-то как команду, а вторая прога глотает как команду.
Есть вариант через базу данных, но как «слушать» БД? Timer?
PS Прошу, если что, кодерам с вопросов не ржать. Просто пните правильно, я умею быстро плавать. )
PPS Спросили в личке «Зачем такие сложности». Объясню. В NT есть частный рукописный индюк, который на моем уровне сложно портировать в ОЕС (там синхронизация потоков и прочая высшая математика, к которой я не готов). Вот этот индюк используется для генераций трейдов. Под NT я все написал чЬОтенько, работает как
правительство Германии часы. Все тоже самое сделать под ОЕС нет смысла, проще сменить платформу и брокера. Но частный случай требует частного решения — трейдить в ОЕС полученную идею. Поэтому требуется Solution.sln )))
+ интересно сказано
Пример с биржевой семантикой не подгоню, к сожалению. Навскидку могу предложить абстрактный пример с хабры.
ПС Никогда не думал, что передавать инфу из проги в прогу такая сложность. )
— кусок из лекции по программированию
— пример на msdn
WCF — оверкилл для данной задачи, хотя проблему и решит
еще варианты (чем выше в списке, тем более адекватный на мой взгляд)
1)quick&dirty оставить все как есть, но использовать файлик на рамдиске (к примеру, https://www.softperfect.com/products/ramdisk/). Все станет работать шустрее, и ошибки станут реже. Если писать в цикле, пока не запишет, используя try catch, может быть и ок
2)использовать шаред мемори, к примеру https://sharedmemory.codeplex.com/
3)использовать zmq
4)читальщик сделать на простеньком веб сервере типа http://nancyfx.org/ писать в него пост запросами
5)использовать WebApi2 или Owin
6)если все таки БД, то in-memory базы вроде redis, aerospike должны зайти ок, их можно опрашивать с очень большой частотой, но это оверкилл тоже
7)использовать сокеты (TcpClient, TcpListener)
8)использовать полноценную очередь сообщений (не zmq)
для сериализации вне зависимости от варианта 1-7 можно использовать protobuf-net (если надо бороться за доли миллисекунд), или Newtonsoft.Json (если надо удобно отлаживать)
facevalue, сила первого подхода, что он займет меньше получаса. Выйдет — отлично, проблема решается сама собой, нет — тогда можно по списку.
Нет, веб-запросы, это не SQL, гуглите GET, POST
Dzam, потому, что zmq превосходит сокеты
-по скорости (zmq, в зависимости от настройки, может использовать как сокеты, так и шаред мемори, если на одной машине)
-по удобству (работать с сообщениями гораздо проще и приятнее, чем с сокетами)
Посмотрите примеры, может так понятнее станет сама идеология.
Биржевые примеры
An easy to use .NET API for RabbitMQ
github.com/MerlinBrasil/EasyNetQ
Examples to work with Metatrader 4 (MT4 build >= 500) and RabbitMQ.
github.com/femtotrader/rabbit4mt4
ТС, если это сложно, то может программировать Вам кажется, что умеете?)
пару универсальных сотен строк кода для обеих сторон в виде библиотеки на уровне лабораторной работы универа
а не использовать какие-то сторонние инструменты, тем более такие монструозные как RabbitMQ или SQL
Правильно я понимаю, что торговля ведется на часовике и решение принимается по закрытию часа?