Dividir as posições em aberto em grupos - página 6

 
Adicionada uma nova função, agora o assessor pode mudar a casta de um grupo de cargos para outra dada função.
//+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//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);
}
//+------------------------------------------------------------------+
 

Boa noite. Eu gostaria de ouvir os profissionais.

Por favor, informe quais funções são melhores a serem utilizadas quando a seguinte tarefa precisar ser feita:

Preciso abrir várias posições (do mercado, sem ordens) e imediatamente colocar seus bilhetes em uma matriz.

A dificuldade é conseguir estes bilhetes, não encontrei nenhuma função que abra uma posição E devolva-a com um bilhete (como no MT4).

Basta abrir transações no loop, parâmetros, etc. - sem perguntas, mas para obter um bilhete basta abrir uma posição, NÃO TER!

Por favor, informe plz.

De alguma forma, é assim:

Ticket = Função.Posição Aberta(Buy, 0.01, ......);

 
Sergey Voytsekhovsky:

abrir uma posição E devolver um bilhete (como no MT4).

.................... mas para obter um bilhete de posição recém-aberta, eu preciso!!!

Por favor, informe.

Quando me lembro, só posso solicitar um bilhete da última posição aberta. Mas de alguma forma me parece desajeitado, muito ambíguo, não há conexão direta entre a ordem em código e a posição aberta. Com certeza existem métodos mais corretos, quem tem idéias ou talvez experiência suficiente, compartilhe por favor?

 
Sergey Voytsekhovsky:

A única coisa que vem à mente é solicitar um ingresso para a última posição aberta na história. Mas de alguma forma me parece desajeitado, muito ambíguo, não há conexão direta entre a ordem no código e a posição aberta. Com certeza existem métodos mais corretos, quem tem idéias ou talvez tenha experiência suficiente, compartilhe por favor?

Descrevi tudo isso em artigos. Para mql5 e mql4, tudo é feito ali. Você pode pegar uma idéia e fazer uma função.

No entanto. Você tem uma transação na qual o identificador de posição está escrito. Leia sobre os negócios e suas propriedades na documentação.

 
Sergey Voytsekhovsky:

Boa noite. Eu gostaria de ouvir os profissionais.

Por favor, informe quais funções são melhores a serem utilizadas quando a seguinte tarefa precisar ser feita:

Preciso abrir várias posições (do mercado, sem ordens) e imediatamente colocar seus bilhetes em uma matriz.

A dificuldade é conseguir estes bilhetes, não encontrei nenhuma função que abra uma posição E devolva-a com um bilhete (como no MT4).

Basta abrir transações no loop, parâmetros, etc. - sem perguntas, mas para obter um bilhete basta abrir uma posição, NÃO TER!

Por favor, informe plz.

De alguma forma, é assim:

Ticket = Função.Posição Aberta(Buy, 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:

Descrevi tudo isso nos artigos. Para mql5 e mql4, tudo é feito ali. Você pode pegar a idéia e fazer a função.

No entanto. Você tem um acordo no qual está escrito um identificador de posição. Leia sobre os negócios e suas propriedades na documentação.

Muito obrigado, vou investigar.

 
Alexey Viktorov:

Ótimo, isso é algo a se fazer agora :-). Vou descobrir e ter certeza de publicar o resultado, talvez ajude também outra pessoa.

 
Sergey Voytsekhovsky:

Ótimo, isso é algo a se fazer agora :-). Vou descobrir e ter certeza de publicar o resultado, talvez ajude também outra pessoa.

Há muito poucas pessoas que não sabem. E aqueles que não sabem devem ser capazes de fazer isso depois de ler este tópico. Se não podem, não é assunto do rei... para bisbilhotar.

 
Artyom Trishkin:

Descrevi tudo isso nos artigos. Para mql5 e mql4, tudo é feito ali. Você pode pegar a idéia e fazer uma função.

Obrigado, em qual de seus artigos exatamente? Você tem tantos deles.....

 

Boa tarde.

Mais uma vez, estou apelando para os gurus deste fórum.

Eu escrevi uma pequena função. Funciona, mas muito lentamente. Entendo que o algoritmo é extremamente ineficiente. Eu o li aqui:

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

que háuma função a ser acrescentada ao final de uma matriz.

Não entendo como usá-lo, você pode me ajudar a colocar minha imaginação de volta no caminho certo, eu vou colorir a área de interesse.

//+------------------------------------------------------------------+
//| Заполняем структуру своих позиций
//+------------------------------------------------------------------+
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);
}