Михаил Филимонов (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 След.
Время исполнения ордеров на ФОРТС и Фондовой секциях
 
Забросил Квик, реализовал на двух терминалах МТ5

Вот временные задержки на ФОРТС

2022.04.11 12:04:02.442 Trades  'ххххх': buy limit 1 VTBR-6.22 at 2247
2022.04.11 12:04:02.447 Trades  'ххххх': accepted buy limit 1 VTBR-6.22 at 2247
2022.04.11 12:04:02.447 Trades  'ххххх': buy limit 1 VTBR-6.22 at 2247 placed for execution
2022.04.11 12:04:02.449 Trades  'ххххх': order #199939055 buy limit 1 / 1 VTBR-6.22 at 2247 done in 7.190 ms 2022.04.11 12:04:02.449 Trades  'ххххх': deal #111213284 buy 1 VTBR-6.22 at 2247 done (based on order #199939055)

7 мс

А вот на фондовой секции

2022.04.11 12:04:02.458 Trades  'ххххх': sell limit 10 VTBR at 0.022020
2022.04.11 12:04:02.464 Trades  'ххххх': accepted sell limit 10 VTBR at 0.022020
2022.04.11 12:04:02.465 Trades  'ххххх': sell limit 10 VTBR at 0.022020 placed for execution
2022.04.11 12:04:02.481 Trades  'ххххх': order #199939056 sell limit 10 / 10 VTBR at 0.022020 done in 23.922 ms
2022.04.11 12:04:02.484 Trades  'ххххх': deal #111213285 sell 8 VTBR at 0.022155 done (based on order #199939056) 2022.04.11 12:04:02.485 Trades  'ххххх': deal #111213286 sell 2 VTBR at 0.022150 done (based on order #199939056)

26 и 27 мс соответственно
Недостаточно лицензий!
 
Добрый день!

Что может означать такое сообщение?
Ключ сервера или пользователя не найден
 
По какой причине может появляться это сообщение?
9.3.1.11
 
Добрый день!
W10 Home 64
Через 3-4 дня работы Квик зависает
Открытие, реал
Как бороться?
Trans2Quik + DDE пропускает котировки
 
Цитата
nikolz написал:
Цитата
--------------------  
Поэтому еще раз советую сделать экспорт данных по DDE непосредственно в Excel и сравнить результаты.
Ок. Оставайтесь в своем приятном неведении.
Trans2Quik + DDE пропускает котировки
 
Цитата
nikolz написал:
Цитата
предположу что проблема в поделке на C#.  
Поэтому задайте вопрос автору этой поделки.
----------------------------------------------
Для чистоты эксперимента сделайте экспорт Вашей таблицы по DDE без костылей на C#
Какая разница С# или что-то другое?
Не все сделки передаются по DDE из таблицы "Текущие торги"
Что пришло по DDE, то и записалось.
А сегодня, по BR-1.22 направление сделки указано не верно (Таблица всех сделок)
Trans2Quik + DDE пропускает котировки
 
Цитата
Daniil Pozdnyakov написал:
Если да, то такое поведение является нормальным, так как данная таблица обновляется с определённым промежутком.
.
И что? Обновление таблицы должно передаваться по DDE, а сделок просто нет....
Обновился до 9.2.3.15 и получил TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND
 
Решено
Почему-то убралась галочка "Импорт внешних транзакций"
Обновился до 9.2.3.15 и получил TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND
 
Как бороться?

Везде есть проверки па путь и название DLL
До обновления самого терминала все прекрасно работало!
Trans2Quik + DDE пропускает котировки
 
Думаете, что за 6 лет что-то изменилось?
(Слева КВИК, справа МТ5)
Котировки с более точным временем
 
Добрый день!
Есть ли в КВИК таблица с ASK, BID и LAST со временем точнее секунды?
Развитие Trans2Quik
 
Забыл сказать...
Сейчас в МТ5 есть валютный рынок, срочный и фондовый.
Ведут работу над опционами, а ФИНАМ уже предоставляет для МТ5 торговлю
всем секциям (кроме опционов) в МТ5
Ждете когда ваш терминал вообще никому не нужен будет?
Развитие Trans2Quik
 
Цитата
Sergey Gorokhov написал:
Цитата
Юрий Z написал:
Данное API уже позволяет получать тики в обход qlua/qpile? Как знаю, оно уже давно значительно не обновлялось.

Нет не позволяет, но это же не делает его не "API для внешних программ"
если Вам нужен аналог qlua/qpile то для этого уже есть  FIX Client Connector
но он платный.
Что Вы (АРКА) все прикидываетесь не понимающими?
Абсолютно всем пользователям нужно простое решение для торговли.
Дали кастрированный trans2quik, сделайте его полным, чтобы можно было полноценно торговать из своего приложения!
Зачем пользователям изучать мертвые QPILE, QLUA?
Да и отладить серьезную программу вообще не возможно!
Никому не нужны эти танцы с бубнами.
Добавте функционал в trans2quik и сделайте платным (разумно)!!!
trans2quik - бесплатный
quikApi - платный!
Вот и простое решение всех проблем!
Delphi XE4 и trans2quik.dll
 
Только я использую асинхронные транзакции
Нужны тики FORTS для тестера стратегий
 
В МТ5 есть тики по фьючерсам полная история нужных Вам лет
помогите написать робота
 
Цитата
Эдуард написал:
помогите написать робота для QUIK который сможет выставлять одновременно ордера в обе стороны.   Также могу выкупить  советник  для мт4 :  Дубликатор сделок MT4-QUIK    
Вам нужно писать не здесь, а на сайт МТ5
Ваша задача решается за 10 минут, эксперт МТ4 подгружает nrans2quik.dll - вот Вам и копировщик.
Delphi XE4 и trans2quik.dll
 
Цитата
Павел написал:
Михаил, добрый день.

Попытался использовать Ваш unit tr2quik; (Delphi XE8, trans2quik 1.3)

T2QConnect успешно, а при вызове функции T2QSendSyncTrans получаю Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
Подскажите, с какими параметрами (и типами переменных) Вы вызываете функцию?

Может быть, есть идеи, от чего ошибка может возникать?

var
 ErrCode, pnRC: long;
 ErrMsg: LPSTR;
 ErrMsgSize, dwRMS: Dword;
 RM: PAnsiChar;
 pdwTI: PDWORD;
 pdON: UInt64;
 res: integer;
begin
 ErrCode:=0;
 ErrMsg:=nil;
 ErrMsgSize:=0;
 pnRC:=0;
 RM:=nil;
 dwRMS:=0;
 pdwTI:=nil;
 pdON:=0;
 res:=T2QSendSyncTrans(LPSTR(AnsiString('TRANS_ID=1;CLASSCODE=BQND;ACTION=Ввод заявки;Код торгового счета=L01-00000F00;К/П=Купля;Тип=Лимитированная;Режим=BQND;Инструмент=RU000A0ZYYN4;Цена=90.000000;Количество=20;Примечание=;Условие исполнения=Поставить в очередь;')), pnRC, pdwTI, pdON, RM, dwRMS, ErrCode, ErrMsg, ErrMsgSize);
//............................................
   else begin
     outStr:= 'ACCOUNT=' + ExpData.SpotAccaunt + '; CLIENT_CODE=' +
              ExpData.Client + '; TYPE=L; TRANS_ID=' + id +
              '; CLASSCODE=' + ExpData.SpotData.ClassCode + '; SECCODE=' +
              ExpData.SpotData.SecCode +
              '; ACTION=NEW_ORDER; OPERATION=B' + '; PRICE=' +
              FloatToStr(ExpData.SpotData.SellPrice + 10 * ExpData.SpotData.Step) +
              '; QUANTITY=' + FloatToStr(MustSpotVol) + ';';
   end;
 end;
 ErrCode:= 0;
 ErrSize:= 0;
 ErrStr:= nil;
 res:= T2QSendASyncTrans(LPSTR(AnsiString(outStr)), ErrCode, ErrStr, ErrSize);
 if(res <> TRANS2QUIK_SUCCESS) then
 begin
   FTransID:= 0;
   FTransBusy:= false;
 end else
 begin
   Dt:= now();
   FMemo.Lines.Add(DateToStr(Dt) + ' ' + FormatDateTime('hh:mm:ss.zzz', Now()) +
                   ' --> Ордер ' + ExpData.SpotData.SecCode + ' отправлен.');
 end;
Delphi XE4 и trans2quik.dll
 
Выкладываю еще раз

unit tr2quik;

interface

uses
 WinApi.Windows, System.Sysutils;

//var
//  DllName: string;// = 'TRANS2QUIK.DLL';

const
 WM_ON_TRADE = WM_USER + 179;

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

 ORDER_QUIKDATE          = 0;
 ORDER_QUIKTIME          = 1;
 ORDER_MICROSEC          = 2;
 ORDER_WITHDRAW_QUIKDATE = 3;
 ORDER_WITHDRAW_QUIKTIME = 4;
 ORDER_WITHDRAW_MICROSEC = 5;

 TRADE_QUIKDATE = 0;
 TRADE_QUIKTIME = 1;
 TRADE_MICROSEC = 2;

 REPL_NONE  = 0;
 REPL_TRANS = 1;
 REPL_ORDER = 2;
 REPL_TRADE = 3;

//--- DLL ERRORS ---
 TR2QUIK_TERMINAL_CLOSED      = 109;
 TR2QUIK_TRANSACTION_FAIL     = 233;
 TR2QUIK_NOT_SUBSCRIBE_ORDERS = $1000;
 TR2QUIK_NOT_SUBSCRIBE_TRADES = $1001;

//--------- Types ------
type
 intptr_t = NativeInt;
 Quantity = int64;
 EntityNumber = uint64;
 PEntityNumber = ^EntityNumber;
 OrderDescriptor = intptr_t;
 TradeDescriptor = intptr_t;
 TransReplyDescriptor = intptr_t;

//-------- Load library function -------
 function LibLoad(const aPath: string): THandle;

//--- CallBack procedures --------------
 procedure pfConnStatusCB(nConnectionEvent: long;
                          nExtendedErrorCode: long;
              lpcstrInfoMessage: LPCSTR); stdcall;

 procedure pfOrderStatusCB(nMode: long;
                           dwTransID: DWORD;
                           dNumber: EntityNumber;
                           ClassCode: LPCSTR;
                           SecCode: LPCSTR;
                           dPrice: double;
                           nBalance: Quantity;
                           dValue: double;
                           nIsSell: long;
                           nStatus: long;
                           ordDescr: OrderDescriptor); stdcall;

 procedure pfTradeStatusCB(nMode: long;
                           dNumber: EntityNumber;
                           dOrderNumber: EntityNumber;
                           ClassCode: LPCSTR;
                           SecCode: LPCSTR;
                           dPrice: double;
                           nQty: Quantity;
                           dValue: double;
                           nIsSell: long;
                           trDescriptor: TradeDescriptor); stdcall;

 procedure pfTransReplyCB(nTransactionResult: long;
                          nTransactionExtendedErrorCode: long;
                          nTransactionReplyCode: long;
                          dwTransId: DWord;
                          nOrderNum: EntityNumber;
                          lpcstrTransactionReplyMessage: LPCSTR;
                          trReplyDescr: TransReplyDescriptor); stdcall;

type
//----------------------- Prototype CallBack procedures ------------------
 TRANS2QUIK_CONNECTION_STATUS_CALLBACK = procedure(nConnectionEvent: long;
                                     nExtendedErrorCode: long;
                                       lpcstrInfoMessage: LPCSTR); stdcall;

 TRANS2QUIK_TRANSACTION_REPLY_CALLBACK = procedure(nTransactionResult: long;
                                     nTransactionExtendedErrorCode: long;
                                     nTransactionReplyCode: long;
                                     dwTransId: DWord;
                                       nOrderNum: EntityNumber;
                                     lpcstrTransactionReplyMessage: LPCSTR;
                                     trReplDesc: TransReplyDescriptor); stdcall;

 TRANS2QUIK_ORDER_STATUS_CALLBACK = procedure( nMode: long;
                                   dwTransID: DWORD;
                                 dNumber: EntityNumber;
                                 ClassCode: LPCSTR;
                                 SecCode: LPCSTR;
                                 dPrice: double;
                                 nBalance: Quantity;
                                 dValue: double;
                                 nIsSell: long;
                                 nStatus: long;
                                 orderDescriptor: OrderDescriptor); stdcall;

 TRANS2QUIK_TRADE_STATUS_CALLBACK = procedure( nMode: long;
                                 dNumber: EntityNumber;
                                 dOrderNumber: EntityNumber;
                                 ClassCode: LPCSTR;
                                 SecCode: LPCSTR;
                                 dPrice: double;
                                 nQty: Quantity;
                                 dValue: double;
                                 nIsSell: long;
                                 tradeDescriptor: TradeDescriptor); stdcall;
//------------ Functions -------------------
 TRANS2QUIK_SEND_SYNC_TRANSACTION = function(lpstTransactionString: LPSTR;
                                             var pnReplyCode: long;
                                             var pdwTransId: PDWORD;
                                             var pnOrderNum:EntityNumber;
                                             lpstrResultMessage: LPSTR;
                                             var dwResultMessageSize: DWORD;
                                             var pnExtendedErrorCode: long;
                                             lpstErrorMessage: LPSTR;
                                             var dwErrorMessageSize: DWORD): long; stdcall;
 TRANS2QUIK_SEND_ASYNC_TRANSACTION = function(lpstTransactionString: LPSTR;
                                              var pnExtendedErrorCode: long;
                                              lpstErrorMessage: LPSTR;
                                              var dwErrorMessageSize: DWORD): long; stdcall;
 TRANS2QUIK_CONNECT = function(lpstConnectionParamsString: LPSTR;
                               var pnExtendedErrorCode: long;
                               lpstrErrorMessage: LPSTR;
                               var dwErrorMessageSize: DWORD): long; stdcall;
 TRANS2QUIK_DISCONNECT = function(var pnExtendedErrorCode: long;
                                  lpstrErrorMessage: LPSTR;
                                  var dwErrorMessageSize: DWORD): long; stdcall;
 TRANS2QUIK_SET_CONNECTION_STATUS_CALLBACK = function(pfConnectionStatusCallback: TRANS2QUIK_CONNECTION_STATUS_CALLBACK;
                                                      var pnExtendedErrorCode: long;
                                                      lpstrErrorMessage: LPSTR;
                                                      var dwErrorMessageSize: DWORD): long; stdcall;
 TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK = function(pfTransactionReplyCallback: TRANS2QUIK_TRANSACTION_REPLY_CALLBACK;
                                                       var pnExtendedErrorCode: long;
                                                       lpstrErrorMessage: LPSTR;
                                                       var dwErrorMessageSize: DWORD): long; stdcall;
 TRANS2QUIK_IS_QUIK_CONNECTED = function(var pnExtendedErrorCode: long;
                                         lpstrErrorMessage: LPSTR;
                                         var dwErrorMessageSize: Dword): long; stdcall;
 TRANS2QUIK_IS_DLL_CONNECTED = function(var pnExtendedErrorCode: long;
                                        lpstrErrorMessage: LPSTR;
                                        var dwErrorMessageSize: DWORD): long; stdcall;
//---
 TRANS2QUIK_SUBSCRIBE_ORDERS = function(ClassCode: LPSTR; Seccodes: LPSTR): long; stdcall;
 TRANS2QUIK_UNSUBSCRIBE_ORDERS = function(): long; stdcall;
 TRANS2QUIK_SUBSCRIBE_TRADES = function(ClassCode: LPSTR; Seccodes: LPSTR): long; stdcall;
 TRANS2QUIK_UNSUBSCRIBE_TRADES = function(): long;  stdcall;
//---
 TRANS2QUIK_START_TRADES = function(pfnTradeStatusCallback: TRANS2QUIK_TRADE_STATUS_CALLBACK): long; stdcall;
 TRANS2QUIK_START_ORDERS = function(pfnOrderStatusCallback: TRANS2QUIK_ORDER_STATUS_CALLBACK): long; stdcall;
//---
 TRANS2QUIK_ORDER_QTY = function(orderDescriptor: OrderDescriptor): Quantity; stdcall;
 TRANS2QUIK_ORDER_DATE = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_TIME = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_ACTIVATION_TIME = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_WITHDRAW_TIME = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_EXPIRY = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_ACCRUED_INT = function(orderDescriptor: OrderDescriptor): Double; stdcall;
 TRANS2QUIK_ORDER_YIELD = function(orderDescriptor: OrderDescriptor): double; stdcall;
 TRANS2QUIK_ORDER_UID = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_VISIBLE_QTY = function(orderDescriptor: OrderDescriptor): Quantity; stdcall;
 TRANS2QUIK_ORDER_PERIOD = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_FILETIME = function(orderDescriptor: OrderDescriptor): FILETIME; stdcall;
 TRANS2QUIK_ORDER_DATE_TIME = function(orderDescriptor: OrderDescriptor; nTimeType: long): long; stdcall;
 TRANS2QUIK_ORDER_WITHDRAW_FILETIME = function(orderDescriptor: OrderDescriptor): FILETIME; stdcall;
 TRANS2QUIK_ORDER_VALUE_ENTRY_TYPE = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_EXTENDED_FLAGS = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_MIN_QTY = function(orderDescriptor: OrderDescriptor): Quantity; stdcall;
 TRANS2QUIK_ORDER_EXEC_TYPE = function(orderDescriptor: OrderDescriptor): long; stdcall;
 TRANS2QUIK_ORDER_AWG_PRICE = function(orderDescriptor: OrderDescriptor): double; stdcall;
 TRANS2QUIK_ORDER_USERID = function(orderDescriptor: OrderDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_ORDER_ACCOUNT = function(orderDescriptor: OrderDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_ORDER_BROKERREF = function(orderDescriptor: OrderDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_ORDER_CLIENT_CODE = function(orderDescriptor: OrderDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_ORDER_FIRMID = function(orderDescriptor: OrderDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_ORDER_REJECT_REASON = function(orderDescriptor: OrderDescriptor): LPTSTR; stdcall;
//---
 TRANS2QUIK_TRADE_DATE = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_SETTLE_DATE = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_TIME = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_IS_MARGINAL = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_ACCRUED_INT = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_YIELD = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_TS_COMMISSION = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_CLEARING_CENTER_COMMISSION = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_EXCHANGE_COMMISSION = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_TRADING_SYSTEM_COMMISSION = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_PRICE2 = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_REPO_RATE = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_REPO_VALUE = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_REPO2_VALUE = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_ACCRUED_INT2 = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_REPO_TERM = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_START_DISCOUNT = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_LOWER_DISCOUNT = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_UPPER_DISCOUNT = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_BLOCK_SECURITIES = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_PERIOD = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_KIND = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_FILETIME = function(tradeDescriptor: TradeDescriptor): FILETIME; stdcall;
 TRANS2QUIK_TRADE_DATE_TIME = function(tradeDescriptor: TradeDescriptor; nTimeType: long): long; stdcall;
 TRANS2QUIK_TRADE_BROKER_COMMISSION = function(tradeDescriptor: TradeDescriptor): double; stdcall;
 TRANS2QUIK_TRADE_TRANSID = function(tradeDescriptor: TradeDescriptor): long; stdcall;
 TRANS2QUIK_TRADE_CURRENCY = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_SETTLE_CURRENCY = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_SETTLE_CODE = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_ACCOUNT = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_BROKERREF = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_CLIENT_CODE = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_USERID = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_FIRMID = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_PARTNER_FIRMID = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_EXCHANGE_CODE = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRADE_STATION_ID = function(tradeDescriptor: TradeDescriptor): LPTSTR; stdcall;
//---
 TRANS2QUIK_TRANSACTION_REPLY_CLASS_CODE = function(TRD: TransReplyDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_SEC_CODE = function(TRD: TransReplyDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_PRICE = function(TRD: TransReplyDescriptor): double; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_QUANTITY = function(TRD: TransReplyDescriptor): Quantity; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_BALANCE = function(TRD: TransReplyDescriptor): Quantity; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_FIRMID = function(TRD: TransReplyDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_ACCOUNT = function(TRD: TransReplyDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_CLIENT_CODE = function(TRD: TransReplyDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_BROKERREF = function(TRD: TransReplyDescriptor): LPTSTR; stdcall;
 TRANS2QUIK_TRANSACTION_REPLY_EXCHANGE_CODE = function(TRD: TransReplyDescriptor): LPTSTR; stdcall;

var
 T2QSendSyncTrans: TRANS2QUIK_SEND_SYNC_TRANSACTION;
 T2QSendASyncTrans: TRANS2QUIK_SEND_ASYNC_TRANSACTION;
 T2QConnect: TRANS2QUIK_CONNECT;
 T2QDisconnect: TRANS2QUIK_DISCONNECT;
 T2QSetConnStatCB: TRANS2QUIK_SET_CONNECTION_STATUS_CALLBACK;
 T2QSetTransReplyCB: TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK;
 T2QIsQuikConnected: TRANS2QUIK_IS_QUIK_CONNECTED;
 T2QIsDllConnected: TRANS2QUIK_IS_DLL_CONNECTED;
 T2QSubscribeOrders: TRANS2QUIK_SUBSCRIBE_ORDERS;
 T2QUnSubscribeOrders: TRANS2QUIK_UNSUBSCRIBE_ORDERS;
 T2QStartOrders: TRANS2QUIK_START_ORDERS;
 T2QOrderQty: TRANS2QUIK_ORDER_QTY;
 T2QOrderDate: TRANS2QUIK_ORDER_DATE;
 T2QOrderTime: TRANS2QUIK_ORDER_TIME;
 T2QOrderActiveTime: TRANS2QUIK_ORDER_ACTIVATION_TIME;
 T2QOrderWithdrawTime: TRANS2QUIK_ORDER_WITHDRAW_TIME;
 T2QOrderExpiry: TRANS2QUIK_ORDER_EXPIRY;
 T2QOrderAccruedInt: TRANS2QUIK_ORDER_ACCRUED_INT;
 T2QOrderYield: TRANS2QUIK_ORDER_YIELD;
 T2QOrderUid: TRANS2QUIK_ORDER_UID;
 T2QOrderVisibleQty: TRANS2QUIK_ORDER_VISIBLE_QTY;
 T2QOrderPeriod: TRANS2QUIK_ORDER_PERIOD;
 T2QOrderFileTime: TRANS2QUIK_ORDER_FILETIME;
 T2QOrderDateTime: TRANS2QUIK_ORDER_DATE_TIME;
 T2QOrderWithdrawFileTime: TRANS2QUIK_ORDER_WITHDRAW_FILETIME;
 T2QOrderValueEntryType: TRANS2QUIK_ORDER_VALUE_ENTRY_TYPE;
 T2QOrderExtdFlags: TRANS2QUIK_ORDER_EXTENDED_FLAGS;
 T2QOrderMinQty: TRANS2QUIK_ORDER_MIN_QTY;
 T2QOrderExecType: TRANS2QUIK_ORDER_EXEC_TYPE;
 T2QOrderAwgPrice: TRANS2QUIK_ORDER_AWG_PRICE;
 T2QOrderUserId: TRANS2QUIK_ORDER_USERID;
 T2QOrderAccaunt: TRANS2QUIK_ORDER_ACCOUNT;
 T2QOrderBrokerRef: TRANS2QUIK_ORDER_BROKERREF;
 T2QOrderClientCode: TRANS2QUIK_ORDER_CLIENT_CODE;
 T2QOrderFirmId: TRANS2QUIK_ORDER_FIRMID;
 T2QOrderRejectReason: TRANS2QUIK_ORDER_REJECT_REASON;
 T2QSubscribeTrades: TRANS2QUIK_SUBSCRIBE_TRADES;
 T2QUnSubscribeTrades: TRANS2QUIK_UNSUBSCRIBE_TRADES;
 T2QStartTrades: TRANS2QUIK_START_TRADES;
 T2QTradeDate: TRANS2QUIK_TRADE_DATE;
 T2QTradeSettleDate: TRANS2QUIK_TRADE_SETTLE_DATE;
 T2QTradeTime: TRANS2QUIK_TRADE_TIME;
 T2QTradeIsMarginal: TRANS2QUIK_TRADE_IS_MARGINAL;
 T2QTradeAccruedInt: TRANS2QUIK_TRADE_ACCRUED_INT;
 T2QTradeYield: TRANS2QUIK_TRADE_YIELD;
 T2QTradeTSCommission: TRANS2QUIK_TRADE_TS_COMMISSION;
 T2QTradeClCenterCommission: TRANS2QUIK_TRADE_CLEARING_CENTER_COMMISSION;
 T2QTradeExcCommission: TRANS2QUIK_TRADE_EXCHANGE_COMMISSION;
 T2QTradeTrSysCommission: TRANS2QUIK_TRADE_TRADING_SYSTEM_COMMISSION;
 T2QTradePrice2: TRANS2QUIK_TRADE_PRICE2;
 T2QTradeRepoRate: TRANS2QUIK_TRADE_REPO_RATE;
 T2QTradeRepoValue: TRANS2QUIK_TRADE_REPO_VALUE;
 T2QTradeRepo2Value: TRANS2QUIK_TRADE_REPO2_VALUE;
 T2QTradeAccruedInt2: TRANS2QUIK_TRADE_ACCRUED_INT2;
 T2QTradeRepoTerm: TRANS2QUIK_TRADE_REPO_TERM;
 T2QTradeStDiscount: TRANS2QUIK_TRADE_START_DISCOUNT;
 T2QTradeLwDiscount: TRANS2QUIK_TRADE_LOWER_DISCOUNT;
 T2QTradeUpDiscount: TRANS2QUIK_TRADE_UPPER_DISCOUNT;
 T2QTradeBlSecur: TRANS2QUIK_TRADE_BLOCK_SECURITIES;
 T2QTradePeriod: TRANS2QUIK_TRADE_PERIOD;
 T2QTradeKind: TRANS2QUIK_TRADE_KIND;
 T2QTradeFileName: TRANS2QUIK_TRADE_FILETIME;
 T2QTradeDateTime: TRANS2QUIK_TRADE_DATE_TIME;
 T2QTradeBrCommission: TRANS2QUIK_TRADE_BROKER_COMMISSION;
 T2QTradeTransId: TRANS2QUIK_TRADE_TRANSID;
 T2QTradeCurrensy: TRANS2QUIK_TRADE_CURRENCY;
 T2QTradeSettlCurr: TRANS2QUIK_TRADE_SETTLE_CURRENCY;
 T2QTradeSettlCode: TRANS2QUIK_TRADE_SETTLE_CODE;
 T2QTradeAccount: TRANS2QUIK_TRADE_ACCOUNT;
 T2QTradeBrRef: TRANS2QUIK_TRADE_BROKERREF;
 T2QTradeClCode: TRANS2QUIK_TRADE_CLIENT_CODE;
 T2QTradeUserId: TRANS2QUIK_TRADE_USERID;
 T2QTradeFirmId: TRANS2QUIK_TRADE_FIRMID;
 T2QTradePartFirmId: TRANS2QUIK_TRADE_PARTNER_FIRMID;
 T2QTradeExcCode: TRANS2QUIK_TRADE_EXCHANGE_CODE;
 T2QTradeStationId: TRANS2QUIK_TRADE_STATION_ID;
 T2QTransReplyClassCode: TRANS2QUIK_TRANSACTION_REPLY_CLASS_CODE;
 T2QTransReplySecCode: TRANS2QUIK_TRANSACTION_REPLY_SEC_CODE;
 T2QTransReplyPrice: TRANS2QUIK_TRANSACTION_REPLY_PRICE;
 T2QTransReplyQty: TRANS2QUIK_TRANSACTION_REPLY_QUANTITY;
 T2QTransReplyBal: TRANS2QUIK_TRANSACTION_REPLY_BALANCE;
 T2QTransReplyFirmId: TRANS2QUIK_TRANSACTION_REPLY_FIRMID;
 T2QTransReplyAccount: TRANS2QUIK_TRANSACTION_REPLY_ACCOUNT;
 T2QTransReplyClCode: TRANS2QUIK_TRANSACTION_REPLY_CLIENT_CODE;
 T2QTransReplyBrRef: TRANS2QUIK_TRANSACTION_REPLY_BROKERREF;
 T2QTransReplyExcCode: TRANS2QUIK_TRANSACTION_REPLY_EXCHANGE_CODE;

implementation
 uses Main, CHILDWIN;

function LibLoad(const aPath: string): THandle;
begin
 Result:= LoadLibrary(PWideChar(IncludeTrailingPathDelimiter(aPath) + MainData.DllName));
 if(Result > 0) then
 begin
   @T2QSendSyncTrans := GetProcAddress(Result, PWideChar('TRANS2QUIK_SEND_SYNC_TRANSACTION'));
   if(addr(T2QSendSyncTrans) = nil) then
   begin
      Result:= 0;
      Exit;
   end;
   @T2QSendASyncTrans := GetProcAddress(Result, PWideChar('TRANS2QUIK_SEND_ASYNC_TRANSACTION'));
   if(addr(T2QSendASyncTrans) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QConnect:= GetProcAddress(Result, PWideChar('TRANS2QUIK_CONNECT'));
   if(addr(T2QConnect) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QDisconnect := GetProcAddress(Result, PWideChar('TRANS2QUIK_DISCONNECT'));
   if(addr(T2QDisconnect) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QSetConnStatCB := GetProcAddress(Result, PWideChar('TRANS2QUIK_SET_CONNECTION_STATUS_CALLBACK'));
   if(addr(T2QSetConnStatCB) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QSetTransReplyCB := GetProcAddress(Result, PWideChar('TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK'));
   if(addr(T2QSetTransReplyCB) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   //-----------
   //  ????????????????????????????
   //------------
   @T2QIsQuikConnected := GetProcAddress(Result, PWideChar('TRANS2QUIK_IS_QUIK_CONNECTED'));
   if(addr(T2QIsQuikConnected) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QIsDllConnected := GetProcAddress(Result, PWideChar('TRANS2QUIK_IS_DLL_CONNECTED'));
   if(addr(T2QIsDllConnected) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QSubscribeOrders := GetProcAddress(Result, PWideChar('TRANS2QUIK_SUBSCRIBE_ORDERS'));
   if(addr(T2QSubscribeOrders) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QUnSubscribeOrders := GetProcAddress(Result, PWideChar('TRANS2QUIK_UNSUBSCRIBE_ORDERS'));
   if(addr(T2QUnSubscribeOrders) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QStartOrders := GetProcAddress(Result, PWideChar('TRANS2QUIK_START_ORDERS'));
   if(addr(T2QStartOrders) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderQty := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_QTY'));
   if(addr(T2QOrderQty) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderDate := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_DATE'));
   if(addr(T2QOrderDate) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderTime := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_TIME'));
   if(addr(T2QOrderTime) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderActiveTime := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_ACTIVATION_TIME'));
   if(addr(T2QOrderActiveTime) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderWithdrawTime := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_WITHDRAW_TIME'));
   if(addr(T2QOrderWithdrawTime) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderExpiry := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_EXPIRY'));
   if(addr(T2QOrderExpiry) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderAccruedInt := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_ACCRUED_INT'));
   if(addr(T2QOrderAccruedInt) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderYield := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_YIELD'));
   if(addr(T2QOrderYield) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderUid := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_UID'));
   if(addr(T2QOrderUid) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderVisibleQty := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_VISIBLE_QTY'));
   if(addr(T2QOrderVisibleQty) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderPeriod := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_PERIOD'));
   if(addr(T2QOrderPeriod) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderFileTime := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_FILETIME'));
   if(addr(T2QOrderFileTime) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderDateTime := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_DATE_TIME'));
   if(addr(T2QOrderDateTime) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderWithdrawFileTime := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_WITHDRAW_FILETIME'));
   if(addr(T2QOrderWithdrawFileTime) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderValueEntryType := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_VALUE_ENTRY_TYPE'));
   if(addr(T2QOrderValueEntryType) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderExtdFlags := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_EXTENDED_FLAGS'));
   if(addr(T2QOrderExtdFlags) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderMinQty := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_MIN_QTY'));
   if(addr(T2QOrderMinQty) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderExecType := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_EXEC_TYPE'));
   if(addr(T2QOrderExecType) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderAwgPrice := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_AWG_PRICE'));
   if(addr(T2QOrderAwgPrice) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderUserId := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_USERID'));
   if(addr(T2QOrderUserId) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderAccaunt := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_ACCOUNT'));
   if(addr(T2QOrderAccaunt) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderBrokerRef := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_BROKERREF'));
   if(addr(T2QOrderBrokerRef) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderClientCode := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_CLIENT_CODE'));
   if(addr(T2QOrderClientCode) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderFirmId := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_FIRMID'));
   if(addr(T2QOrderFirmId) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QOrderRejectReason := GetProcAddress(Result, PWideChar('TRANS2QUIK_ORDER_REJECT_REASON'));
   if(addr(T2QOrderRejectReason) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QSubscribeTrades := GetProcAddress(Result, PWideChar('TRANS2QUIK_SUBSCRIBE_TRADES'));
   if(addr(T2QSubscribeTrades) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QUnSubscribeTrades := GetProcAddress(Result, PWideChar('TRANS2QUIK_UNSUBSCRIBE_TRADES'));
   if(addr(T2QUnSubscribeTrades) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QStartTrades := GetProcAddress(Result, PWideChar('TRANS2QUIK_START_TRADES'));
   if(addr(T2QStartTrades) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeDate := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_DATE'));
   if(addr(T2QTradeDate) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeSettleDate := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_SETTLE_DATE'));
   if(addr(T2QTradeSettleDate) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeTime := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_TIME'));
   if(addr(T2QTradeTime) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeIsMarginal := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_IS_MARGINAL'));
   if(addr(T2QTradeIsMarginal) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeAccruedInt := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_ACCRUED_INT'));
   if(addr(T2QTradeAccruedInt) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeYield := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_YIELD'));
   if(addr(T2QTradeYield) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeTSCommission := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_TS_COMMISSION'));
   if(addr(T2QTradeTSCommission) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeClCenterCommission := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_TS_COMMISSION'));
   if(addr(T2QTradeClCenterCommission) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeExcCommission := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_EXCHANGE_COMMISSION'));
   if(addr(T2QTradeExcCommission) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeTrSysCommission := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_TRADING_SYSTEM_COMMISSION'));
   if(addr(T2QTradeTrSysCommission) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradePrice2 := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_PRICE2'));
   if(addr(T2QTradePrice2) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeRepoRate := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_REPO_RATE'));
   if(addr(T2QTradeRepoRate) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeRepoValue := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_REPO_VALUE'));
   if(addr(T2QTradeRepoValue) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeRepo2Value := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_REPO2_VALUE'));
   if(addr(T2QTradeRepo2Value) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeAccruedInt2 := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_ACCRUED_INT2'));
   if(addr(T2QTradeAccruedInt2) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeRepoTerm := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_REPO_TERM'));
   if(addr(T2QTradeRepoTerm) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeStDiscount := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_START_DISCOUNT'));
   if(addr(T2QTradeStDiscount) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeLwDiscount := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_LOWER_DISCOUNT'));
   if(addr(T2QTradeLwDiscount) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeUpDiscount := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_UPPER_DISCOUNT'));
   if(addr(T2QTradeUpDiscount) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeBlSecur := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_UPPER_DISCOUNT'));
   if(addr(T2QTradeBlSecur) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradePeriod := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_PERIOD'));
   if(addr(T2QTradePeriod) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeKind := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_KIND'));
   if(addr(T2QTradeKind) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeFileName := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_FILETIME'));
   if(addr(T2QTradeFileName) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeDateTime := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_DATE_TIME'));
   if(addr(T2QTradeDateTime) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeBrCommission := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_BROKER_COMMISSION'));
   if(addr(T2QTradeBrCommission) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeTransId := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_TRANSID'));
   if(addr(T2QTradeTransId) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeCurrensy := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_CURRENCY'));
   if(addr(T2QTradeCurrensy) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeSettlCurr := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_SETTLE_CURRENCY'));
   if(addr(T2QTradeSettlCurr) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeSettlCode := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_SETTLE_CODE'));
   if(addr(T2QTradeSettlCode) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeAccount := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_ACCOUNT'));
   if(addr(T2QTradeAccount) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeBrRef := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_BROKERREF'));
   if(addr(T2QTradeBrRef) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeClCode := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_CLIENT_CODE'));
   if(addr(T2QTradeClCode) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeUserId := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_USERID'));
   if(addr(T2QTradeUserId) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeFirmId := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_FIRMID'));
   if(addr(T2QTradeFirmId) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradePartFirmId := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_PARTNER_FIRMID'));
   if(addr(T2QTradePartFirmId) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeExcCode := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_EXCHANGE_CODE'));
   if(addr(T2QTradeExcCode) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTradeStationId := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRADE_STATION_ID'));
   if(addr(T2QTradeStationId) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyClassCode := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_CLASS_CODE'));
   if(addr(T2QTransReplyClassCode) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplySecCode := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_SEC_CODE'));
   if(addr(T2QTransReplySecCode) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyPrice := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_PRICE'));
   if(addr(T2QTransReplyPrice) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyQty := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_QUANTITY'));
   if(addr(T2QTransReplyQty) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyBal := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_BALANCE'));
   if(addr(T2QTransReplyBal) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyFirmId := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_FIRMID'));
   if(addr(T2QTransReplyFirmId) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyAccount := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_ACCOUNT'));
   if(addr(T2QTransReplyAccount) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyClCode := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_CLIENT_CODE'));
   if(addr(T2QTransReplyClCode) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyBrRef := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_BROKERREF'));
   if(addr(T2QTransReplyBrRef) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
   @T2QTransReplyExcCode := GetProcAddress(Result, PWideChar('TRANS2QUIK_TRANSACTION_REPLY_EXCHANGE_CODE'));
   if(addr(T2QTransReplyExcCode) = nil) then
   begin
     Result:= 0;
     Exit;
   end;
 end;
end;

//--- Connection status Call Back ---------
procedure pfConnStatusCB;
begin
 //
end;

//--- Transaction callback -----
procedure pfTransReplyCB;
begin
 //
end;

//--- Order status callback -----
procedure pfOrderStatusCB;
begin
//
end;

//--- Trade status callback -----
procedure pfTradeStatusCB;
begin
 //not used
end;

end.
Delphi XE4 и trans2quik.dll
 
Цитата
Roman написал:
Пробовал не помогло.

Нашел в чем дело , оказалось если вместо:

@T2QSendSyncTrans := GetProcAddress(Result, PWideChar( 'TRANS2QUIK_SEND_SYNC_TRANSACTION '));

написать

@T2QSendSyncTrans := GetProcAddress(Result, PWideChar(' _TRANS2QUIK_SEND_SYNC_TRANSACTION@36 '));

то все работает
Я выкладывал полностью рабочий модуль, переписанный из исходника разработчиков, и у меня все прекрасно работает.
Это Вы где-то намудрили
4.24 Транзакции. Флаги транзакции., Что это такое?
 
Цитата
XXM написал:
В Руководстве пользователя "Интерпретатор языка Lua" есть даже глава 5. Описание битовых флагов
Но по флагам транзакций ни в этой главе, ни в других местах не нашел информации.
Гадать как-то дискомфортно, прошу описания.
Я не знаю про пункт 4,24
Но описание битовых флагов в п,5 относится к таблицам, а не к транзакциям.
getMoneyEx
 
Цитата
Старатель написал:
Цитата
Михаил Филимонов написал:
"Доступно"
Как она называется (см. картинку)?
currentbal - locked
Спасибо
Я думал, что ко всем полям есть доступ...
getMoneyEx
 
Добрый день!
Функция getMoneyEx() возвращает таблицу "Позиции по деньгам"
В справке нет названия колонки "Доступно"
Как она называется (см. картинку)?
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
Anton написал:
Цитата
Михаил Филимонов написал:
Учтя Вашу критику
Но все равно по-своему ) В общем, если устраивает, то и хорошо.

В этом варианте в мейне ничего не происходит, можно слип увеличить до 1000.

Еще раз спасибо, Антон.
Пусть мое решение не очень элегантное, но будет работать, как Вы хотели :)
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
Anton написал:
Цитата
Михаил Филимонов написал:
"мгновенно"
Он и будет получать настолько же "мгновенно", как и в случае бродкаста, не заваливая всю систему кучами бесполезных сообщений. Перечитайте еще раз, "раз в секунду" это процесс обнаружения клиента, как только он обнаружен, сообщения посылаются ему немедленно из колбеков. Если думаете, что пройтись по  своему  списку окон медленнее, чем винда пройдется по списку  всех  окон, то это заблуждение.
Учтя Вашу критику, переделал LUA скрипт (проверил - все работает)
Спасибо!
//=========================================================
w32 = require("w32")

is_run = false
HWND_BROADCAST = 0xFFFF
A_double = 0.0
WParam = 2
lpParam = 1

WM_EBS_MONEY = w32.RegisterWindowMessage("WM_EBS_MONEY")

if WM_EBS_MONEY >= 0xC000 then
 is_run = true
else
 message("Message not registered!")
end
--начальная отсылка денежных средств
 a_table = getPortfolioInfoEx("MCXXXXXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)

function OnStop()
 is_run = false
end
-- Отсылка по изменению средств
function OnMoneyLimit(m_limit)
 a_table = getPortfolioInfoEx("MCXXXXXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)
end

function OnDepoLimit(d_limit)
 a_table = getPortfolioInfoEx("MCXXXXXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)
end

function OnFuturesClientHolding(f_holding)
 a_table = getPortfolioInfoEx("MCXXXXXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)  
-- message("Working!")
end


function OnFuturesLimitChange(f_change)
 a_table = getPortfolioInfoEx("MCXXXXXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)
end

function main()
while is_run do
  sleep(1)
 end
end
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
Anton написал:
Спасибо, Антон!
Только нельзя использовать SendMessage(), т.к она ожидает ответа.
Странно, что PeekMessage не будет работать,
PostMessage() работатет исправно.
И еще...
Думается, что так как я написал в разы проще будет... :)
Эвента на изменение таблицы "Клиентский портфель"
 
Можете "набросать" схему как организовать список хендлов и запись в этот список так, как Вы понимаете этот механизм?
Эвента на изменение таблицы "Клиентский портфель"
 
Посмотрел список функций w32 и эти функции там есть.
Беда в том, что я с LUA познакомился 2 дня назад...
Эвента на изменение таблицы "Клиентский портфель"
 
GetMessage или PeekMessage ?
Эвента на изменение таблицы "Клиентский портфель"
 
делать
Эвента на изменение таблицы "Клиентский портфель"
 
И желать список рассылки?
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
Anton написал:
Цитата
Михаил Филимонов написал:
"мгновенно"
Он и будет получать настолько же "мгновенно", как и в случае бродкаста, не заваливая всю систему кучами бесполезных сообщений. Перечитайте еще раз, "раз в секунду" это процесс обнаружения клиента, как только он обнаружен, сообщения посылаются ему немедленно из колбеков. Если думаете, что пройтись по  своему  списку окон медленнее, чем винда пройдется по списку  всех  окон, то это заблуждение.
Антон!
То, что Вы предлагаете - очень здорово, но как мой скрипт (LUA) будет принимать сообщения от клиентов?
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
Anton написал:
Цитата
Михаил Филимонов написал:
запускать в Квике 42
Ну это как-то в лоб решение. Клиенты могут раз в секунду, скажем, рассылать бродкаст WM_APP_QUIK_CLIENT_CONNECT (название условное) с хэндлом своего окна в wparam, скрипт (один) в квике их слушает, сохраняет хэндл клиента в список подписантов и отвечает WM_APP_QUIK_SERVER_CONNECT со своим хэндлом. И все, клиент прекращает спамить, а сервер в колбеках шлет PostMessage по списку. Ну то есть стырить идею в том же дде, чуть поправив.
X-mmm.
Вы сами-то торгуете несколькими роботами?
Сделки от разных роботов совершаются достаточно часто, а средства для всех роботов одни.
Перед сделкой роботы проверяют достаточность средств на счете для совершения оных.
Поэтому каждый робот должен "мгновенно" получать инфу о состоянии счете (наличие свободных средств)
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
Владимир написал:
СОРОК ДВА РОБОТА?! Куда уж прожорливее - хоть с какой стороны смотреть. У меня как-то и один скрипт справляется. Думаю, как и у всех нормальных людей. Ресурсов практически не жрёт - ему же не надо рассылать данные по 42 направлениям. ::  
"Нормальных" людей?
Вы себя к ним опрометчиво причислили.
Кстати, у меня на ФОРТС,  работают 2 терминала МТ5, в сумме 86 роботов, и ничего не виснет...
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
Anton написал:
Очень прожорливо из колбеков бродкасты отправлять. Оно ж буквально все окна в системе обходит в каждом колбеке.
Прожорливо, если используется 1 робот. Я использую 42 робота.
Гораздо прожорливее будет запускать в Квике 42 скрипта да еще заморачиваться, чтобы указать handle принимающего приложения (как это реализовано
в экспорте в МТ5, но там все просто)
Потом PostMessage() тем и хорош, что он не ждет ответа - отослал и "забыл" о ней, а все 42 робота получат данные.
"Прожорливо", так это с какой стороны смотреть :)  
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата

Что такое минимальные задержки, это каждый понимал по-своему ) ну, ежли задача стоит показать, как "квик тормозит в сравнении с метатрейдером", то верной дорогой пойдено.
При чем тут задача показать как "квик тормозит в сравнении с метатрейдером"?

Я реально торгую на Е-Б-С счете через квик,
Выводил данные через DDE в свое приложение (работало очень медленно),
поэтому я и решил брать данные из МТ5 Стало гораздо быстрее...
Эвента на изменение таблицы "Клиентский портфель"
 
Вообщем остановился на таком варианте

w32 = require("w32")

is_run = false
HWND_BROADCAST = 0xFFFF
A_double = 0.0
WParam = 2
lpParam = 1

WM_EBS_MONEY = w32.RegisterWindowMessage("WM_EBS_MONEY")

if WM_EBS_MONEY >= 0xC000 then
 is_run = true
else
 message("Message not registered!")
end

 a_table = getPortfolioInfoEx("MCXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)

function OnStop()
 is_run = false
end

function OnMoneyLimit(m_limit)
 a_table = getPortfolioInfoEx("MCXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)
end

function OnDepoLimit(d_limit)
 a_table = getPortfolioInfoEx("MCXXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)
end

function OnFuturesClientHolding(f_holding)
 a_table = getPortfolioInfoEx("MCXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)  
-- message("Working!")
end


function OnFuturesLimitChange(f_change)
 a_table = getPortfolioInfoEx("MCXXXXXX", "XXXXX", 2)  
 A_double = a_table.limit_open_pos
 lpParam = math.floor(A_double * 100)
 w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)
end

function main()
while is_run do
  a_table = getPortfolioInfoEx("MCXXXXXX", "XXXXX", 2)  
  A_double = a_table.limit_open_pos
  lpParam = math.floor(A_double * 100)
  w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam)
 
   sleep(100)
 
 end
end



Установка ордера фьючерса отрабатывается (свободные средства изменяются), а акции проверю завтра, сегодня на счете мало средств (а это не Junior, а реал)
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
swerg написал:
Текст сообщения*





Загрузить файл или картинкуПеретащить с помощью Drag'n'drop




Перетащите файлы





Ей-богу виснет
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
BlaZed написал:
Цитата
Михаил Филимонов написал:
I-7 6850К завис после запуска скрипта  
В общем, значение слипа надо ставить минимум 1, тогда ничего не виснет.
А выбирать адекватное значение уже в зависимости от требований конкретно вашей стратегии.
Понятно, спасибо
Поставил 100
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
BlaZed написал:
Цитата
swerg написал:
 
Цитата
BlaZed  написал:
Другими словами, конструкция без слипа, типа такой
 
Код
         function     main ()
  a   =      0   
  is_run    =       true   
     while    is_run    do   
    a   =   a   +      1   
     end   
   end   
      
  может легко повешать квик.
 
Нет.
Если процессор одноядерный - да, это будет заметно в скорости общей работы.
Если процессор многоядерный (а это нынче стандарт де-факто) - то никто ничего даже не заметит, кроме термометра на процессоре.
Попробуйте, запустите
Ryzen 5 3500x на 6 ядер, квик скопытился после запуска
I-7 6850К завис после запуска скрипта  
Эвента на изменение таблицы "Клиентский портфель"
 
А что на глаз не видно?
МТ5 vs Квик
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
swerg написал:
Чем вы измеряли высокую скорость и чему она равна?
Скундомером в руках :)
Эвента на изменение таблицы "Клиентский портфель"
 
Высокоскоростная передача данных из МТ5 в свое приложение
Экспорт из МТ5
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
swerg написал:
Цитата
BlaZed написал:
Другими словами, конструкция без слипа, типа такой
 
Код
      function    main ()
  a  =    0  
  is_run   =     true  
    while   is_run   do  
    a  =  a  +    1  
    end  
  end  
    
 может легко повешать квик.

Нет.
Если процессор одноядерный - да, это будет заметно в скорости общей работы.
Если процессор многоядерный (а это нынче стандарт де-факто) - то никто ничего даже не заметит, кроме термометра на процессоре.
Так сколько ставить, чтобы бедолаге было комфортно?
Эвента на изменение таблицы "Клиентский портфель"
 
Смотрим как Квик внутри себя обновляет таблицы
Обновление таблицы "Клиентский портфель"
Эвента на изменение таблицы "Клиентский портфель"
 
и последний вопрос.
Я никогда не использую функцию sleep, но в скриптах LUA, как я понял, это необходимость

В конструкции

function OnStop()
 is_run = false
end

function main()
while is_run do
  sleep(??????)
 end
end

Какое значение в sleep(??) лучше ставить, чтобы скрипт работал как можно быстрее
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
Владимир написал:
Nikolay, Да что бы то ни было! Если чел торгует сам и не знает, что у него творится в портеле - это уже к ветеринару!
Ты уже был там, пенек?
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
swerg написал:
Цитата
Михаил Филимонов написал:
Это колонка в таблице "Клиентский портфель"

С точки зрения программирования на Lua и, тем более, событий, надо опираться на другие, базовые таблицы. Из информации которых формируются уже "Клиентский портфель" и "Таблица состояния счета".
 Для срочного рынка:
 Ограничения по клиентским счетам  --> OnFuturesLimitChange
 Позиции по клиентским счетам  --> OnFuturesClientHolding
   Для рынка ценных бумаг и валютного рынка:
 Таблица лимитов по денежным средствам   --> OnMoneyLimit
 Таблица лимитов по бумагам  --> OnDepoLimit
Спасибо, понятно
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
swerg написал:
Цитата
Михаил Филимонов написал:
Да интересует изменение в таблице "ПланЧистПос", но не одна из call back функций (

Нет такой таблицы "ПланЧистПос"
Это колонка в таблице "Клиентский портфель"
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
swerg написал:
Цитата
Михаил Филимонов написал:
Не работает

Всем пофик.

Вот честное слово хочется именно так вам кратко отвечать на ваши краткие и и очень небрежно заданные вопросы.
Не вызывается OnFuturesClientHolding при изменении Таблицы "Клиентский портфель"
Эвента на изменение таблицы "Клиентский портфель"
 
Цитата
swerg написал:
Что такое "Един. Бр. Счет" ?
Единый Брокерский Счет (брокер Открытие)
Это счет, на котором можно одновременно торговать фьючерсами и акциями, при этом нет раздела средств по секциям
средства для фьючерсов и акций  - едины.
Страницы: 1 2 3 4 5 След.
Наверх