• Demo счет NinjaTrader, регистрируется в брокерской компании NinjaTrader Brokerage . NinjaTrader™, LLC
    Ссылка на демо счет NinjaTrader
    Фид на соединении Continuum/CQG.
    Для справки: Continuum - это брэнд CQG, и ни чем они не отличаются друг от друга.
    Обратите внимание, что в настоящее время CQG не высылает логин и пароль на электронные адреса от mail.ru, bk.ru, list.ru, inbox.ru, поэтому необходимо повторить регистрацию с электронного адреса от другого домейна (yahoo, gmail, и тд).
  • NinjaTrader с зарекомендовавшим себя брокерским сервисом предоставляет наилучшие условия для фьючерсной торговли, включая:
    • Низкие комиссии: Экономьте на торгах через низкие и понятные комиссии
    • Низкая маржа: Всего $50 для микро контрактов
    • Низкие минимумы: Откройте счет от $400
    • Бесплатная платформа: Включает весь необходимый функционал для торговли в реале
  • Уважаемые посетители форума!
    При регистрации на форуме отправляется письмо подтверждения на ваш почтовый ящик, если письмо не пришло, просьба проверить папку "спам" вашего почтового ящика, возможно письмо попало туда.
  • Сколько я реально плачу комиссии?
    Подробнее по ссылке

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

BADWOOD17

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

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

}
 

Вложения

Arkadiy

Well-Known Member
NinjaTrader
#2
помочь не смогу, но интересна сама постановка задачи, для чего и почему на С++? может проще штатными средствами, через индикатор выдергивайте данные функция аналогичная, главное включить тикреплей, иначе эта функция не работает. кстати говоря проверьте чтобы у вас в терминале была ключена данная функция и на графике. возможно это и есть причина того что у вас ничего не выводит ))
 

BADWOOD17

New Member
NinjaTrader
#3
помочь не смогу, но интересна сама постановка задачи, для чего и почему на С++? может проще штатными средствами, через индикатор выдергивайте данные функция аналогичная, главное включить тикреплей, иначе эта функция не работает. кстати говоря проверьте чтобы у вас в терминале была ключена данная функция и на графике. возможно это и есть причина того что у вас ничего не выводит ))
Добрый день
Просто вот задача есть на плюсах реализовать) расскажите поподробнее ваше предложение. Мне бы на плюсах это реализовать все.
Что в терминале должно быть включено, говорите? Инструмент требуемый на графике открыть?
 

Arkadiy

Well-Known Member
NinjaTrader
#4
Ну я не знаю как это сопрягается с С++. то что я предлагаю это реалезуется через открытие графика, и навешивание индикатора в котором можно реализовать получение потиковых данных. т.е. получение не только последней цены, но и всей истории тиковых данных. если включить режим тикреплея, то получается можно собирать историю по инструменту без левел2. если просто нужна последняя цена на графике то можно без тикреплея, просто цену закрытия бара брать. все зависит от задачи. если опишите, будет легче подсказать
 

BADWOOD17

New Member
NinjaTrader
#5
Ну я не знаю как это сопрягается с С++. то что я предлагаю это реалезуется через открытие графика, и навешивание индикатора в котором можно реализовать получение потиковых данных. т.е. получение не только последней цены, но и всей истории тиковых данных. если включить режим тикреплея, то получается можно собирать историю по инструменту без левел2. если просто нужна последняя цена на графике то можно без тикреплея, просто цену закрытия бара брать. все зависит от задачи. если опишите, будет легче подсказать
Задача: реализовать на плюсах программу, в которой будет выполняться функционал MarketData и Command: NinjaTrader 8
В ссылке указаны описания.
 
Вверх Снизу