GithubHelp home page GithubHelp logo

enfernuz / javatrans2quik Goto Github PK

View Code? Open in Web Editor NEW
16.0 10.0 10.0 1.61 MB

Java-wrapper for Trans2Quik.dll ("QUIK", Trading Platform by ARQA)

Java 100.00%
quik dll java-wrapper trans2quik arqa trading

javatrans2quik's Introduction

JavaTrans2Quik

JNA-based Java-wrapper for Trans2Quik.dll version 1.2 (http://arqatech.com/upload/iblock/006/Trans2QuikAPI_1.2.rar) ("QUIK", Trading Platform by ARQA)

Как использовать

  1. Инициализируйте экземпляр обёртки библиотеки, используя класс Trans2QuikLibraryLoader:
// ...
Trans2QuikLibrary quikAdapter = Trans2QuikLibraryLoader.LIBRARY;
// ...

Необязательно заводить отдельную ссылку -- для вызова методов можно обращаться напрямую к Trans2QuikLibraryLoader.LIBRARY.

  1. Большинство методов библиотеки Trans2Quik.dll возвращают статус выполнения, а при возникновении ошибки записывают информацию о ней в специальные объекты (обычно это ссылка на код ошибки и буффер под описание ошибки), которые передаются как аргументы метода. Выделим под них место:
NativeLongByReference errorCode = new NativeLongByReference();
byte[] buffer = new byte[255];
  1. Для соединения с терминалом необходимо вызвать метод TRANS2QUIK_CONNECT и, помимо всего прочего, передать туда путь к папке с терминалом QUIK:
String pathToQuik = "C:\\Programs\\Quik";
NativeLong returnCode = quikAdapter.TRANS2QUIK_CONNECT(pathToQuik, errorCode, buffer, buffer.length);
  1. Чтобы отправить транзакцию в терминал, необходимо:

    1. Сформировать строковое представление транзакции (примеры таких представлений можно найти в файле "6 Работа с др приложениями.pdf" из инструкции к API терминала). Чтобы не усложнять, возьмём уже сформированную строку.
    2. Вызвать метод библиотеки TRANS2QUIK_SEND_SYNC_TRANSACTION( ... ) и передать ему строковое представление транзации, объекты под код ошибки и сообщение для ошибки.
      Есть также и асинхронный способ отправки транзакции: с помощью метода TRANS2QUIK_SEND_ASYNC_TRANSACTION и коллбэка TransactionReplyCallback, устанавливаемого посредством метода TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK.

Внимание! Строковое представление транзакции взято из руководства к библиотеке trans2quik.dll, и транзакция, основанная на нём, на сервер отправлена не будет, т.к. в ней имеются недействительные значения параметров. Для грамотного составления строк транзакций рекомендую ознакомиться с форматом транзакций в файле "6 Работа с др приложениями.pdf", пункт 6.11.3.

String transaction = "ACCOUNT=NL0080000043; CLIENT_CODE=467; TYPE=L; TRANS_ID=1; CLASSCODE=TQBR; SECCODE=RU0008943394; ACTION=NEW_ORDER; OPERATION=S; PRICE=43,21; QUANTITY=3;"
Long result = quikAdapter.TRANS2QUIK_SEND_SYNC_TRANSACTION(transaction, errorCode, buffer, buffer.length);

Расшифровка результата result работы метода следующая (алиасы говорят сами за себя):

0 = TRANS2QUIK_SUCCESS
1 = TRANS2QUIK_FAILED
2 = TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND
3 = TRANS2QUIK_DLL_VERSION_NOT_SUPPORTED
4 = TRANS2QUIK_ALREADY_CONNECTED_TO_QUIK
5 = TRANS2QUIK_WRONG_SYNTAX
6 = TRANS2QUIK_QUIK_NOT_CONNECTED
7 = TRANS2QUIK_DLL_NOT_CONNECTED
8 = TRANS2QUIK_QUIK_CONNECTED
9 = TRANS2QUIK_QUIK_DISCONNECTED
10 = TRANS2QUIK_DLL_CONNECTED
11 = TRANS2QUIK_DLL_DISCONNECTED
12 = TRANS2QUIK_MEMORY_ALLOCATION_ERROR
13 = TRANS2QUIK_WRONG_CONNECTION_HANDLE
14 = TRANS2QUIK_WRONG_INPUT_PARAMS

Подобный подход используется и для вызова других методов.

Касаемо функций обратного вызова (callbacks)

Часто терминал после обработки какого-то события может посылать нам информацию. Это может быть, например, обрыв соединения с интернетом или ответ на посланную нами асинхронную транзакцию. Получение такой информации реализовано через функции обратного вызова: терминал вызывает определённый метод библиотеки с определёнными аргументами, представляющими собой информацию, которую хочет передать терминал. Обрабатывать эту информацию можно по-разному. Для обработки функций обратного вызова необходимо переопределить их поведение с своём приложении. Например, мы хотим реагировать на обрыв соединения с Интернетом, логгируя это событие. Для этого в Trans2Quik есть callback под названием TRANS2QUIK_CONNECTION_STATUS_CALLBACK. В обёртке он представлен интерфейсом ConnectionStatusCallback, наследником общего интерфейса коллбэков StdCallCallback. Каждый коллбэк имеет у себя метод void callback(...) со своим набором аргументов. В своём коде создаём объект интерфейса ConnectionStatusCallback и переопределяем у него метод callback:

Trans2QuikLibrary.ConnectionStatusCallback connectionStatusCallback = new Trans2QuikLibrary.ConnectionStatusCallback() {
        @Override
        public void callback(
            NativeLong nConnectionEvent, 
            NativeLong nExtendedErrorCode, 
            String lpcstrInfoMessage
        ) {
            Logger.getLogger(this.getClass().getName()).info(String.format("[%s]: nConnectionEvent = %d, nExtendedErrorCode = %d, lpcstrInfoMessage = %s", "ConnectionStatusCallback", nConnectionEvent.intValue(), nExtendedErrorCode.intValue(), lpcstrInfoMessage));
            ...
        }
    };

Другой пример: реагирование на событие изменения статуса заявки

Trans2QuikLibrary.OrderStatusCallback orderStatusCallback = new Trans2QuikLibrary.OrderStatusCallback() {
        @Override
        public void callback(
                            NativeLong nMode, 
                            int dwTransID, 
                            double dNumber,
                            String ClassCode, 
                            String SecCode, 
                            double dPrice,
                            NativeLong nBalance, 
                            double dValue, 
                            NativeLong nIsSell, 
                            NativeLong nStatus,
                            NativeLong nOrderDescriptor) {
            Logger.getLogger(this.getClass().getName()).info(String.format("[%s]: nMode = %d, dwTransID = %d, dNumber = %f, ClassCode = %s, SecCode = %s, dPrice = %f, nBalance = %d, dValue = %f, nIsSell = %d, nStatus = %d, nOrderDescriptor = %d",
                    "OrderStatusCallback", nMode.intValue(), dwTransID, dNumber, ClassCode, SecCode, dPrice, nBalance.intValue(), dValue, nIsSell.intValue(), nStatus.intValue(), nOrderDescriptor.intValue()));
        }
    };

Разумеется, логгирование -- не единственная возможная ваша реакция на событие. Например, информацию OrderStatusCallback можно использовать для контролирования работы бота.

Экземпляры обработчиков коллбэков нужно передать библиотеке Trans2Quik.dll. Для каждого коллбэка в библиотеке существует свой метод для этого. Например, для установки коллбэка на статус соединения (ConnectionStatusCallback) используется метод TRANS2QUIK_SET_CONNECTION_STATUS_CALLBACK:

retcode = quikAdapter.TRANS2QUIK_SET_CONNECTION_STATUS_CALLBACK(connectionStatusCallback, errorCode, buffer, buffer.length;

Вообще говоря, реализовывать и устанавливать коллбэки -- дело сугубо личное, определяемое исходя из списка событий, которые вам интересны.

Подводя итог: результаты некоторых событий, происходящих в терминале, -- обработки транзакций, изменения статуса заявок и многое другое (см. "6 Работа с др приложениями.pdf") -- получаются посредством коллбэков.

Как получать информацию из Quik в Java?

Я знаю как минимум два способа:

  1. Установить на стороне QUIK RPC-сервис (сервис вызова удалённых процедур):
    https://github.com/Enfernuz/quik-lua-rpc

    Java-клиент к нему: https://github.com/Enfernuz/quik-lua-rpc-java-client

    Реализует все методы API QLua, поэтому умеет также и в отправку транзакций (метод QLua sendTransaction). В сущности, при использовании quik-lua-rpc вам уже не нужен JavaTrans2Quik.

  2. Ещё один RPC-сервис. Проще в установке, но менее функционален: https://github.com/boscogh/quik_pipe

javatrans2quik's People

Contributors

enfernuz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

javatrans2quik's Issues

x64 разрядный Квик

Есть ли возможность обновить враппер для 8 Квика? Обещают что он станет х64 разрядным, значит и DLL тоже будет новая?
Или достаточно просто заменить DLL на новую?

TRANS2QUIK_CONNECT

Подскажи, пожалуйста, где взять последнюю версию trans2quik.dll? Я так понимаю есть версия 1.2 (x86), 1.3 (x64). И еще у вас некоторые функции, например, TRANS2QUIK_CONNECT , возвращают текст ошибки в buffer (byte[]). Как оттуда текст получить? String.valueOf(buffer), возвращает текст такого рода ( [B@2b164752 ).

Не находит DLL

Собрал проект, но он не находит библиотеку (в самом проекте ничего не менял).

c:\Software\Sync>java -jar quiksockets.jar
[main] INFO ru.abinet.quiksockets.QuikSockets - Registered terminal #TEST, path
C:\Software\QUIK_OPEN
[main] INFO ru.abinet.quiksockets.QuikSockets - Listening 10.0.1.13 port 2000
[Thread-0] INFO ru.abinet.quiksockets.QuikSockets - Received transaction for #nu
ll, order #null
[Thread-0] INFO ru.abinet.quiksockets.QuikSockets - Unable to load library 'TRAN
S2QUIK': Can't obtain InputStream for win32-x86-64/TRANS2QUIK.dll
java.lang.UnsatisfiedLinkError: Unable to load library 'TRANS2QUIK': Can't obtai
n InputStream for win32-x86-64/TRANS2QUIK.dll
        at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:271)
        at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
        at com.sun.jna.Library$Handler.<init>(Library.java:147)
        at com.sun.jna.Native.loadLibrary(Native.java:412)
        at org.jtrans2quik.loader.Trans2QuikLibraryLoader.<clinit>(Trans2QuikLib
raryLoader.java:26)

Честно говоря, я таких штук с явой никогда не проделывал. Так как библиотека 32 разрядная, должен ли я ее запускать строго 32-разрядной ява-машиной?
Смущает win32-x86-64/TRANS2QUIK.dll - либа лежит прямо в корне. Ее переложить надо?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.