Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2557

 
Andrei Sokolov #:

Спасиб конечно, но это не ответ, и так читаю.

сейчас нет МЕ - что мог по памяти вам подсказал.... сам также искал..... 

помню что через DEAL. Св-ва позиции посмотрите... в истории....  флаги ее открытия и закрытия.... 

 
Roman Shiredchenko #:

сейчас нет МЕ - что мог по памяти вам подсказал.... сам также искал..... 

помню что через DEAL. Св-ва позиции посмотрите... в истории....  флаги ее открытия и закрытия.... 

Спасибо за ответы, сам нагуглил, : HistoryDealGetInteger(3, DEAL_POSITION_ID) выдает 2. Те возвращает тикет позиции in.

 
Andrei Sokolov #:

Спасибо за ответы, сам нагуглил, : HistoryDealGetInteger(3, DEAL_POSITION_ID) выдает 2. Те возвращает тикет позиции in.

да!  DEAL_POSITION_ID - вы написали и я вспомнил! )

 
Andrei Sokolov #:

Спасибо за ответы, сам нагуглил, : HistoryDealGetInteger(3, DEAL_POSITION_ID) выдает 2. Те возвращает тикет позиции in.

Нет.

Из справки:

Идентификатор позиции - это уникальное число, которое присваивается каждой вновь открытой позиции и не изменяется в течение всей ее жизни. Соответствует тикету ордера, которым была открыта позиция.

Идентификатор позиции указывается в каждом ордере (ORDER_POSITION_ID) и сделке (DEAL_POSITION_ID), которая ее открыла, изменила или закрыла. Используйте это свойство для поиска ордеров и сделок, связанных с позицией.

При развороте позиции в режиме неттинга (единой сделкой in/out) идентификатор позиции POSITION_IDENTIFIER не изменяется. Однако при этом POSITION_TICKET изменяется на тикет ордера, в результате которого произошел разворот. В режиме хеджинга разворот позиции не предусмотрен.

Вам нужно

  1. получить идентификатор позиции из какой-либо сделки, принадлежащей этой позиции,
  2. Выбрать все сделки этой позиции при помощи HistorySelectByPosition(),
  3. В полученной истории найти сделку In и сделку Out. In - вход в позицию, Out - выход.

UPD. Читайте примеры в справке. Они очень информативны.

UPD2. По ссылке на функцию в справке обратите внимание на тикет открывающего ордера, тикет открывающей сделки и идентификатор позиции:

   результат:
   List of orders and deals for position with ID: 1819629924
     [0] Order Sell Limit #1819629924
     [1] Order Buy #1819633194
     [0] Entry In Deal Sell #1794972472
     [1] Entry Out Deal Buy #1794975589
   List of orders and deals for position with ID: 1841753970
     [0] Order Sell Stop #1841753970
     [1] Order Buy #1842322160
     [0] Entry In Deal Sell #1817242142
     [1] Entry Out Deal Buy #1817765341

Заметьте, что тикет открывающей сделки НЕ равен идентификатору позиции, как Вы предположили в своём посте. И это верно - он равен тикету ордера, породившего сделку.

В тестере, он может быть и равен из-за архитектурной особенности моделирования истории торговли, но не в реале.

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Запрашивает историю сделок и ордеров, имеющих указанный идентификатор позиции. Параметры position_id [in]  Идентификатор позиции, который...
 
Artyom Trishkin #:

Спасиб. рукалицо как понагородили 

 
Artyom Trishkin #:
double HistoryProfit(ulong in_ticket_in)
{
        HistorySelect(0, TimeCurrent());
        double profit = 0.0;
        ulong ticket_out = 0;
        for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
   {
        ulong  deal_ticket = HistoryDealGetTicket(i);
        
	if(HistoryDealGetInteger(deal_ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT
   	&& HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID) == HistoryDealGetInteger(in_ticket_in, DEAL_POSITION_ID)) 
        {
                ticket_out = deal_ticket;
                break;
        }
   }
        profit += HistoryDealGetDouble(ticket_out, DEAL_PROFIT);
        profit += HistoryDealGetDouble(ticket_out, DEAL_SWAP);
        profit += HistoryDealGetDouble(ticket_out, DEAL_COMMISSION);
        profit += HistoryDealGetDouble(ticket_out, DEAL_FEE);
        return profit;
}       

Если " тикет открывающей сделки НЕ равен идентификатору позиции", то вот так, через поиск по ID будет правильно сделать?

 

Всем привет. Вот разбирал свои архивы по МТ4, наткнулся на интересный индюк. Этот индюк рисует две  линии тренда с отметками пробития ценой определённого уровня. (Индюк рабочий.)

//+------------------------------------------------------------------+
//|                                                        LeMan.mq4 |
//|                                         Copyright © 2009, LeMan. |
//|                                                 b-market@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, LeMan."
#property link      "b-market@mail.ru"
//----

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red
#property indicator_width1 3
#property indicator_width2 3
//----
extern int    N = 12;
//----
double OpenUp[];
double OpenDown[];
double StopUp[];
double StopDn[];
//+------------------------------------------------------------------+
int init() {
//----
   IndicatorDigits(Digits);
   IndicatorBuffers(4);
//----      
   SetIndexBuffer(0,OpenUp);
   SetIndexBuffer(1,OpenDown);
   SetIndexBuffer(2,StopUp);
   SetIndexBuffer(3,StopDn);
   
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,159);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,159);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
//----      
   return(0);
}
//+------------------------------------------------------------------+
int start() { 

   int i, limit, counted_bars = IndicatorCounted();      
   if(counted_bars > 0) counted_bars--;
   limit = iBars(NULL,0)-counted_bars;

   for (i = 0; i < limit; i++) {
      OpenUp[i] = 0;
      OpenDown[i] = 0;
      double hl1 = iLow(NULL,0,iHighest(NULL,0,MODE_LOW,N,i+1));
      double hl2 = iLow(NULL,0,iHighest(NULL,0,MODE_LOW,N,i+2));
      double lh1 = iHigh(NULL,0,iLowest(NULL,0,MODE_HIGH,N,i+1));
      double lh2 = iHigh(NULL,0,iLowest(NULL,0,MODE_HIGH,N,i+2));
      if (Low[i+2] <= lh2 && Low[i+1] > lh1) {
         OpenUp[i] = High[i+1]+Point;
      }
      if (High[i+2] >= hl2 && High[i+1] < hl1) {
         OpenDown[i] = Low[i+1]-Point;
      }
      StopUp[i] = iLow(NULL,0,iLowest(NULL,0,MODE_LOW,N,i+1));
      StopDn[i] = iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,N,i+1));
   } 
   
//----
   return(0);
}
//+------------------------------------------------------------------+

 В коде нет функции " int OnCalculate() ". Вопрос. Если я захочу в дальнейшем переделать под МТ5. Куда нужно прописать вышеуказанную функцию?

 
Igor Nagorniuk #:
Куда нужно прописать вышеуказанную функцию?
В " int OnCalculate() "
 
В МТ4 несколько окон расположены мозаикой.
Одно из них 'активное', остальные нет.
В каждом окне бежит индикатор.

Можно ли из индикатора (средствами mql4) определить какое окно в данные момент 'активное'?
 
Tretyakov Rostyslav #:
В " int OnCalculate() "

Понятно, что в вышеуказанную функцию). Главный вопрос, что вписывать. Вопрос, может ли эта функция быть "пустой"?