Клиентский API > AdirConnector
-
- Сообщения: 229
- Зарегистрирован: 28 июн 2017, 13:56
- Благодарил (а): 4 раза
- Поблагодарили: 41 раз
AdirConnector
Итак, сегодня мы напишем простейшее приложение-терминал с командной строкой, на основании базовых библиотек Alfa Direct Pro 4.0. Это не сложно.
Забудьте про индикаторы, стратегии роботы, api и прочий хлам! Все эти инструкции вам больше не нужны!
Теперь, только тонкая прослойка асинхронных сокетов и, сравнительно, полезное, ядро терминала (я вас научу как и его отключить;) ) отделяет вас от серверов Alfa Direct!
Теперь, только ВАШ КОД, КОТОРЫЙ ВЫ ПИШЕТЕ САМИ, получит непосредственный доступ к каждой циферке терминала и сможет максимально эффективно реализовывать любую торговую стратегию.
А если Вам станет скучно - дерзайте, ваяйте свою графику и померейтесь с разработчиками терминала своим крутейшим дизайном ))))
Забудьте про индикаторы, стратегии роботы, api и прочий хлам! Все эти инструкции вам больше не нужны!
Теперь, только тонкая прослойка асинхронных сокетов и, сравнительно, полезное, ядро терминала (я вас научу как и его отключить;) ) отделяет вас от серверов Alfa Direct!
Теперь, только ВАШ КОД, КОТОРЫЙ ВЫ ПИШЕТЕ САМИ, получит непосредственный доступ к каждой циферке терминала и сможет максимально эффективно реализовывать любую торговую стратегию.
А если Вам станет скучно - дерзайте, ваяйте свою графику и померейтесь с разработчиками терминала своим крутейшим дизайном ))))
Последний раз редактировалось ensh 06 янв 2019, 00:23, всего редактировалось 1 раз.
-
- Сообщения: 229
- Зарегистрирован: 28 июн 2017, 13:56
- Благодарил (а): 4 раза
- Поблагодарили: 41 раз
Re: AdirConnector
Итак приступаем, пристегните ремни.
1. Находим папку Alfa-Direct Pro инсталляции терминала в C:\Program Files (x86) и КОПИРУЕМ ее в отдельный каталог с вашими правами, например c:\temp, чтобы меньше проблем. Далее, подразумеваем, что все действия происходят с КОПИЕЙ папки.
2. В папке находим файл ADirect.exe, запускаем, все работает? Да! - Отлично продолжаем...
3. Можно переименовать папку например на Alfa-Direct Connector
4. Запускаем Visual Studio 2017, надеюсь
5. Создаем консольный проект (назовем его AdirConnector) с версией .Net Framework 4.5 (это для крайней версии терминала) предыдущие версии терминала работали под .Net Framework 4.0.
6. В свойствах проекта, сразу настроим папку для отладки и компиляции (свойство Выходной путь или Output path чтоле) обычно там bin\Debug.
7. Трррррррреемммм - приступаем к добавлению сборок от терминала в проект: открываем диалоговое окно добавления сборки -> выбираем режим обзор -> в диалоговом окне находим и добавляем (сразу или по очереди) Core.dll, ADUtils.dll, ADir.NetProtocol.dll, ADir.ClientStructures.dll, ADir.BaseStructures.dll (в ранних версиях NetProtocol.dll, ClientStructures.dll, BaseStructures.dll)
8. Сохраняем проект переводим дух, удалим из проекта ненужный app.config, если есть.
1. Находим папку Alfa-Direct Pro инсталляции терминала в C:\Program Files (x86) и КОПИРУЕМ ее в отдельный каталог с вашими правами, например c:\temp, чтобы меньше проблем. Далее, подразумеваем, что все действия происходят с КОПИЕЙ папки.
2. В папке находим файл ADirect.exe, запускаем, все работает? Да! - Отлично продолжаем...
3. Можно переименовать папку например на Alfa-Direct Connector
4. Запускаем Visual Studio 2017, надеюсь
5. Создаем консольный проект (назовем его AdirConnector) с версией .Net Framework 4.5 (это для крайней версии терминала) предыдущие версии терминала работали под .Net Framework 4.0.
6. В свойствах проекта, сразу настроим папку для отладки и компиляции (свойство Выходной путь или Output path чтоле) обычно там bin\Debug.
7. Трррррррреемммм - приступаем к добавлению сборок от терминала в проект: открываем диалоговое окно добавления сборки -> выбираем режим обзор -> в диалоговом окне находим и добавляем (сразу или по очереди) Core.dll, ADUtils.dll, ADir.NetProtocol.dll, ADir.ClientStructures.dll, ADir.BaseStructures.dll (в ранних версиях NetProtocol.dll, ClientStructures.dll, BaseStructures.dll)
8. Сохраняем проект переводим дух, удалим из проекта ненужный app.config, если есть.
Последний раз редактировалось ensh 21 янв 2019, 01:26, всего редактировалось 2 раза.
-
- Сообщения: 229
- Зарегистрирован: 28 июн 2017, 13:56
- Благодарил (а): 4 раза
- Поблагодарили: 41 раз
Re: AdirConnector
Теперь приступим к коду, файла Program.cs
вот собственно:
вот собственно:
Код: Выделить всё
using System;
using AD.Common.Helpers;
using AD.Common.DataStructures;
namespace AdirConnector
{
class Program
{
static void Main(string[] args)
{
// настройка системы логирования
LogFileManager.Instance.FolderPath = @"C:\TEMP\AdirConnector\Logs\";
LogFileManager.Instance.LoggingLevel = EventsLoggingLevels.All;
LogFileManager.Instance.SizeLimit = 32u << 20;
RunProcessing(); // программа где-то здесь
Console.ReadLine(); // ожидаем нажатия Enter, что приведет к дисконнекту
Core.ADConnection.Instance.Disconnect();
Console.ReadLine(); // ожидаем нажатия Enter, что приведет к выходу из программы
LogFileManager.Instance.WriteAllStream(); // сбрасываем на диск все логи, из буферов
}
static void Instance_ConnectionChanging(Core.LogicConnectionStatus status)
{
Console.WriteLine(String.Format("Instance_ConnectionChanging({0})", status.ToString()));
}
static void Instance_OnConnectionStatusChanged(FrontEndType frontendType, ConnectionStatus status)
{
Console.WriteLine(String.Format("Instance_ConnectionChanged({0}, {1})", frontendType.ToString(), status.ToString()));
}
static void RunProcessing()
{
Core.ConnectionInfo.Instance.Load(ApplicationPaths.ConnectionInfoFilePath);
Core.ADConnection.Instance.ConnectionChanging += Instance_ConnectionChanging;
Core.ADConnection.Instance.OnFrontEndConnectionStatusChanged += Instance_OnConnectionStatusChanged;
Console.Write("Login=>");
var login = Console.ReadLine();
Console.Write("Password=>");
var password = Console.ReadLine();
Core.ADConnection.Instance.Login(login, password);
}
}
}
-
- Сообщения: 229
- Зарегистрирован: 28 июн 2017, 13:56
- Благодарил (а): 4 раза
- Поблагодарили: 41 раз
Re: AdirConnector
Компилируем, запускаем...
Вводим логин и пароль и вуаля... надеюсь, успешно, подключились к серверам Alfa Direct
Теперь у нас из коробки весь невизуальный движок (ядро) терминала Alfa Direct, при должной сноровке, можно переписать свой Core.dll,
Ядро само подключается, авторизуется, отвечает и передает запросы, логирует, пишет локальные базы.
Обращаем внимание на всевозможные менеджеры, типа OrdersManager, OperationManager, PositionManager, BalanceManager, ChatManager, и тд и тп.
Все что относится к графикам ChartHistoryManager, Chart..., а также всякие Robot... лучше не трогать они не нужны.... воооще не нужны и точка, лучше все писать самим.
Вводим логин и пароль и вуаля... надеюсь, успешно, подключились к серверам Alfa Direct
Теперь у нас из коробки весь невизуальный движок (ядро) терминала Alfa Direct, при должной сноровке, можно переписать свой Core.dll,
Ядро само подключается, авторизуется, отвечает и передает запросы, логирует, пишет локальные базы.
Обращаем внимание на всевозможные менеджеры, типа OrdersManager, OperationManager, PositionManager, BalanceManager, ChatManager, и тд и тп.
Все что относится к графикам ChartHistoryManager, Chart..., а также всякие Robot... лучше не трогать они не нужны.... воооще не нужны и точка, лучше все писать самим.
Последний раз редактировалось ensh 06 янв 2019, 00:24, всего редактировалось 1 раз.
-
- Сообщения: 229
- Зарегистрирован: 28 июн 2017, 13:56
- Благодарил (а): 4 раза
- Поблагодарили: 41 раз
Re: AdirConnector
Теперь научимся подписываться на данные
для этого изменим код метода:
существуют также групповые методы, которые принимают список idFi, но помним про ограничения на подписку и методы UnSubscribe
для этого изменим код метода:
Код: Выделить всё
static void Instance_ConnectionChanging(Core.LogicConnectionStatus status)
{
Console.WriteLine(String.Format("Instance_ConnectionChanging({0})", status.ToString()));
if (status == Core.LogicConnectionStatus.Conneceted)
{
// подпишемся на что-нибудь интересное
// чат
Core.SubscriptionManager.Instance.SubscribeChat();
// свои сделки
Core.SubscriptionManager.Instance.SubscribeOperations();
//стаканы AAPL
Core.SubscriptionManager.Instance.SubscribeQueue(218182);
// сделки биржи
Core.SubscriptionManager.Instance.SubscribeStream(Core.SubscribeFilterType.MarketTrades, 218182);
// инстумент инфо
Core.SubscriptionManager.Instance.SubscribeStream(Core.SubscribeFilterType.FinInfoExt, 218182);
// котировки
Core.SubscriptionManager.Instance.SubscribeStream(Core.SubscribeFilterType.Quotes, 218182);
// график
var rq = new ArchiveRequestEntity()
{
IdRequest = 1,
IdFi = 218182,
TimeFrame = BaseTimeFrame.Hour,
CandleType = CandleType.Standard,
DaysCount = -100,
MaximumDate = DateTime.MaxValue,
Created = Core.ConnectionManager.Instance.GetServerTime()
};
Core.ConnectionManager.Instance.SendPacket(rq, FrontEndType.BirzArchAndMediaServer);
}
}
существуют также групповые методы, которые принимают список idFi, но помним про ограничения на подписку и методы UnSubscribe
Последний раз редактировалось ensh 06 янв 2019, 00:25, всего редактировалось 1 раз.
-
- Сообщения: 229
- Зарегистрирован: 28 июн 2017, 13:56
- Благодарил (а): 4 раза
- Поблагодарили: 41 раз
Re: AdirConnector
как работать с менеджерами... ну например...
создадим таймер на 1000 мсек, например, и в обработчике напишем
тут, для примера, все выводится в файл но можно что-то другое замутить
создадим таймер на 1000 мсек, например, и в обработчике напишем
Код: Выделить всё
static void OnTimer(Object source, ElapsedEventArgs e)
{
if (Core.Notifications.Instance.TryGetMessagesUpdate(out var messages))
foreach (var line in messages.Select(mm => mm.TextDisplayMessage))
LogFileManager.AddInfo(line, "notification");
if (Core.PositionManager.Instance.TryGetChanges(out var positionUpdates, out var balanceUpdates))
{
lock (Core.PositionManager.Instance.Positions.Locker)
{
foreach (var pos in positionUpdates
.Select(pu => Core.PositionManager.Instance.Positions.Primary[pu])
.OfType<ClientTradePosition>())
{
LogFileManager.AddInfo(pos.ToString(), "positions");
}
}
lock (Core.PositionManager.Instance.Balances.Locker)
{
foreach (var bal in balanceUpdates
.Select(bu => Core.PositionManager.Instance.Balances.Primary[bu])
.OfType<ClientSubAccountBalance>())
{
LogFileManager.AddInfo(bal.ToString(), "balances");
}
}
}
if (Core.OperationsManager.Instance.TryGetChanges(out var operUpdates))
{
foreach (var oper in operUpdates)
LogFileManager.AddInfo(oper.Value.ToString(), "operations");
}
}
тут, для примера, все выводится в файл но можно что-то другое замутить
-
- Сообщения: 229
- Зарегистрирован: 28 июн 2017, 13:56
- Благодарил (а): 4 раза
- Поблагодарили: 41 раз
Re: AdirConnector
теперь можем переопределить стандартный обработчик, хотя можем навесить свой поверх имеющегося как-то так
для чего... там много всего тяжелого в стандартном обработчике, можно написать свой обработчик, а часть кода взять из стандартного, это нужно для своих роботов которые должны агрегировать сделки и получать графики, что сейчас сделано кривее некуда
Код: Выделить всё
static void Instance_OnConnectionStatusChanged(FrontEndType frontendType, AD.Common.DataStructures.ConnectionStatus status)
{
Console.WriteLine(String.Format("Instance_ConnectionChanged({0}, {1})", frontendType.ToString(), status.ToString()));
if (status == ConnectionStatus.Authorized)
{
// удаляем дефолтную обработку пакетов
var caller = typeof(Core.ConnectionManager).GetMethod("ConnectionManager_NewPacket", BindingFlags.NonPublic | BindingFlags.Instance);
if (caller != null)
{
var d = Delegate.CreateDelegate(typeof(Core.NewPacketEvent), Core.ConnectionManager.Instance, caller);
Core.ConnectionManager.Instance[frontendType].NewPacket -= (Core.NewPacketEvent)d;
Core.ConnectionManager.Instance[frontendType].NewPacket += NewPacket; // подставляем свою
}
}
}
static bool unpack(IADSerializable o, ICollection<IADSerializable> l)
{
l.Add(o);
return true;
}
static void NewPacket(FrontEndType frontendType, byte[] packet, DateTime packetTime, bool newPacket)
{
try
{
// разбор данных пакета
var list = new List<IADSerializable>();
Packer.UnpackEntityList<IADSerializable>(o => unpack(o, list), packet);
foreach (var e in list)
LogFileManager.AddInfo(e.ToString(), e.TypeID.ToString());
}
catch (Exception ex)
{
LogFileManager.AddError("NewPacket PackerException", ex);
}
}
для чего... там много всего тяжелого в стандартном обработчике, можно написать свой обработчик, а часть кода взять из стандартного, это нужно для своих роботов которые должны агрегировать сделки и получать графики, что сейчас сделано кривее некуда
-
- Сообщения: 229
- Зарегистрирован: 28 июн 2017, 13:56
- Благодарил (а): 4 раза
- Поблагодарили: 41 раз
Re: AdirConnector
на этом все, пока, надеюсь это поможет вам в написании эффективных стратегий и в прибыльной торговле
-
- Сообщения: 170
- Зарегистрирован: 18 дек 2017, 08:18
- Благодарил (а): 12 раз
- Поблагодарили: 8 раз
Re: AdirConnector
Доброго времени суток, ensh
Это было-бы попыткой написать первый плагин для AD, да и повод пообщаться.
Может кто еще захочет присоединиться?
Или, такого не было и вот опять?С наилучшими пожеланиями
Может возьметесь собрать объект для "Журнал трейдера" или еще чего интересного, вместе придумаем как его прикрутить, или времени швах? А у меня времени пока много, сам бы взялся, но компьютер и интернет подвели.ensh писал(а):на этом все, пока, надеюсь это поможет вам в написании эффективных стратегий и в прибыльной торговле
Это было-бы попыткой написать первый плагин для AD, да и повод пообщаться.
Может кто еще захочет присоединиться?
Или, такого не было и вот опять?
Indigo-On » 03 дек 2018, 13:13 писал(а):В топку такие предложения!
► Показать
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость