• Тинькофф Банк-лучшие банковские продукты еще выгоднее
    Выбирайте продукт от банка Тинькофф
  • Уважаемые форумчане, друзья и посетители!
    Поступило предложение ( ссылка на обсуждение ) на сбор средств поддержания форума в рабочем состоянии с 1 июня ( оплата хостинга, бэкап ежедневный на другой хостинг и тд), отчетность будет предоставляться ежемесячно. Пока на ЮMoney ( яндекс деньги), доступно картой перевод, далее добавлю другие способы. Сумму перевода указывайте на ваш выбор исходя из своих возможностей.
    Форум продолжает свою работу благодаря Вашим пожертвованиям.

C++ API. NtDirect.dll Не работает

BADWOOD17

New Member
NinjaTrader
Добрый день!

Хочу написать несложный интерфейс на С++ для работы в 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;
}

}
 

Вложения

  • Тест.rar
    19,4 КБ · Просмотры: 0
помочь не смогу, но интересна сама постановка задачи, для чего и почему на С++? может проще штатными средствами, через индикатор выдергивайте данные функция аналогичная, главное включить тикреплей, иначе эта функция не работает. кстати говоря проверьте чтобы у вас в терминале была ключена данная функция и на графике. возможно это и есть причина того что у вас ничего не выводит ))
 
помочь не смогу, но интересна сама постановка задачи, для чего и почему на С++? может проще штатными средствами, через индикатор выдергивайте данные функция аналогичная, главное включить тикреплей, иначе эта функция не работает. кстати говоря проверьте чтобы у вас в терминале была ключена данная функция и на графике. возможно это и есть причина того что у вас ничего не выводит ))
Добрый день
Просто вот задача есть на плюсах реализовать) расскажите поподробнее ваше предложение. Мне бы на плюсах это реализовать все.
Что в терминале должно быть включено, говорите? Инструмент требуемый на графике открыть?
 
Ну я не знаю как это сопрягается с С++. то что я предлагаю это реалезуется через открытие графика, и навешивание индикатора в котором можно реализовать получение потиковых данных. т.е. получение не только последней цены, но и всей истории тиковых данных. если включить режим тикреплея, то получается можно собирать историю по инструменту без левел2. если просто нужна последняя цена на графике то можно без тикреплея, просто цену закрытия бара брать. все зависит от задачи. если опишите, будет легче подсказать
 
Ну я не знаю как это сопрягается с С++. то что я предлагаю это реалезуется через открытие графика, и навешивание индикатора в котором можно реализовать получение потиковых данных. т.е. получение не только последней цены, но и всей истории тиковых данных. если включить режим тикреплея, то получается можно собирать историю по инструменту без левел2. если просто нужна последняя цена на графике то можно без тикреплея, просто цену закрытия бара брать. все зависит от задачи. если опишите, будет легче подсказать

Задача: реализовать на плюсах программу, в которой будет выполняться функционал MarketData и Command: NinjaTrader 8
В ссылке указаны описания.
 
Назад
Верх Низ