Тема по MetaTrader dll уже наверняка не раз поднималась, но всё таки…
Есть функция MtConnect которая требует переданного параметра < server > в виде массива символов.
------------------------------------------------------------------------------------
‘ вот её объявление взятое из дока по MetaTrader application program interface.
‘int MtConnect( const int handle, const char *server, const int port );
‘Параметры:
‘handle – хэндл сокета;
‘server – IP-address или domain name;
‘port – номер порта.
‘Возвращает код возврата.
------------------------------------------------------------------------------------
Пробовал и так и эдак, и с маршализацией и без.
Вот в таком виде вроде как работает, но через раз (и выдает код ошибки типа <прочая неизвестная>)
Как всё же ПРАВИЛЬНО его передать?
И ещё вопрос: как передать ссылку на структуру если требуется её адрес?
Public HndlSocket As Integer
Private Declare Function MtGetVersion Lib "mtapi.dll" () As Integer
Private Declare Function MtSetWorkingDirectory Lib "mtapi.dll" (ByVal sd As String) As Integer
Private Declare Function MtCreate Lib "mtapi.dll" () As Integer
Private Declare Function MtDelete Lib "mtapi.dll" (ByVal handle As Integer) As Integer
Private Declare Function MtConnect Lib "mtapi.dll" (ByVal handle As Integer, <MarshalAs(UnmanagedType.LPStr)> ByVal server As [String], ByVal Port As Integer) As Integer
Private Declare Function MtDisconnect Lib "mtapi.dll" (ByVal handle As Integer) As Integer
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)> Public Structure BriefUserInfo 'структура с информацией о клиенте.
Public login As Integer 'логин
Public isdemo As Integer 'демо?
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=64)> Public name As String 'имя
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=64)> Public company As String 'компания
Public balance As Double 'баланс
Public equity As Double 'equity
Public credit As Double 'кредит
Public margin As Double 'маржа
Public freemargin As Double 'свободная маржа
Public profit As Double 'прибыль
Public marginmode As Integer 'none
Public margincall As Integer 'уровень маржинкола
Public margintype As Char 'тип маржинкола 0-%,1-$
Public allow_flags As Integer 'флаги разрешений
Public leverage As Integer 'none
End Structure
'коды ошибок
Public Const RET_OK As Short = 0 ' все ок
Public Const RET_OK_NONE As Short = 1 ' все ок
Public Const RET_ERROR As Short = 2 ' просто неопознанные ошибки
Public Const RET_INVALID_DATA As Short = 3 ' неверные данные
Public Const RET_TECH_PROBLEM As Short = 4 ' технические проблемы на сервере
Public Const RET_ACCOUNT_DISABLED As Short = 5 ' счет заблокирован
Public Const RET_BAD_ACCOUNT_INFO As Short = 6
Public Const RET_TIMEOUT As Short = 7 ' истек срок ожидания совершения сделки
Public Const RET_BAD_PRICES As Short = 8 ' неверные данные о ценах в ордере
Public Const RET_MARKET_CLOSED As Short = 9 ' рынок закрыт
Public Const RET_TRADE_DISABLE As Short = 10 ' торговля запрещена
Public Const RET_NO_MONEY As Short = 11 ' недостаточно денег для совершения операции
Public Const RET_PRICE_CHANGED As Short = 12 ' цены изменились
Public Const RET_OFFQUOTES As Short = 13 ' нет цен
Public Const RET_BROKER_BUSY As Short = 14 ' брокер занят
Public Const RET_OLD_VERSION As Short = 15 ' старая версия клиентского терминала
Public Const RET_MULTI_CONNECT As Short = 16 ' множественный коннект
Public Const RET_NO_CONNECT As Short = 17 ' нет соединения
Public Const RET_NOT_ENOUGH_RIGHTS As Short = 18 ' нет прав
Public Const RET_BAD_STOPS As Short = 19 ' неверный уровень стопов
Public Const RET_SKIPPED As Short = 20 ' операция пропущена из-за того что процесс занят
Public Const RET_TOO_FREQUENT As Short = 21 ' слишком частые обращения
Public Const RET_INVALID_VOLUME As Short = 22 ' неподходящий объем
Public Const RET_INVALID_HANDLE As Short = 23 ' неверный хендл
Public Const RET_INSTANTEXECUTION As Short = 24 ' инструмент в режиме IE
и т.д…
Public Sub InitRate()
Dim err As Integer = 0
Dim MtVersion As Integer = MtGetVersion() 'Получаем номер версии MTAPI.
MtSetWorkingDirectory(System.IO.Directory.GetCurrentDirectory()) 'Назначаем рабочую директорию.
HndlSocket = MtCreate()'Создали сокет.
If HndlSocket >= 0 Then : Else
Exit Sub ‘Ошибка создания объекта сокета для связи с сервером MetaTrader.
End If
'Установление связи с сервером.
err = MtConnect(HndlSocket, "80.83.53.150", 1950)
If err = RET_OK Then :
Else
‘ ТУТ ЗАТЫК! < неопознанные ошибка>.
‘ А ИНОГДА ПРОХОДИТ!
End If
End Sub
Public Sub StopRate()
MtDisconnect(HndlSocket) 'Разрыв ранее установленной связи с сервером.
MtDelete(HndlSocket) 'Закрываем ранее созданный объект сокета.
End Sub
-------------------------------------------------------------------
А вообще-то может кто-нить знает не появилась ещё обёртка для mtapi.dll под VB? Или С#???
PS: буду рад посылу на подобную тему…
Ответить
|