Скачать MetaTrader 5

Ордера, Сделки и Позиции - MQL5 как разобраться

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Yurij Izyumov
17071
Yurij Izyumov  

пол дня сижу уже в конец запутался, я понимаю что всё это разные вещи и по документации вроде как всё это можно вытащить , но не выходит

мне надо перебрать открытые позиции, и посмотреть какими сделками они были сделаны (их коммент, лот, профит и т.п.) 

написал как понял - узнал сколько открытых позиций, вытащил для каждой позиции его идентификатор позиции, дальше узнаю сколько сделок в каждой позиции, потом пытаюсь вытащить каждую сделку, но вот тут нифига не выходит

  Print("ProfitSymbols начата всего "+PositionsTotal()+" позиции ");
  string commt[]; int tt=0; string ordcomment;
  int prof[1];  prof[0]=0; double tMoney[1]; tMoney[0] = 0;
  double tmplots[1]; tmplots[0] = 0;
  ulong DealsID[]; ArrayResize(DealsID, PositionsTotal());

  for(int t=0; t<PositionsTotal();t++){
      string symbol=PositionGetSymbol(t); //  попутно получим имя символа, по которому открыта позиция
      DealsID[t] = PositionGetInteger(POSITION_IDENTIFIER);
  }
  
  for(c=0; c<ArrayRange(DealsID,0); c++)
  {
    HistorySelectByPosition(DealsID[c]);
    Print("По позиции "+DealsID[c]+" "+HistoryDealsTotal()+" сделок ");
    ulong deal_tiket = HistoryDealGetTicket(DealsID[c]);
    for(int dl=0; dl<HistoryDealsTotal(); dl++){
       ulong order_tiket = HistoryDealGetInteger(deal_tiket,DEAL_ORDER);
       if(deal_tiket>0){
         Print("dl="+dl+" Выбрана позиция "+DealsID[c]+" deal_tiket="+deal_tiket+"  order_tiket "+order_tiket);
         if(HistoryDealGetString(deal_tiket,DEAL_COMMENT)!="" && StringLen(HistoryDealGetString(deal_tiket,DEAL_COMMENT))>=12 && HistoryDealGetInteger(deal_tiket,DEAL_MAGIC)==MagicNum){
            Print("Комменты прошли "+deal_tiket);
            if(HistoryDealGetString(deal_tiket,DEAL_SYMBOL)==SelectedSymbol[Index][0] || HistoryDealGetString(deal_tiket,DEAL_SYMBOL)==SelectedSymbol[Index][1] || HistoryDealGetString(deal_tiket,DEAL_SYMBOL)==SelectedSymbol[Index][2] || HistoryDealGetString(deal_tiket,DEAL_SYMBOL)==SelectedSymbol[Index][3] || HistoryDealGetString(deal_tiket,DEAL_SYMBOL)==SelectedSymbol[Index][4] || HistoryDealGetString(deal_tiket,DEAL_SYMBOL)==SelectedSymbol[Index][5] || HistoryDealGetString(deal_tiket,DEAL_SYMBOL)==SelectedSymbol[Index][6]){
               Print("Символы прошли "+HistoryDealGetString(deal_tiket,DEAL_SYMBOL));
               int part = 0;
               for(int we=0;we<ArrayRange(SelectedSymbol,1);we++){
                  if(StringFind(HistoryDealGetString(deal_tiket,DEAL_COMMENT),SelectedSymbol[Index][we],0)>-1){ part++; }
               }
               Print("Проверку прошли "+HistoryDealGetString(deal_tiket,DEAL_COMMENT)+" валют "+part);
               if(part==2){ // в комменте оба наши символа
                  ordcomment = StringSubstr(HistoryDealGetString(deal_tiket,DEAL_COMMENT), 0, 12);
                  if(tt==0){
                     ArrayResize(commt,tt+1);
                     commt[tt]=ordcomment;
                     tt++;
                  }else{ // второй и последующие ордера
                     int seek =0;
                     //Print("АРРАУ -"+ArrayRange(commt,0)); 
                     for(int a=0;a<=(ArrayRange(commt,0)-1);a++){
                        if(seek==0 && commt[a]==ordcomment){
                           seek=1;
                        }
                     }
                     if(seek==0){
                        //Print(tt); 
                        ArrayResize(commt,tt+1);
                        commt[tt]=ordcomment; 
                        tt++; 
                     }
                  }
               }
             }
          }
         
       }
    }
  }

 но всё это чудо выдаёт одно и тоже 

HJ	0	22:12:37.358	MultiPulti-Index (USDJPY,M5)	2016.01.11 02:14:00   ProfitSymbols начата всего 4 позиции 
GO	0	22:12:37.358	MultiPulti-Index (USDJPY,M5)	2016.01.11 02:14:00   По позиции 2 11 сделок 
MS      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   dl=22 Выбрана позиция 3 deal_tiket=9  order_tiket 9
OR      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Комменты прошли 9
MS      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Символы прошли USDJPY
QH      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Проверку прошли USDJPYGBPUSD0 валют 2
RD      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   dl=23 Выбрана позиция 3 deal_tiket=9  order_tiket 9
CG      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Комменты прошли 9
IP      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Символы прошли USDJPY
ED      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Проверку прошли USDJPYGBPUSD0 валют 2
GI      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   dl=24 Выбрана позиция 3 deal_tiket=9  order_tiket 9
GD      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Комменты прошли 9
EM      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Символы прошли USDJPY
IQ      0       22:12:37.474    MultiPulti-Index (USDJPY,M5)    2016.01.11 02:14:20   Проверку прошли USDJPYGBPUSD0 валют 2

 ну то есть ни deal_tiket ни order_tiket не меняются , как вытащить подробнее состав позиции ? из каких сделок состоит позиция

Vladimir Karputov
Модератор
49951
Vladimir Karputov  

В начале кода, добавьте выбор позиции (PositionSelect):

   ulong DealsID[]; ArrayResize(DealsID,PositionsTotal());

   for(int t=0; t<PositionsTotal();t++)
     {
      string symbol=PositionGetSymbol(t); // попутно получим имя символа, по которому открыта позиция
      PositionSelect(symbol);             // chooses an open position for further working with it
      DealsID[t]=PositionGetInteger(POSITION_IDENTIFIER);
     }

   for(c=0; c<ArrayRange(DealsID,0); c++)
Yurij Izyumov
17071
Yurij Izyumov  

жесть вообще накуралесили в MQL5 , были такие простые функции, теперь например выстраивая несколько сеток ордеров, отдельно профит каждой сделки надо как только считать , т.к. они смешиваются в одной позиции 

ну хотя бы я их вообще нашел 

Alexey Kozitsyn
6738
Alexey Kozitsyn  
Juriy Iziymov:

жесть вообще накуралесили в MQL5 , были такие простые функции, теперь например выстраивая несколько сеток ордеров, отдельно профит каждой сделки надо как только считать , т.к. они смешиваются в одной позиции 

ну хотя бы я их вообще нашел 

Чтобы определить профит по сделке, нужно воспользоваться этой функцией с идентификатором DEAL_PROFIT.
Документация по MQL5: Торговые функции / HistoryDealGetDouble
Документация по MQL5: Торговые функции / HistoryDealGetDouble
  • www.mql5.com
Торговые функции / HistoryDealGetDouble - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Alexey Kozitsyn
6738
Alexey Kozitsyn  
Karputov Vladimir:

В начале кода, добавьте выбор позиции (PositionSelect):

Эээ, а зачем? Читаем документацию:

PositionGetSymbol

Возвращает символ соответствующей открытой позиции и автоматически выбирает позицию для дальнейшей работы с ней  

Так что то, что Вы написали - ни к чему. 

Vladimir Karputov
Модератор
49951
Vladimir Karputov  
Alexey Kozitsyn:

Эээ, а зачем? Читаем документацию:

PositionGetSymbol

Возвращает символ соответствующей открытой позиции и автоматически выбирает позицию для дальнейшей работы с ней  

Так что то, что Вы написали - ни к чему. 

Да. Недоглядел.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий