Вопрос по MtGetTradeRecords (Дельфи)

 
Вопрос по MtGetTradeRecords (Дельфи)
Описания:

type

PBriefUserInfo = ^TBriefUserInfo;

TBriefUserInfo = packed record
login :integer; // логин
isdemo :integer; // демо?
name :array [0..63] of char; // имя
company :array [0..63] of char; // компания
balance :double; // баланс
equity :double; // equity
credit :double; // кредит
margin :double; // маржа
freemargin :double; // свободная маржа
profit :double; // прибыль
marginmode :integer; //
margincall :integer; // уровень маржинкола
margintype :char; // тип маржинкола 0-%,1-$
allow_flags :integer; // флаги разрешений
leverage :integer;
end;

PTradeRecord = ^TTradeRecord;

TTradeRecord = record
order :integer; // номер ордера
login :integer; // кому принадлежит
symbol :array [0..7] of char; // символ
digits :short; // кол-во знаков после запятой
cmd :short; // команда
volume :integer; // объем
open_time :time_t; // время открытия
open_price :double; // цена открытия
close_time :time_t; // время закрытия
close_price :double; // цена закрытия
sl :double;
tp :double; // StopLoss TakeProfit
commission :double; // комиссия
agent_commission:double; // агентская комиссия,
storage :double; // своп
profit :double; // профит
comment :array[0..31]of char; // коментарий
end;

TMtGetTrades = function(const handle: integer ): integer; cdecl;
TMtGetTradeRecords = function(const handle: integer; bui: PBriefUserInfo; items: PInteger): PTradeRecord; cdecl;

var
HS :integer; // нендл сокета
MtGetTrades:TMtGetTrades;
MtGetTradeRecords:TMtGetTradeRecords;
items,i:integer;
BUI: TBriefUserInfo;


Код:

i:=MtGetTrades(HS); //Запрос серверу на получение списка открытых позиций
if i<>RET_OK then showMessage('Не могу получить список сделок');
items:=0;
ptr:=MtGetTradeRecords(HS,@bui,@items); //<---- получаю access violation. Почему?

Как правильно работать с MtGetTradeRecords? Приведите, плз, рабочий кусок кода.

Р.S. Сокет открыт, авторизация пройдена, даже сделка совершена.
 
RE:
эта функция (и некоторые другие) возвращает указатель на массив структур, а не на структуру.
TАTradeRecord = array [0..n] of TTradeRecord;
PАTradeRecord = ^TАTradeRecord;
.....PInteger): PАTradeRecord; cdecl
 
Поменял, но...
все равно выскаскивает Access violation.

Может надо создавать какие-то объекты? Или выделять память?

Если не сложно, приведите полный кусок рабочего кода.
 
в догонку...
function GetTradeRecords(var BUI: TBriefUserInfo; out Count: Integer) : TATradeRecord;
var
ATR : TATradeRecord;
PATR : PATradeRecord;
begin
PATR := MtGetTradeRecords(hSok, @BUI, @Count); //здесь access violation
if PATR = nil then Exit;
CopyMemory(@ATR, PATR, Count*SizeOf(TTradeRecord));
HeapFree(GetProcessHeap, 0, PATR);
Result := ATR;
end;


Код:

items:=0;
FillChar(BUI,SizeOf(TBriefUserInfo),#0);
ATR:=GetTradeRecords(bui,items);
 
2Krong: помогите, плз
 
Один баг у себя нашел, но до конца все равно не работает
Причиной Access Viloation было отсутствие строчки:
@MtGetTradeRecords := GetProcAddress(hLib,PChar('MtGetTrades'));

Но функция все равно в PATR возвращает null, хотя открытые позиции есть. Что делать?
 
Точнее
@MtGetTradeRecords := GetProcAddress(hLib,PChar('MtGetTradeRecords'));
 
Получилось
Единственно, что у меня equity достает как 0.00, хотя открытая позиция есть.
 
equity
при предварительном запросе MtGetTrades во внутренние структуры объекта сокета кроме списка позиций записываются balance, credit и margin. при запросе MtGetTradeRecords отдаётся список позиций и структура BriefUserInfo, в которой заполнены только эти 3 поля! остальные поля реально заполняются только после перевода объекта сокета в режим подкачки данных. попробуйте реализовать у себя этот режим и Вы будете получать все необходимые и актуально пересчитанные данные.
 
Спасибо
 
Спасибо