Разделение открытых позиций на группы - страница 6

 
Добавил новую функцию, теперь советник умеет менять касту группы позиций на другую заданную.
//+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//array_base[][observations] основная база, в которой нужно провести изменения
//array_change[]             массив с тикетами позиций, касту которых нужно изменить
//array_change[]             номер касты, к которой нужно приписать позиции
//+------------------------------------------------------------------+
int Transfer_Positions_Specified_Caste_by_Tickets(int &array_base[][observations], 
                                                  int &array_change[], 
                                                  int new_caste){
int size_change = ArraySize (array_change);
int size_base   = ArrayRange(array_base,0);

   for(int i=0; i<size_change; i++){
      int ticket_change = array_change[i];
      for(int a=0; a<size_base; a++){
         if(array_base[a][0] == ticket_change ||
            array_base[a][1] == ticket_change){
            array_base[a][2]  = new_caste;
            break;}}}    
   ArrayFree(array_change);
       
return(size_change);
}
//+------------------------------------------------------------------+
 

Добрый вечер. Прошу откликнуться профи.

Подскажите плиз, какими функциями лучше всего воспользоваться, если нужно выполнить такую задачу:

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

Трудность вызывает получение этих тикетов, не нашел фукций, открывающих позицию И возвращающих ее тикет (как в МТ4).

Просто открыть сделки, в цикле, параметры и прочее - вопросов не вызывает, а вот получить тикет только-что открытой позиции, НЕ НАЙДУ!!!

Подскажите плиз.

Как нибудь так: 

Тикет = Функция.ОткрытьПозицию(Бай, 0.01, ......);

 
Sergey Voytsekhovsky:

 открывающих позицию И возвращающих ее тикет (как в МТ4).

.................... а вот получить тикет только-что открытой позиции, НЕ НАЙДУ!!!

Подскажите плиз.

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

 
Sergey Voytsekhovsky:

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

Я описывал всё это в статьях. Для mql5 и mql4  всё там сделано. Идею можете взять и сделать функцию.

Впрочем. У вас есть сделка, в которую прописывается идентификатор позиции. Почитайте о сделках и их свойствах в документации.

 
Sergey Voytsekhovsky:

Добрый вечер. Прошу откликнуться профи.

Подскажите плиз, какими функциями лучше всего воспользоваться, если нужно выполнить такую задачу:

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

Трудность вызывает получение этих тикетов, не нашел фукций, открывающих позицию И возвращающих ее тикет (как в МТ4).

Просто открыть сделки, в цикле, параметры и прочее - вопросов не вызывает, а вот получить тикет только-что открытой позиции, НЕ НАЙДУ!!!

Подскажите плиз.

Как нибудь так: 

Тикет = Функция.ОткрытьПозицию(Бай, 0.01, ......);

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
   {
    ulong ticket = trans.position; // тикет позиции
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
      {
      }
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)// закрылась позиция
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP)
     }
   }
 }
 
Artyom Trishkin:

Я описывал всё это в статьях. Для mql5 и mql4  всё там сделано. Идею можете взять и сделать функцию.

Впрочем. У вас есть сделка, в которую прописывается идентификатор позиции. Почитайте о сделках и их свойствах в документации.

Спасибо большое, пошёл лопатить.

 
Alexey Viktorov:

Великолепно, есть таки теперь чем заниматься :-). Разберусь и обязательно выложу результат, может тоже кому-то поможет.

 
Sergey Voytsekhovsky:

Великолепно, есть таки теперь чем заниматься :-). Разберусь и обязательно выложу результат, может тоже кому-то поможет.

Это мало кто не знает. А кто не знает почитав эту тему должны суметь. Не сумеет, значит не царское дело ... ковыряться.

 
Artyom Trishkin:

Я описывал всё это в статьях. Для mql5 и mql4  всё там сделано. Идею можете взять и сделать функцию.

Спасибо, в какой именно из Ваших статей? У Вас их так много.....

 

Добрый день. 

Снова обращаюсь к гуру этого форума.

Написал небольшую функцию. Она работает, но очень медленно. Понимаю что алгоритм крайне неэффективный. Вычитал вот здесь: 

https://www.mql5.com/ru/articles/567 

что есть Функция добавления в конец массива

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

//+------------------------------------------------------------------+
//| Заполняем структуру своих позиций
//+------------------------------------------------------------------+
int Fill_Position_Structure(int kodclana)
{
   int n = 0;
   if(!Refresh_Rates())return(false);
   int SizeTotalPosition = PositionsTotal();
   int SizeArrayPosition = ArraySize(ArrayPosition);
//---Запись новых позиций в структуру        
   for(int i=0; i < SizeTotalPosition; i++)
      {//---Из списка открытых позиций выбираю очередную, предполагаю что она НОВАЯ, определяю ее ВремяЖизни, 
       //----проверяю есть ли она в массиве позиций, если есть, значит СТАРАЯ, обновляю ВремяЖизни, считаю, выхожу. 
         bool  new_pos  = true;
         ulong ticket   = PositionGetTicket(i);
         int   lifetime = DatetimeToInteger(TimeCurrent() - m_position.Time());
         SizeArrayPosition = ArraySize(ArrayPosition);
         for(int y = 0; y < SizeArrayPosition; y++)
            {
               if(ArrayPosition[y].ticket_pos == ticket)
                  {
                     ArrayPosition[y].lifetime_candle = lifetime/60*_Period;
                     ArrayPosition[y].lifetime_sek    = lifetime;
                     ArrayPosition[y].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
                     new_pos = false;
                     n++;
                     break;
                  }
            }
         if(new_pos)
            {//---Если НОВАЯ, забиваю позицию в массив со всеми параметрами
               ArrayResize(ArrayPosition, SizeArrayPosition+1, 1);
               ArrayPosition[SizeArrayPosition].lifetime_candle = lifetime/60*_Period;
               ArrayPosition[SizeArrayPosition].lifetime_sek    = lifetime;
               ArrayPosition[SizeArrayPosition].ticket_pos      = ticket;
               ArrayPosition[SizeArrayPosition].kod_clana       = kodclana;
               ArrayPosition[SizeArrayPosition].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
               ArrayPosition[SizeArrayPosition].type            = m_position.PositionType();
               n++;
            }
      }   
//---Удаление закрытых позиций из структуры  
      SizeArrayPosition = ArraySize(ArrayPosition);
      SizeTotalPosition = PositionsTotal();
      
      for(int z = 0; z < SizeArrayPosition; z++)
         {
            ulong ticket_cl   = ArrayPosition[z].ticket_pos;
            bool  cl_position = true;
            
            for(int i = 0; i < SizeTotalPosition; i++)
               {
                  if(ticket_cl == PositionGetTicket(i))
                     {
                        cl_position = false;
                        n++;
                        break;
                     }
                }
            if(cl_position)
               {
               ArrayRemove(ArrayPosition,z,1);
               Sleep(SLEEPTIME*slp);
               SizeArrayPosition = ArraySize(ArrayPosition);
               }
         }
return(n);
}
Причина обращения: