Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Отслеживай хиты продаж в Маркете!
Forex Trader
114376
Forex Trader 2007.05.14 21:23 
Вот такая ошибка выскакивает по нижеприведенному коду:
procedure TfrmMain.CloseMTPosition(po: TOpenPosition);
 var i, E, lot: integer; bid, ask, prc: double;
begin

HSocket:= MTAPI_ConnectSocket(pf.srv[srvMT3].ip, StrToIntDef(pf.srv[srvMT3].Port, 0));
 if HSocket> -1 then begin
   E:= MTApi.Login(HSocket, StrToIntDef(pf.srv[srvMT3].Login, 0), pf.srv[srvMT3].Pass);
   if E<> MTERR_OK then begin
      MessageDlg('CloseMTPosition error'+ CR+'Cannot to HSocket socket.'+ MTAPI.GetErrorDescription(E), mtError, [mbOK], 0);
      Exit;
   end;
 end;
 end;


 lot:= round(100* po.Amount);
 E:= MTAPI.GetPrices(HSocket, po.symbol, lot, @bid, @ask);

 if po.BuySell= ORD_BUY then
   prc:= bid
 else
   prc:= ask;

 E:= MTAPI.CloseOrder(HSocket, po.order, prc, lot);



Forex Trader
114376
Forex Trader 2007.05.15 11:29  
Это - ошибочное описание ошибки. На самом деле - это requote
Forex Trader
114376
Forex Trader 2007.05.15 15:26  
На самом деле - это requote


Как позицию-то закрыть, что я сделал не так? Она (ошибка) вылазит в 100% случаев, даже если рынок не движется.
Forex Trader
114376
Forex Trader 2007.05.15 15:43  
Я не уверен, что для символа в режиме Instant Execution необходимо запрашивать цены. Используйте текущие потоковые цены.

Кстати, вот нашёл описание MtGetPrices и замечание к этой функции
===
Необходимое замечание. Если инструмент, по которому запрашиваются цены,
находится в режиме Instant Execution, то необходимо просто брать последние
котировки по запрашиваемому инструменту.
===
Forex Trader
114376
Forex Trader 2007.05.15 17:46  
Я не уверен, что для символа в режиме Instant Execution необходимо запрашивать цены. Используйте текущие потоковые цены.

Да, я читал замечание про Instant Execution, но так и не врубился, откуда брать текущие цены? Они есть в какой-то предопределенной МТ3 структуре или мне самому нужно апдейтить их по приходу каждого тика по каждой паре.
Что касается ф-ции GetPrices, то я ее присобачил по примеру, приложенному к API библиотеке.

procedure TfrmClosePosition.btnRequestClick(Sender: TObject);
var
  error:integer;
begin
 error:=MTAPI.GetPrices(HSocket,pchar(symbol),round(100*lots),@bid,@ask);
 if error<>RET_OK then
   lblBidAsk.Caption:=MTApi.GetErrorDescription(error)
 else
   lblBidAsk.Caption:=FloatToStrF(bid,fffixed,10,4)+'/'+FloatToStrF(ask,fffixed,10,4);

 btnRequest.Enabled:=false;
 btnClose.Enabled:=true;
 t:=5;
 Timer1.Enabled:=true;
end;

procedure TfrmClosePosition.btnCloseClick(Sender: TObject);
var error:integer;
begin
 if isBuyPosition then
   error:=MTApi.CloseOrder(HSocket,order,bid,round(100*lots))
 else
   error:=MTApi.CloseOrder(HSocket,order,ask,round(100*lots));

 donShowLiveQuotes2:=true;

 if error<>RET_OK then
   lblBidAsk.Caption:=MTApi.GetErrorDescription(error)
 else
   close;
end;
Forex Trader
114376
Forex Trader 2007.05.15 18:26  
Текущие цены берутся из пампинга
===
int MtSetPumpingMode( const int handle, const HWND destwnd, const UINT eventmsg );

Запрос серверу на перевод клиента в режим подкачки данных (пассивный режим).
Этот режим предполагает уменьшение трафика, так как сервер без дополнительного
запроса клиента будет посылать новые данные, относящиеся к клиенту. Этот режим
предполагает более оперативное получение данных - котировок, новостей, изменения
состояния открытых позиций, изменения состояния счёта.

Важно! После перевода объекта сокета в режим подкачки данных недопустимо обращаться
к серверу через данный сокет с запросами, кроме запроса на разрыв связи MtDisconnect.
Можно вызывать следующие функции: MtGetTradeRecords, MtGetSecurities, MtAddSymbol,
MtHideSymbol, MtGetUpdatedTickInfo, MtGetLastNews, MtGetLastMail.

handle - хэндл сокета, через который уже произведён вход в систему в качестве авторизованного клиента;
destwnd - хэндл окна, которому будут приходить сообщения о поступлении новых данных от сервера;
eventmsg - идентификатор сообщения, которое будет посылаться окну.
В качестве параметра WPARAM может быть передано одно из значений:
UPDATE_BIDASK, UPDATE_NEWS, UPDATE_TRADES, UPDATE_MAIL или END_PUMPING (описаны в файле MetaTraderAPI.h).
В качестве параметра LPARAM передаётся хэндл объекта сокета, пославшего сообщение.
Возвращает код возврата.
===
Обрабатывайте сообщение UPDATE_BIDASK
Forex Trader
114376
Forex Trader 2007.05.15 20:00  
Текущие цены берутся из пампинга

Есть у меня такой и pti:= MTAPI.GetUpdatedTickInfo(handle, @cnt) вызывается.
Спасибо, попробую закрывать по заведомо допустимой цене, посмотрю что получится.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий