Dividir las posiciones abiertas en grupos - página 6

 
Se ha añadido una nueva función, ahora el asesor puede cambiar la casta de un grupo de puestos por otra establecida.
//+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//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);
}
//+------------------------------------------------------------------+
 

Buenas noches. Me gustaría escuchar a los profesionales.

Por favor, indique qué funciones son las más adecuadas para realizar la siguiente tarea:

Necesito abrir varias posiciones (desde el mercado, sin órdenes) y colocar inmediatamente sus entradas en un array.

La dificultad es conseguir estos tickets, no he encontrado ninguna función que abra una posición Y la devuelva con un ticket (como en MT4).

Sólo hay que abrir transacciones en el bucle, parámetros, etc. - no hay preguntas, pero para conseguir un billete sólo hay que abrir una posición, ¡NO HAY!

Por favor, aconséjeme.

De alguna manera es así:

Ticket = Function.Open Position(Buy, 0.01, ......);

 
Sergey Voytsekhovsky:

abrir una posición Y devolver un ticket (como en MT4).

.................... pero para conseguir una entrada de posición recién abierta, ¡¡¡NO!!!

Por favor, avisa.

Cuando me viene a la mente, sólo para solicitar un billete de la última posición abierta en la historia. Pero de alguna manera me parece torpe, demasiado ambiguo, no hay una conexión directa entre la orden en código y la posición abierta. Seguro que hay métodos más correctos, quien tenga ideas o quizás suficiente experiencia, que lo comparta por favor.

 
Sergey Voytsekhovsky:

Lo único que se me ocurre es solicitar un billete para la última posición abierta en el historial. Pero de alguna manera me parece un poco desordenado, demasiado ambiguo, no hay una conexión directa entre la orden en el código y la posición abierta. Seguro que hay métodos más correctos, ¿quién tiene ideas o tal vez tiene suficiente experiencia, comparta por favor?

He descrito todo esto en artículos. Para mql5 y mql4 todo se hace allí. Puedes tomar una idea y hacer una función.

Sin embargo. Tiene una transacción en la que se escribe el identificador de posición. Lea sobre los acuerdos y sus propiedades en la documentación.

 
Sergey Voytsekhovsky:

Buenas noches. Me gustaría escuchar a los profesionales.

Por favor, indique qué funciones son las más adecuadas para realizar la siguiente tarea:

Necesito abrir varias posiciones (desde el mercado, sin órdenes) y colocar inmediatamente sus entradas en un array.

La dificultad es conseguir estos tickets, no he encontrado ninguna función que abra una posición Y la devuelva con un ticket (como en MT4).

Sólo hay que abrir transacciones en el bucle, parámetros, etc. - no hay preguntas, pero para conseguir un billete sólo hay que abrir una posición, ¡NO HAY!

Por favor, aconséjeme.

De alguna manera es así:

Ticket = Function.Open Position(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:

Lo he descrito todo en los artículos. Para mql5 y mql4 todo se hace allí. Puedes tomar la idea y hacer la función.

Sin embargo. Tienes un acuerdo en el que se escribe un identificador de posición. Lea sobre los acuerdos y sus propiedades en la documentación.

Muchas gracias, voy a investigar.

 
Alexey Viktorov:

Genial, eso es algo que hay que hacer ahora :-). Lo resolveré y me aseguraré de publicar el resultado, tal vez ayude a alguien más también.

 
Sergey Voytsekhovsky:

Genial, eso es algo que hay que hacer ahora :-). Lo resolveré y me aseguraré de publicar el resultado, tal vez ayude a alguien más también.

Hay muy pocas personas que no lo sepan. Y los que no lo saben deberían poder hacerlo después de leer este hilo. Si no pueden, no es asunto del rey... para hurgar.

 
Artyom Trishkin:

Lo he descrito todo en los artículos. Para mql5 y mql4 todo se hace allí. Puedes tomar la idea y hacer una función.

Gracias, ¿en cuál de sus artículos exactamente? Tienes muchos de ellos.....

 

Buenas tardes.

De nuevo, apelo a los gurús de este foro.

He escrito una pequeña función. Funciona, pero muy lentamente. Entiendo que el algoritmo es extremadamente ineficiente. Lo leí aquí:

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

que hayuna función para añadir al final de un array.

No entiendo cómo usarlo, por favor ayúdame a poner en marcha mi imaginación, codificaré por colores el área de interés.

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