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

 
мы сейчас говорим о пользе мт5 и мт4? или все таки о том как использовтаь 1 функцию на неттинговом и хеджевом счете в мт5?
 
Vladislav Andruschenko:
мы сейчас говорим о пользе мт5 и мт4? или все таки о том как использовтаь 1 функцию на неттинговом и хеджевом счете в мт5?
Жирным выделил, о чем говорим. Вы только  так и не написали, что хотите узнать? На сабж-вопрос ответил.
 
fxsaber:
Жирным выделил, о чем говорим. Вы только  так и не написали, что хотите узнать? На сабж-вопрос ответил.
Я хотел узнать как вы вычисляет количество позиций открытых на счёте по текущему символу на 2 счетах. 
 
Vladislav Andruschenko:
Я хотел узнать как вы вычисляет количество позиций открытых на счёте по текущему символу на 2 счетах. 
Так
#include <MT4Orders.mqh>

int GetAmountPositions( const string Symb )
{
  int Res = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderSymbol() == Symb) && ((OrderType() == OP_BUY) || (OrderType() == OP_SELL)))
      Res++;
    
  return(Res);
}

void OnStart()
{
  Print(GetAmountPositions(_Symbol));
}
Нигде не делается проверка на тип счета.
 
Vladislav Andruschenko:
Я хотел узнать как вы вычисляет количество позиций открытых на счёте по текущему символу на 2 счетах. 
//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property script_show_inputs
//--- inputs
input string name="EURUSD";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int pos_total=PositionsTotal(); // общее количество позиций
   int number=0;                   // счётчик
   for(int i=0;i<pos_total;i++)
     {
      if(PositionGetSymbol(i)==name) // возвращает символ соответствующей открытой позиции 
         number++;
     }
   Print("На данный момент по символу ",name," открыто ",number," позиций");
  }
//+------------------------------------------------------------------+

Вот только на неттинге считать открытые позиции бессмысленно - на неттинге всегда может существовать по символу только одна позиция.

 
fxsaber:
ТакНигде не делается проверка на тип счета.

на мт4 меня не интересует, я говорил про МТ5

если в вопросе есть понятие хедж и неттинг - значит вопрос про мт5 

 
Karputov Vladimir:

Вот только на неттинге считать открытые позиции бессмысленно - на неттинге всегда может существовать по символу только одна позиция.

к сожалению Ваш код только для хеджа, 

а нужно одна функция и на хедж и не неттинг

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

а вот например если нужно :

открыть максимально 5 сделок

на хеджевом вообще без вопросов - и Ваша функция помогает - я ее опубликовал в 2 и 1 посту как единственное решение - 5 сделок = 5 позиций . гуд, все как в мт4

а вот на неттинговом счете - позиция 1 а сделок в ней может быть сколько угодно, так вот если в задаче сказано максимум 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);
  }


работает!!! но подглючивает, т.е. не всегда считает количество сделок правильно. вот в чем  вопрос, и этот вопрос скорее к администрации, почему так? 

 

ведь в справке написано:

При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом. 

 

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

 
Vladislav Andruschenko:



Вы определитесь, что Вы хотите делать: считать позиции по символу или считать сделки по символу? Так как непонятно: название темы "Количество ОТКРЫТЫХ ПОЗИЦИЙ..."

 
Karputov Vladimir:

Вы определитесь, что Вы хотите делать: считать позиции по символу или считать сделки по символу? Так как непонятно: название темы "Количество ОТКРЫТЫХ ПОЗИЦИЙ..."


в данном случае речь идет о типе счета:

на неттинговом счете это количество сделок, потому что на неттинговом счете 1 позиция = Х сделок

на хеджевом счете это количество позиций, потому, что 1 позиция = 1 позиция.

 

вот смотрите код:

 

 

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   Comment(CurrentPositionTotalDeals("",Symbol()));
  }
//+------------------------------------------------------------------+
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);
  }

 

 по идее должно выдавать количество позиций по символу

 

запускаем на графике, открываем 1 - все ок, 2 - все ок, 3 позицию открываем и видим:

 


 открыто позиций 3 , а комментарий на графике показывает = 2 

 

открываем 7 позиций, а функция считает что их только 4

 


 

при этом на НЕТТИНГОВОМ СЧЕТЕ, эта функция работает нормально: было открыто 7 сделок, 7 и отображает

 


 
Vladislav Andruschenko:


Вы ещё больше внести сумятицы в переименовании темы. Пожалуйста, определитесь, что Вы хотите подсчитывать: позиции или сделки?
Причина обращения: