Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 762

 
Alexey Kozitsyn:
И не позиции, и не сделки нужно перебирать, а ордера, т.к. сначала идет ордер, потом сделка, потом позиция.

Почему только ордера? Разве сделка не имеет идентификатор (тикет) позиции?

 
Alexey Viktorov:

Почему только ордера? Разве сделка не имеет идентификатор (тикет) позиции?

Да, Вы правы. И ордера и сделки имеют идентификатор позиции. Однако, в общем случае нужно знать, что позиции присваивается идентификатор первого ордера, инициировавшего сделку. Соответственно, "сущностью" инициирующей позицию, является ордер, а не сделка. И перебирать нужно ордера, а не сделки.

Из документации:

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

 

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

 
Alexey Kozitsyn:

Да, Вы правы. И ордера и сделки имеют идентификатор позиции. Однако, в общем случае нужно знать, что позиции присваивается идентификатор первого ордера, инициировавшего сделку. Соответственно, "сущностью" инициирующей позицию, является ордер, а не сделка. И перебирать нужно ордера, а не сделки.

Из документации:

Я не собираюсь спорить, именно так и написано в документации. Но в другом месте той-же самой документации написано "Как правило..." значит возможны несовпадения. И на такое "как правило" я однажды нарвался...

position

Тикет позиции. Следует заполнять при изменении и закрытии позиции для ее однозначной идентификации. Как правило, соответствует тикету ордера, в результате которого позиция была открыта.

а может просто тикет не того ордера пытался использовать, уже не помню, да и вряд-ли разбирался тогда, прочёл это, исправил и забыл. В общем с тех пор к этому стал более внимательным.
 
Vitaly Muzichenko:
Подскажите, как получить с истории тикет, который был при трейде. На скрине он "63214735"

Здесь Вы ищите номер Позиции, в списке Сделок , а то неправильно.

Вот скрипт демонстрирующий что дает  HistorySelectByPosition

//--- input parameters
input int      Position;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ ulong Ticket;
  if ( HistorySelectByPosition(Position) )
  { Print("Position = "+IntegerToString(Position));
    int o=HistoryOrdersTotal()-1;
    while ( o>=0 )
    { Ticket=HistoryOrderGetTicket(o);
      Print("Order "+IntegerToString(o)+" = "+IntegerToString(Ticket));
      o--;
    }
    int d=HistoryDealsTotal()-1;
    while ( d>=0 )
    { Ticket=HistoryDealGetTicket(d);
      Print("Deal "+IntegerToString(d)+" = "+IntegerToString(Ticket));
      d--;
    }
  }
}

А так выглядит резултат :

Position = 65328142
Order 1 = 65347809
Order 0 = 65328142
Deal 1 = 4070777
Deal 0 = 4051254

0 = Открытие Позиции

1 = Закрытие Позиции

Если не получаете результат = то ввели не Тикет Позиции

Аналогичной результат можно получить и если начать с Тикет Сделки :

Для функции HistoryDealGetInteger()

ENUM_DEAL_PROPERTY_INTEGER

Идентификатор

Описание

Тип

DEAL_TICKET

Тикет сделки. Уникальное число, которое присваивается каждой сделке

long

DEAL_ORDER

Ордер, на основание которого выполнена сделка

long

DEAL_TIME

Время совершения сделки

datetime

DEAL_TIME_MSC

Время совершения сделки в миллисекундах с 01.01.1970

long

DEAL_TYPE

Тип сделки

ENUM_DEAL_TYPE

DEAL_ENTRY

Направление сделки – вход в рынок, выход из рынка или разворот

ENUM_DEAL_ENTRY

DEAL_MAGIC

Magic number для сделки (смотри ORDER_MAGIC)

long

DEAL_REASON

Причина или источник проведения сделки

ENUM_DEAL_REASON

DEAL_POSITION_ID

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

long

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ivan Ivanov:

Спасибо!

Мне нужно было это: HistoryOrderGetTicket

 
Vitaly Muzichenko:

Спасибо!

Мне нужно было это: HistoryOrderGetTicket

Ордер может быть лотом 1.0. А вот исполниться он может частично, например, лотом 0.9 - остаток будет отклонён (зависит от режима исполнения). Тогда сделка будет лотом 0.9. И когда начнёте искать лот по ордеру, то будут несоответствия.

 

Прошу помощи - нужен вменяемый код для получения значения окружения OHLC - имеющиеся сильно тормозят

Вариант 1

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
//   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   int copied=CopyClose(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyClose(symbol,timeframe,0,Bars(symbol,timeframe),CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }


 

Вариант 2

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }
 
Aleksey Vyazmikin:

Прошу помощи - нужен вменяемый код для получения значения окружения OHLC - имеющиеся сильно тормозят

Вариант 1


Вариант 2

Выложите кусок кода, как вы их применяете
 
Vitaly Muzichenko:
Выложите кусок кода, как вы их применяете

 

Я не знаю, какой кусок тормозит - применяю по разному, в том числе в циклах...


вот пример


            for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               if((Low(X)>PricePeresek && High(X)>PricePeresek) || 
                  (Low(X)<PricePeresek && High(X)<PricePeresek))
                  calcBarPeresek++;
               else break;
              }
 
Aleksey Vyazmikin:

 Я не знаю, какой кусок тормозит - применяю по разному, в том числе в циклах...

Вроде так в циклах, и можно обойтись без функции

            double LOW[1],HIGH[1];
             for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               CopyLow(Symbol(),PERIOD_CURRENT,X,1,LOW);
               CopyHigh(Symbol(),PERIOD_CURRENT,X,1,HIGH);
               if((LOW[0]>PricePeresek && HIGH[0]>PricePeresek) || 
                  (LOW[0]<PricePeresek && HIGH[0]<PricePeresek))
                  calcBarPeresek++;
               else break;
              }