Михаил Филимонов (Все сообщения пользователя)
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Sergey Gorokhov написал: Цитата Юрий Z написал: Данное API уже позволяет получать тики в обход qlua/qpile? Как знаю, оно уже давно значительно не обновлялось.
Нет не позволяет, но это же не делает его не "API для внешних программ" если Вам нужен аналог qlua/qpile то для этого уже есть FIX Client Connector но он платный.
Что Вы (АРКА) все прикидываетесь не понимающими?
Абсолютно всем пользователям нужно простое решение для торговли. Дали
кастрированный trans2quik, сделайте его полным, чтобы можно было полноценно торговать из своего приложения!
Зачем пользователям изучать мертвые QPILE, QLUA?
Да и отладить серьезную программу вообще не возможно!
Никому не нужны эти танцы с бубнами.
Добавте функционал в trans2quik и сделайте платным (разумно)!!!
trans2quik - бесплатный
quikApi - платный!
Вот и простое решение всех проблем!
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Только я использую асинхронные транзакции
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
В МТ5 есть тики по фьючерсам полная история нужных Вам лет
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Эдуард написал: помогите написать робота для QUIK который сможет выставлять одновременно ордера в обе стороны. Также могу выкупить советник для мт4 : Дубликатор сделок MT4-QUIK
Вам нужно писать не здесь, а на сайт МТ5
Ваша задача решается за 10 минут, эксперт МТ4 подгружает nrans2quik.dll - вот Вам и копировщик.
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Павел написал: Михаил, добрый день. Попытался использовать Ваш 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;
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Выкладываю еще раз 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.
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Roman написал: Пробовал не помогло. Нашел в чем дело , оказалось если вместо: @T2QSendSyncTrans := GetProcAddress(Result, PWideChar( 'TRANS2QUIK_SEND_SYNC_TRANSACTION ')); написать @T2QSendSyncTrans := GetProcAddress(Result, PWideChar(' _TRANS2QUIK_SEND_SYNC_TRANSACTION@36 ')); то все работает
Я выкладывал полностью рабочий модуль, переписанный из исходника разработчиков, и у меня все прекрасно работает.
Это Вы где-то намудрили
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата XXM написал: В Руководстве пользователя "Интерпретатор языка Lua" есть даже глава 5. Описание битовых флагов Но по флагам транзакций ни в этой главе, ни в других местах не нашел информации. Гадать как-то дискомфортно, прошу описания.
Я не знаю про пункт 4,24
Но описание битовых флагов в п,5 относится к таблицам, а не к транзакциям.
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Спасибо
Я думал, что ко всем полям есть доступ...
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Добрый день! Функция getMoneyEx() возвращает таблицу "Позиции по деньгам" В справке нет названия колонки "Доступно" Как она называется (см. картинку)?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Anton написал: Но все равно по-своему ) В общем, если устраивает, то и хорошо. В этом варианте в мейне ничего не происходит, можно слип увеличить до 1000.
Еще раз спасибо, Антон.
Пусть мое решение не очень элегантное, но будет работать, как Вы хотели :)
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата 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
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Спасибо, Антон!
Только нельзя использовать SendMessage(), т.к она ожидает ответа.
Странно, что PeekMessage не будет работать,
PostMessage() работатет исправно.
И еще...
Думается, что так как я написал в разы проще будет... :)
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Можете "набросать" схему как организовать список хендлов и запись в этот список так, как Вы понимаете этот механизм?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Посмотрел список функций w32 и эти функции там есть. Беда в том, что я с LUA познакомился 2 дня назад...
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
GetMessage или PeekMessage ?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
И желать список рассылки?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Anton написал: Он и будет получать настолько же "мгновенно", как и в случае бродкаста, не заваливая всю систему кучами бесполезных сообщений. Перечитайте еще раз, "раз в секунду" это процесс обнаружения клиента, как только он обнаружен, сообщения посылаются ему немедленно из колбеков. Если думаете, что пройтись по своему списку окон медленнее, чем винда пройдется по списку всех окон, то это заблуждение.
Антон!
То, что Вы предлагаете - очень здорово, но как мой скрипт (LUA) будет принимать сообщения от клиентов?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Anton написал: Ну это как-то в лоб решение. Клиенты могут раз в секунду, скажем, рассылать бродкаст WM_APP_QUIK_CLIENT_CONNECT (название условное) с хэндлом своего окна в wparam, скрипт (один) в квике их слушает, сохраняет хэндл клиента в список подписантов и отвечает WM_APP_QUIK_SERVER_CONNECT со своим хэндлом. И все, клиент прекращает спамить, а сервер в колбеках шлет PostMessage по списку. Ну то есть стырить идею в том же дде, чуть поправив.
X-mmm.
Вы сами-то торгуете несколькими роботами?
Сделки от разных роботов совершаются достаточно часто, а
средства для
всех роботов одни.
Перед сделкой роботы
проверяют достаточность средств на счете для совершения оных.
Поэтому каждый робот должен "мгновенно" получать инфу о состоянии счете (наличие свободных средств)
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Владимир написал: СОРОК ДВА РОБОТА?! Куда уж прожорливее - хоть с какой стороны смотреть. У меня как-то и один скрипт справляется. Думаю, как и у всех нормальных людей. Ресурсов практически не жрёт - ему же не надо рассылать данные по 42 направлениям. ::
"Нормальных" людей?
Вы себя к ним
опрометчиво причислили.
Кстати, у меня на ФОРТС, работают 2 терминала МТ5, в сумме 86 роботов, и ничего не виснет...
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Anton написал: Очень прожорливо из колбеков бродкасты отправлять. Оно ж буквально все окна в системе обходит в каждом колбеке.
Прожорливо, если используется 1 робот. Я использую 42 робота.
Гораздо прожорливее будет запускать в Квике 42 скрипта да еще заморачиваться, чтобы указать handle принимающего приложения (как это реализовано
в экспорте в МТ5,
но там все просто )
Потом PostMessage() тем и хорош, что он не ждет ответа - отослал и "забыл" о ней, а все 42 робота получат данные.
"Прожорливо", так это с какой стороны смотреть :)
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Что такое минимальные задержки, это каждый понимал по-своему ) ну, ежли задача стоит показать, как "квик тормозит в сравнении с метатрейдером", то верной дорогой пойдено.
При чем тут задача показать как "квик тормозит в сравнении с метатрейдером"?
Я реально торгую на Е-Б-С счете через квик,
Выводил данные через DDE в свое приложение (работало очень медленно),
поэтому я и решил брать данные из МТ5 Стало гораздо быстрее...
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Вообщем остановился на таком варианте 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, а реал)
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: Текст сообщения* Загрузить файл или картинкуПеретащить с помощью Drag'n'drop Перетащите файлы
Ей-богу виснет
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата BlaZed написал: В общем, значение слипа надо ставить минимум 1, тогда ничего не виснет. А выбирать адекватное значение уже в зависимости от требований конкретно вашей стратегии.
Понятно, спасибо
Поставил 100
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата 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К завис после запуска скрипта
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
А что на глаз не видно?
МТ5 vs Квик
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: Чем вы измеряли высокую скорость и чему она равна?
Скундомером в руках :)
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Высокоскоростная передача данных из МТ5 в свое приложение
Экспорт из МТ5
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: Цитата BlaZed написал: Другими словами, конструкция без слипа, типа такой Код function main ()
a = 0
is_run = true
while is_run do
a = a + 1
end
end
может легко повешать квик.
Нет. Если процессор одноядерный - да, это будет заметно в скорости общей работы. Если процессор многоядерный (а это нынче стандарт де-факто) - то никто ничего даже не заметит, кроме термометра на процессоре.
Так сколько ставить, чтобы бедолаге было комфортно?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
и последний вопрос. Я никогда не использую функцию sleep, но в скриптах LUA, как я понял, это необходимость В конструкции function OnStop() is_run = false end function main() while is_run do sleep(??????) end end Какое значение в sleep(??) лучше ставить, чтобы скрипт работал как можно быстрее
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Владимир написал:Nikolay , Да что бы то ни было! Если чел торгует сам и не знает, что у него творится в портеле - это уже к ветеринару!
Ты уже был там, пенек?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: С точки зрения программирования на Lua и, тем более, событий, надо опираться на другие, базовые таблицы. Из информации которых формируются уже "Клиентский портфель" и "Таблица состояния счета". Для срочного рынка: Ограничения по клиентским счетам --> OnFuturesLimitChange Позиции по клиентским счетам --> OnFuturesClientHolding Для рынка ценных бумаг и валютного рынка: Таблица лимитов по денежным средствам --> OnMoneyLimit Таблица лимитов по бумагам --> OnDepoLimit
Спасибо, понятно
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: Цитата Михаил Филимонов написал: Да интересует изменение в таблице "ПланЧистПос", но не одна из call back функций (
Нет такой таблицы "ПланЧистПос"
Это колонка в таблице "Клиентский портфель"
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: Всем пофик. Вот честное слово хочется именно так вам кратко отвечать на ваши краткие и и очень небрежно заданные вопросы.
Не вызывается OnFuturesClientHolding при изменении Таблицы "Клиентский портфель"
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: Что такое "Един. Бр. Счет" ?
Единый Брокерский Счет (брокер Открытие)
Это счет, на котором можно одновременно торговать фьючерсами и акциями, при этом нет раздела средств по секциям
средства для фьючерсов и акций - едины.
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: Вот же дался вам это клиентский портфель. Не надо в него смотреть с точки зрения программирования на Lua. Не надо. Попробуйте OnFuturesClientHolding
Я же уже писал, что торгую на Един. Бр. Счете, а изменение средств (свободных) для этого типа счета видны только в таблице "Состояние счета" (не доступно для LUA) и "Клиентский портфель"
OnFuturesClientHolding щас попробую...
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Неужели нельзя сделать редактирование сообщений?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
OnAccountPosition, OnDepoLimit OnMoneyLimit Не работают Регулярная проверка, это тоже самое, что function main() while is_run do a_table = getPortfolioInfoEx("ххххх", "ххххх", 2) A_double = a_table.limit_open_pos lpParam = math.floor(A_double * 100) w32.PostMessage(HWND_BROADCAST, WM_EBS_MONEY, WParam, lpParam) sleep(10) end end
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Nikolay написал: Если говорить о доступных call back, то их список описан в документации. Не очень ясно, что требуется. Но можно предположить, что если речь про денежные средства, а не позиции, может подойти: OnMoneyLimit. Но можете и сами организовать вызов некой функции при изменении данных портфеля, сделав регулярную проверку оного.
Да интересует изменение в таблице "ПланЧистПос", но не одна из call back функций (
) не работает
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Добрый день! Как-нибудь можно реализовать такое?
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: Цитата Не обращайте внимание, это местный клоун.
Вы слишком мягко отозвались об этом полном придурке.
Конкретно больной на всю голову!
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата swerg написал: А можно поинтересоваться: почему бы в МТ5 не торговать тогда? Какие плюсы у этого франкинштейна?
Дело в том, что торговать на Едином Брокерском Счете можно только в Квик.
Я написал свою программу, которая получала данные из Квик по DDE, а приказы отправляла через trans2quik.dll,
Данные по DDE передаются ОЧЕНЬ медленно, да и МТ5 получает маркет дата в разы быстрее, поэтому я соорудил
очень быструю передачу данных из МТ5 в свое приложение.
Не хватало только свободных средств на счете в Квик
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Всем спасибо! Все же удалось получать данные из МТ5 + (Деньги Ед. Бр. Сч. из Квик) и торговать в квик из своего приложения.
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
Цитата Nikolay написал: getItem позволяет получать данные только из определенных таблиц и формат ее вызова не такой. http://luaq.ru/getItem.html Чтобы получить данные по деньгам, позициям надо обратиться к определенной таблице и просканировать строки, либо использовать специализированные функции для получения денежных лимитов, позиций и т.д., допустим getMoneyEx или getPortfolioInfoEx.
Спасибо, getPortfolioInfoEx позволяет получить данные из таблицы "Клиентский портфель"
Пользователь
Сообщений: 364
Регистрация: 29.07.2015
А к таблице "Клиентский портфель" есть доступ?