Добрый день!
Хочу написать несложный интерфейс на С++ для работы в Ninja Trader.
Использую dll библиотеку NtDirect.dll, в которой располагаются с++ функции для работы с терминалом.
Реализовал код, очень похожий по смыслу с аналогичными программами на С#, но код не работает.
Для вызова функций из dll, Произвожу явное связывание, поиск функций в dll.
Например, при вызове функции MarketData (перед ней вызываю Connected, SubscribeMarketData) для любого инструмента всегда возвращается значение 0 (Функция MarketData грубо говоря показывает последнюю цену инструмента).
Все компилируется, исключения не выбрасываются, но значения не выводятся
Помогите пожалуйста. Не понимаю, почему код не работает.
Хочу написать несложный интерфейс на С++ для работы в Ninja Trader.
Использую dll библиотеку NtDirect.dll, в которой располагаются с++ функции для работы с терминалом.
Реализовал код, очень похожий по смыслу с аналогичными программами на С#, но код не работает.
Для вызова функций из dll, Произвожу явное связывание, поиск функций в dll.
Например, при вызове функции MarketData (перед ней вызываю Connected, SubscribeMarketData) для любого инструмента всегда возвращается значение 0 (Функция MarketData грубо говоря показывает последнюю цену инструмента).
Все компилируется, исключения не выбрасываются, но значения не выводятся
Помогите пожалуйста. Не понимаю, почему код не работает.
Код:
/* В классе определены поля:
typedef int(*command_func)(string command, string account, string instrument, string action, int quantity, string orderType, double limitPrice, double stopPrice,
string timeInForce, string oco, string orderId, string strategy, string strategyId);
typedef int(*connected_func)(int showMessage);
typedef int(*subscribe_market_data_func)(string instrument);
typedef int(*unsubscribe_market_data_func)(string instrument);
typedef double(*market_data_func)(string instrument, int zero);
typedef int(*tear_down_func)();
tear_down_func TearDown;
connected_func Connected;
command_func Command;
subscribe_market_data_func SubscribeMarketData;
unsubscribe_market_data_func UnsubscribeMarketData;
market_data_func MarketData;
*/
void ClientClass::LoadDLL()
{
HMODULE nt_lib;
nt_lib = LoadLibrary(L"NtDirect.dll");
if (nt_lib == NULL)
{
throw exception("Couldn`t load dll. Error code : ");
}
Command = (command_func)GetProcAddress(nt_lib, "Command");
if (!Command)
{
throw exception("Couldn`t load dll`s function (Command). Error code :");
}
Connected = (connected_func)GetProcAddress(nt_lib, "Connected");
if (!Connected)
{
throw exception("Couldn`t load dll`s function (Connected). Error code : ");
}
SubscribeMarketData = (subscribe_market_data_func)GetProcAddress(nt_lib, "SubscribeMarketData");
if (!SubscribeMarketData)
{
throw exception("Couldn`t load dll`s function (SubscribeMarketData). Error code : ");
}
MarketData = (market_data_func)GetProcAddress(nt_lib, "MarketData");
if (!MarketData)
{
throw exception("Couldn`t load dll`s function (MarketData). Error code : ");
}
UnsubscribeMarketData = (unsubscribe_market_data_func)GetProcAddress(nt_lib, "UnsubscribeMarketData");
if (!SubscribeMarketData)
{
throw exception("Couldn`t load dll`s function (UnSubscribeMarketData). Error code : ");
}
TearDown = (tear_down_func)GetProcAddress(nt_lib, "TearDown");
if (!TearDown)
{
throw exception("Couldn`t load dll`s function (TearDown). Error code : ");
}
int connected = Connected(1);
if (connected)
throw exception("Error with function Connected. Error code :");
}
.....
//Эта функция должна возвращать последнее значение цены
double ClientClass::GetInstrument(string instrument)
{
int connect = Connected(1);
if(connect)
throw exception("Error with function Connected. Error code :");
int subscribe = SubscribeMarketData(instrument);
if (subscribe)
throw exception("Error with function SubscribeMarketData. Error code :");
/* Отладочная печать, она не нужна.
printf("Connected %d \n", connected);
printf("Subscribe %d \n", subscribe);
printf("Unsubscribe %d \n", unsubscribe);
*/
double lastPrice = MarketData(instrument, 0);
int unsubscribe = UnsubscribeMarketData(instrument);
if (unsubscribe)
throw exception("Error with function UnsubscribeMarketData. Error code :");
return lastPrice;
}
}