А есть ли добрые люди, переписавшие MTAPI под Delphi?

 
А есть ли добрые люди, переписавшие MTAPI под Delphi?
...и если есть, то может кто поделится?
Заранее благодарен.
 
пока нет , но пытаюсь
может и разберусь , пока получается но есть трудности ...
 
тип даных ...
Ну как ктонибудь зделал под делфи апи ? У меня почти все работает кроме SendOrder все дело в типе переменой , вот как на с+
struct SendOrderInfo // Объединенная команда посылки ордера
{
char req_code; // код команды в протоколе
int order; // ордер
char symbol[8]; // инструмент
int volume; // объем
char cmd; // команда OP_BUY....OP_SELL_STOP
double price; // цена исполнения
double sl,tp; // стопы
int crc; // контрольная сумма
};
какие они должны быть в делфи особено интересно char cmd; у меня в нем вся проблема ...
 
RE: тип даных
char cmd; это байт :), так что пиши
cmd : byte;
 
все равно ошибку выдает...
говорит что цена изменилась, хотя смотрю цены одинаковые кк при вызове функии так и через МТ. Я вижу ты тут больше всех в этом вопросе разбираешся так может выложишь свои исходники , примеры . где можно будет посмотреть описание функций и т.д.
 
TSendOrderInfo
обрати внимание на директиву #pragma pack(1) в metatraderapi.h
после #pragma pack(1) - = packed record,
после #pragma pack(8) - = record
из за неправильного описания структур может выдаваться мусор.

PSendOrderInfo = ^TSendOrderInfo;
TSendOrderInfo = packed record
Req_Code : byte;
Order : integer;
Symbol : array [1..8] of char ;
Volume : integer;
Cmd : byte; //OP_BUY....OP_SELL_STOP
Price : double;
SL,TP : double;
Crc : integer;
end;
 
BriefUserInfo и TradeRecord
функции возврощают не извесно что. вот как я описал переменые
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; //
credit : double; // кредит
margin : double; // маржа
freemargin : double; // свободная маржа
profit : double; // прибыль
marginmode : integer; //
margincall : integer; // уровень маржинкола
margintype : byte; // тип маржинкола 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 : dword; // время открытия
open_price : double; // цена открытия
close_time : dword; // время закрытия
close_price : double; // цена закрытия

sl,tp : double; // StopLoss TakeProfit

commission : double; // комиссия
agent_commission : double; // агентская комиссия, финальный расчет при закрытии позиции
storage : double; // своп
profit : double; // профит
comment : array [0..31] of char; // коментарий
end;


вот так функции

TMtGetTrades = function(const p:integer):integer; cdecl;
TMtGetTradeRecords = function(const p:integer; var p2:TBriefUserInfo; var p3:integer):TTradeRecord; cdecl;

в итоге переменые содержат мусор :-( Смотрю, смотрю вроде все правелно в чем же дело ?
 
нет, не так
PATradeRecord = ^TATradeRecord;
TATradeRecord = array [0..MaxTradeRecordCount] of TTradeRecord;

TMtGetTrades = function(const handle: integer ): integer;
TMtGetTradeRecords = function(const handle: integer; bui: PBriefUserInfo; items: PInteger) : PATradeRecord; cdecl;
 
Эта запись не пакуется
Может, я и ошибаюсь- но #pragma8 стоит перед описанием этого типа... Соответственно, слово packed явно лишнее...
 
все равно не работает :)
блин что такое, никак не хочет работать, что за невезение, жизнь не удалась, и кому я теперь нужен ;-( может хоть кто даст рабочий кусок где бы возврощалась информация по открытым ордерам ;-o
 
не тормози
function TMTAPI.GetTradeRecords(var BUI: TBriefUserInfo; out Count: Integer) : ATradeRecord;
var
ATR : ATradeRecord;
PATR : PATradeRecord;
begin
PATR := FMtGetTradeRecords(FPSockHandle, @BUI, @Count);
if PATR = nil then Exit;
CopyMemory(@ATR, PATR, Min(Count, MaxTradeRecordCount)*SizeOf(TTradeRecord));
HeapFree(GetProcessHeap, 0, PATR);
Result := ATR;
end;
Причина обращения: