Функция: Как посчитать количество открытых сделок на Хеджевом и Неттинговом счете 1 функцией, без выбора типа счета? РЕШЕНО

 

Всем привет, 

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

есть функция:

int CurrentPositionTotalDeals(string comment="",string symb="")
  {
   if(symb=="")symb=_Symbol;
   int    total       =0;  // Всего сделок в списке выбранной истории
   int    count       =0;  // Счетчик сделок по символу позиции
   string deal_symbol =""; // символ сделки
//--- Если история позиции получена
   PositionSelect(symb);
   long ID=PositionGetInteger(POSITION_IDENTIFIER);
   if(HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60))
     {
      //--- Получим количество сделок в полученном списке
      total=HistoryDealsTotal();
      //--- Пройдем по всем сделкам в полученном списке
      for(int i=0; i<total; i++)
        {
         //--- Получим символ сделки
         deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
         //--- Если символ сделки и текущий символ совпадают, увеличим счетчик
         if(deal_symbol==symb && (StringFind(HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT),comment)!=-1 || comment==""))
           {
                  count++;
           }
        }
     }
//---
   return(count);
  }

 

на неттинговом счете она работает нормально, считает количество сделок из истории по текущему символу

 

но на хеджевом она "подглючивает"

 


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

так вот например при 5 октрытии дополнительной сделки - почему функция  CurrentPositionTotalDeals возвращает не 5 а 4, Т.е.

первая красная линия там должен уже быть номер 5, но функция CurrentPositionTotalDeals теряет одну сделку.  

 

с помощью принтов видно что он уже не берет в внимание первую сделку

2016.10.06 13:24:16.602	2016.01.05 11:00:18   total=4 CurrentPositionTotalDeals 3  count=4 comment=THE X Averager Num4 time=1451984420 pos ticket=16 ticket=19
2016.10.06 13:24:16.602	2016.01.05 11:00:18   total=4 CurrentPositionTotalDeals 2  count=3 comment=THE X Averager Num4 time=1451984420 pos ticket=16 ticket=18
2016.10.06 13:24:16.602	2016.01.05 11:00:18   total=4 CurrentPositionTotalDeals 1  count=2 comment=THE X Averager Num3 time=1451984420 pos ticket=16 ticket=17
2016.10.06 13:24:16.602	2016.01.05 11:00:18   total=4 CurrentPositionTotalDeals 0  count=1 comment=THE X Averager Num2 time=1451984420 pos ticket=16 ticket=16
 

 

 

 

Кто какие функции использует для подсчета количества позиций?  


 

РЕШЕНИЕ:

 

int CurrentPositionTotalDeals(string comment="",string symb="")
  {
   if(symb=="")symb=_Symbol;
   int    total       =0;  // Всего сделок в списке выбранной истории
   int    count       =0;  // Счетчик сделок по символу позиции
   string deal_symbol =""; // символ сделки
//--- Если история позиции получена
   if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      long ID=PositionGetInteger(POSITION_IDENTIFIER);
      if(HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60))
        {
         //--- Получим количество сделок в полученном списке
         total=HistoryDealsTotal();
         //--- Пройдем по всем сделкам в полученном списке
         for(int i=0; i<total; i++)
           {
            //--- Получим символ сделки
            deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
            //--- Если символ сделки и текущий символ совпадают, увеличим счетчик
            if(deal_symbol==symb && (StringFind(HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT),comment)!=-1 || comment==""))
              {
               count++;
               //    Print("total="+total+" CurrentPositionTotalDeals "+i+"  count="+count+" comment="+HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT)+" time="+PositionGetInteger(POSITION_TIME)+" pos ticket="+PositionGetInteger(POSITION_IDENTIFIER)+" ticket="+HistoryDealGetTicket(i));
              }
           }
        }
     }
   if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      int  PosTotal=PositionsTotal();
      for(int i=PosTotal-1;i>=0;i--)
        {
         if(PositionSelectByTicket(PositionGetTicket(i))==true && PositionGetSymbol(i)==symb
            && (StringFind(PositionGetString(POSITION_COMMENT),comment)!=-1 || comment==""))
           {
            count++;
           }
        }
     }
   return(count); }


 

 РЕШЕНИЕ 2

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Функция: Как посчитать количество открытых сделок на Хеджевом и Неттинговом счете 1 функцией, без выбора типа счета? РЕШЕНО

Alexey Viktorov, 2016.10.06 14:35

Попробуй этот вариант на неттинге. На хедже работает.

int CurrentPositionTotalDeals(string comment="",string symb="")
  {
   if(symb=="")symb=_Symbol;
   int    total       =0;  // Всего сделок в списке выбранной истории
   int    count       =0;  // Счетчик сделок по символу позиции
   string deal_symbol =""; // символ сделки
//--- Если история позиции получена
   //PositionSelect(symb);
  for(int i = 0; i < PositionsTotal(); i++)
   {
    ulong pt = PositionGetTicket(i);
     long ID=PositionGetInteger(POSITION_IDENTIFIER);
      if(PositionGetString(POSITION_SYMBOL) == symb && HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60))
       {
        //--- Получим количество сделок в полученном списке
        total=HistoryDealsTotal();
         //--- Пройдем по всем сделкам в полученном списке
         for(int i=0; i<total; i++)
          {
           ulong dt = HistoryDealGetTicket(i);
           long did = HistoryDealGetInteger(dt, DEAL_POSITION_ID);
            ENUM_DEAL_ENTRY in_out = HistoryDealGetInteger(dt, DEAL_ENTRY);
            if(did == pt && in_out == DEAL_ENTRY_IN)
             {
              count++;
             }
          }
       }
   }
//---
   return(count);
  }


 

Решение пока только одно, это явно вычислять количество по типу счета

int CurrentPositionTotalDeals(string comment="",string symb="")
  {
   if(symb=="")symb=_Symbol;
   int    total       =0;  // Всего сделок в списке выбранной истории
   int    count       =0;  // Счетчик сделок по символу позиции
   string deal_symbol =""; // символ сделки
//--- Если история позиции получена
   if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      long ID=PositionGetInteger(POSITION_IDENTIFIER);
      if(HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60))
        {
         //--- Получим количество сделок в полученном списке
         total=HistoryDealsTotal();
         //--- Пройдем по всем сделкам в полученном списке
         for(int i=0; i<total; i++)
           {
            //--- Получим символ сделки
            deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
            //--- Если символ сделки и текущий символ совпадают, увеличим счетчик
            if(deal_symbol==symb && (StringFind(HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT),comment)!=-1 || comment==""))
              {
               count++;
               //    Print("total="+total+" CurrentPositionTotalDeals "+i+"  count="+count+" comment="+HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT)+" time="+PositionGetInteger(POSITION_TIME)+" pos ticket="+PositionGetInteger(POSITION_IDENTIFIER)+" ticket="+HistoryDealGetTicket(i));
              }
           }
        }
     }
   if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      int  PosTotal=PositionsTotal();
      for(int i=PosTotal-1;i>=0;i--)
        {
         if(PositionSelectByTicket(PositionGetTicket(i))==true && PositionGetSymbol(i)==symb
            && (StringFind(PositionGetString(POSITION_COMMENT),comment)!=-1 || comment==""))
           {
            count++;
           }
        }
     }
   return(count);
  }

кстати вот что еще интересно по 2 разным счетам.
комиссия на неттинговом счете - больше чем на хеджевом :-)
Хеджевый счет:
Total Trades:43
Total Deals:86
CommissionSwapProfit   Balance
-3.02          -0.0122.33  10 019.30
Неттинговый счет:
Total Trades:36
Total Deals:79
CommissionSwapProfit   Balance
-3.05          -0.0122.33  10 019.27
Сделки сравнил полностью, они идентичны, кроме комиссии

 

PositionsTotal()

 

А лучше под хэдж-счета писать на идеально для этого подходящем MQL4. 

Документация по MQL5: Торговые функции / PositionsTotal
Документация по MQL5: Торговые функции / PositionsTotal
  • www.mql5.com
Торговые функции / PositionsTotal - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
PositionsTotal()

гениально. а теперь попробуйте ту же функцию использовать на неттинговом счете 

При "неттинговом" учете позиций (ACCOUNT_MARGIN_MODE_RETAIL_NETTING и ACCOUNT_MARGIN_MODE_EXCHANGE) по каждому символу в любой момент времени может быть открыта только одна позиция,

это значит что  PositionsTotal - вернет 1 

а мне нужно реальное количество сделок.  

 
fxsaber:

А лучше под хэдж-счета писать на идеально для этого подходящем MQL4. 


не согласен. в мт5 теперь есть и неттинг и хеджинг. Это значит, что эксперт должен работать и на хеджевом счете и на неттинговом счете - одинаково.

 

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

 
Vladislav Andruschenko:

а мне нужно реальное количество сделок.  

Тогда это никак не согласуется с названием ветки "Количество позиций на Хеджевом и Неттинговом счете".

Напишите понятно, что Вам нужно. 

 
fxsaber:
PositionsTotal()

Это общее количество по всем символам. А задача, как я понимаю, отсеять позиции по одному символу.

Vladislav Andruschenko:

Решение пока только одно, это явно вычислять количество по типу счета

На неттинговом счёте на одну позицию повлияли несколько сделок и ордеров, а на хежде каждая позиция отдельно. Мне кажется другого способа нет. Только условие по типу счёта и соответствующий алгоритм подсчёта.

 
Alexey Viktorov:

Это общее количество по всем символам. А задача, как я понимаю, отсеять позиции по одному символу.

На неттинговом счёте на одну позицию повлияли несколько сделок и ордеров, а на хежде каждая позиция отдельно. Мне кажется другого способа нет. Только условие по типу счёта и соответствующий алгоритм подсчёта.


Спасибо, это единственный вариант на данный момент

 

кстати вот что еще интересно по 2 разным счетам.
комиссия на неттинговом счете - больше чем на хеджевом :-)
Хеджевый счет:
Total Trades:43
Total Deals:86
CommissionSwapProfit   Balance
-3.02          -0.0122.33  10 019.30
Неттинговый счет:
Total Trades:36
Total Deals:79
CommissionSwapProfit   Balance
-3.05          -0.0122.33  10 019.27
Сделки сравнил полностью, они идентичны, кроме комиссии
 
Vladislav Andruschenko:

не согласен. в мт5 теперь есть и неттинг и хеджинг. Это значит, что эксперт должен работать и на хеджевом счете и на неттинговом счете - одинаково.

Никакой разницы не будет при написании советника!
 

извините но я не понимаю Вашего поста? разницы где не будет? какого написания? написания по готовым классам? или разница между мт4 и мт5? 

по готовым классам? понятное дело, там уже все написано до Вас. а если с 0 ?  

 
Vladislav Andruschenko:

извините но я не понимаю Вашего поста? разницы где не будет? какого написания? написания по готовым классам? или разница между мт4 и мт5? 

по готовым классам? понятное дело, там уже все написано до Вас. а если с 0 ?  

Любая ТС при очередном вызове опрашивает с нуля полное торговое окружение. Это же делает после любой торговой операции.

Какие проблемы на MQL4-функциях написать нетто-советник? 

Причина обращения: