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

 
Karputov Vladimir:

Никаких "перекрыли" не существует. Все сделки записываются в торговую историю и их оттуда даже топором не вырубишь. Поэтому:

  • пустой терминал, нет ни одной позиции
  • вы делаете BUY 0.01 EURUSD (сделка номер раз)
  • вы делаете BUY 0.01 EURUSD (сделка номер два)
  • вы делаете SELL 0.01 EURUSD (сделка номер три)
  • в итоге имеем открытую ПОЗИЦИЮ BUY 0.01 EURUSD, которая состоит из трёх сделок

Пример #2:

  •  пустой терминал, нет ни одной позиции
  • вы делаете BUY 0.01 EURUSD (сделка номер раз)
  • вы делаете BUY 0.01 EURUSD (сделка номер два)
  • вы делаете BUY 0.01 EURUSD (сделка номер три)
  • вы делаете BUY 0.01 EURUSD (сделка номер четыре) 
  • вы делаете SELL 0.01 EURUSD (сделка номер пять)
  • в итоге имеем открытую ПОЗИЦИЮ BUY 0.03 EURUSD, которая состоит из пяти сделок

хорошо, давайте вернемся к посту номер: https://www.mql5.com/ru/forum/97146/page2#comment_2872051
Функция: Как посчитать количество открытых сделок на Хеджевом и Неттинговом счете 1 функцией, без выбора типа счета? РЕШЕНО
Функция: Как посчитать количество открытых сделок на Хеджевом и Неттинговом счете 1 функцией, без выбора типа счета? РЕШЕНО
  • www.mql5.com
Всем привет, работаю с хеджевыми счетам, столкнулся с проблемой как узнать количество текущих позиций на 2 счетах - одной функцией...
 
Vladislav Andruschenko:

Вроде, понял, что хотите. Тогда Вам поможет HistorySelectByPosition.

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Торговые функции / HistorySelectByPosition - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladislav Andruschenko:
хорошо, давайте вернемся к посту номер: https://www.mql5.com/ru/forum/97146/page2#comment_2872051
Выхожу из дискуссии, так как до сих пор Вы не смогли сообщить, а что же собственно Вы хотите подсчитать.
 
Karputov Vladimir:
Выхожу из дискуссии, так как до сих пор Вы не смогли сообщить, а что же собственно Вы хотите подсчитать.

проблема решена, Спасибо.

посчитать я хотел количество позиций на хеджевом счете и количество сделок на неттинговом счете - ОТКРЫТЫХ на данный момент и все это 1 функцией.  

 

чувствую себя "заказчиком" 

сам понимаю, что начинаю психовать, когда заказчик не может мне объяснить "Чего он от меня хочет". :-)

 Чтобы совесть была чиста, привожу более конкретный пример:

 итак, 

Неттинговый счет:  

задача:

Максимальное количество сделок = 5; дистанция для доливки = 10 пунктов 

1. Открываем позицию BUY лотом 0.01 по цене 1,2300

2. Если цена идет вверх - то мы доливаемся, но!!!! нам нужно открыть не более 5 сделок всего. Т.е. не более 4 раз мы можем долиться, то есть открыть сделок по тренду

 3. Цена 1,2310 - открываем BUY лотом 0,01 (Итоговая позиция у нас BUY 0.02)

4.  Цена 1,2320 - открываем BUY лотом 0,01 (Итоговая позиция у нас BUY 0.03)

 5.  Цена 1,2330 - открываем BUY лотом 0,01 (Итоговая позиция у нас BUY 0.04)

 6.  Цена 1,2340 - открываем BUY лотом 0,01 (Итоговая позиция у нас BUY 0.05)

Задание выполнено ! долились 4 раза! В итоге у нас максимально получилось 5 сделок

 функция для подсчета этого количества сделок:

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; дистанция для доливки = 10 пунктов 

1. Открываем позицию BUY лотом 0.01 по цене 1,2300

2. Если цена идет вверх - то мы доливаемся, но!!!! нам нужно открыть не более 5 сделок всего. Т.е. не более 4 раз мы можем долиться, то есть открыть сделок по тренду

  3. Цена 1,2310 - открываем BUY лотом 0,01 (2 позиции по 0.01 лота)

4.  Цена 1,2320 - открываем BUY лотом 0,01 (3 позиции по 0.01 лота)

 5.  Цена 1,2330 - открываем BUY лотом 0,01 (4 позиции по 0.01 лота)

 6.  Цена 1,2340 - открываем BUY лотом 0,01 (5 позиции по 0.01 лота)

Задача решена, долились 5 раз, функция для подсчета количества позиций:

int CurrentPositionTotalDeals(string comment="",string symb="")
  {
   if(symb=="")symb=_Symbol;
   int    total       =0;  // Всего сделок в списке выбранной истории
   int    count       =0;  // Счетчик сделок по символу позиции
 
 
      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); 
}

 


 

Вопрос:

Почему первая функция неправильно работает на хеджевом счете? Т.е. она работает, но с глюками.

Я хотел узнать а как ВЫ считаете количество позиций(или сделок) на хеджевом и неттинговом счете.  

 

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

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);
  }
 

идеально! 

Спасибо работает и там и там.

моя ошибка была в том, что на хеджевом счете я выбрал только 1 позицию . А ты сделал перебором всех позиций. (вот я дурак. пол дня провозился........)

СПАСИБО 

 

Наверное надо посмотреть и почистить функцию. Нужен-ли там POSITION_IDENTIFER или использовать его в дальнейшем вместо pt тикета позиции.

В принципе пишут что они совпадают, но в неттинге ??? я не в курсе.

А зачем в функции HistorySelect() к текущему времени прибавлен час? (ой... секунда...)  Я забыл убрать... Может это даёт возможность определить что будет в течении ближайшего часа? Было-бы здорово.)))))))

 

в последней функции идет перебор позиций! и сделок в этой позиции

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

в неттинговом типе 1 позиция = множество сделок, функция работает потому, что функция перебирает все позиции (а она одна) и все сделки по позициям.

Спасибо. Супер.  

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