К сожалению в эксель транслировать реалтаймовую дату микроструктуры рынка, даже российского – не самая лучшая идея, не предназначен он для такого, слишком плотный уже поток(400 таблиц\сек), а будет ещё плотней, в любом случае придётся писать свою инфраструктуру получения, обработки данных и трансляции торговых приказов, “жертвовать” приходится не из за квика или дде, у меня транслируется почти всё и лаги только из за обработки данных в моменты вскипания рынка, когда в секунду больше 2-3к таблиц прилетает, то есть когда примерно в 10 раз больше среднего.
Info.wnd хранит в себе номера счетов, при переносе с акаунта на аккаунт они не убираются из доступных счетов депо, что во первых создаёт путаницу при переносе между аккаунтами, во вторых при обмене wnd с другими трейдерами создаёт неудобства.
Спасибо, но не понял, сорри, это где? Я на С# химичу, по DDE данные получаю, и С# обёрткой над C++ API ордера шлю. Я имею в виду мне нужно получить все счета и для данного депо, чтобы если к примеру если я робота поставил на другом депо, допустим демо или на другом компе с другим акаунтом, то чтоб не нужно было в ручную забивать эти счета в бота как параметры или считывать с текста. Счета нужны чтобы ордер послать
Нужно получить все счета депо(номера) либо через API, функцией, или чтобы таблицы была такая которую по DDE можно вытянуть. Устал каждый раз руками вбивать.
Это дешево, сердито, однако нестабильно, включение каждый 5й раз сбоит примерно, отключение( "^S") через раз, причем при отключении вешает комп ещё и, это не вариант. У меня было вот так:
Код
public class DdeStartStop
{
private static string _exportMenuKey = "Экспорт данных";
private static string _stopExportMenuItem = "Остановить экспорт таблиц по &DDE";
private static string _startExportByDDEMenuItem = "Начать экспорт таблиц по &DDE";
private const UInt32 MF_BYPOSITION = 0x00000400;
[DllImport("user32.dll")]
private static extern IntPtr GetMenu(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern IntPtr GetSubMenu(IntPtr hMenu, int nPos);
[DllImport("user32.dll")]
private static extern int GetMenuItemCount(IntPtr hMenu);
[DllImport("user32.dll")]
private static extern int GetMenuString(IntPtr hMenu, uint uIDItem, StringBuilder lpString, int nMaxCount, uint uFlag);
[DllImport("user32.dll")]
private static extern uint GetMenuItemID(IntPtr hMenu, int nPos);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private static IntPtr[] FindQuikWindow()
{
var processes = Process.GetProcessesByName("info");
var result = new IntPtr[processes.Length];
for (int i = 0; i < processes.Length; i++)
result[i] = processes[i].MainWindowHandle;
return result;
}
private static uint FindMenuItemByPart(IntPtr menu, string name)
{
int menuItemsCount = GetMenuItemCount(menu);
for (uint menuIndex = 0; menuIndex < menuItemsCount; menuIndex++)
{
var result = new StringBuilder();
GetMenuString(menu, menuIndex, result, 1024, MF_BYPOSITION);
string buffer = result.ToString();
if (buffer.Contains(name))
{
return menuIndex;
}
}
return 0;
}
public static bool StartDDE()
{
IntPtr[] quikWindows = FindQuikWindow();
if (quikWindows.Length == 0)
return false;
foreach (var quikWindow in quikWindows)
{
try
{
IntPtr mainMenu = GetMenu(quikWindow);
int exportMenuIndex = (int)FindMenuItemByPart(mainMenu, _exportMenuKey);
IntPtr exportMenu = GetSubMenu(mainMenu, exportMenuIndex);
uint exportIndex = 6;
uint menuItem = GetMenuItemID(exportMenu, (int)exportIndex);
PostMessage(quikWindow, 0x111, (IntPtr)menuItem, (IntPtr)0);
}
catch (Exception)
{
}
}
return true;
}
public static bool StopDDE()
{
IntPtr[] quikWindows = FindQuikWindow();
if (quikWindows.Length == 0)
return false;
try
{
foreach (var quikWindow in quikWindows)
{
IntPtr mainMenu = GetMenu(quikWindow);
int exportMenuIndex = (int)FindMenuItemByPart(mainMenu, _exportMenuKey);
IntPtr exportMenu = GetSubMenu(mainMenu, exportMenuIndex);
uint exportIndex = 7;
uint menuItem = GetMenuItemID(exportMenu, (int)exportIndex);
PostMessage(quikWindow, 0x111, (IntPtr)menuItem, (IntPtr)0);
}
}
catch (Exception) {}
return true;
}
}