Discusión sobre el artículo "Indicador de posiciones históricas en el gráfico como diagrama de sus ganancias/pérdidas"

 

Artículo publicado Indicador de posiciones históricas en el gráfico como diagrama de sus ganancias/pérdidas:

En el artículo analizaremos una variante para obtener información sobre posiciones cerradas usando la historia de sus transacciones. Asimismo, crearemos un indicador sencillo que mostrará en forma de gráfico los beneficios/pérdidas aproximados de las posiciones en cada barra.

La función recibirá el precio (Close de la barra) en relación al cual deberemos recibir el número de puntos de beneficio de la posición, y el momento en el que se comprobará la existencia de la posición (Time open de la barra). Además, se sumará y se retornará el beneficio de todas las posiciones obtenidas de cada objeto de posiciones históricas.

Tras realizar la compilación, podremos ejecutar el indicador en un gráfico de símbolos en el que haya muchas posiciones abiertas, y este dibujará el gráfico de beneficio de todas las posiciones históricas:

Autor: Artyom Trishkin

 
Interesante artículo, ¡gracias!
 
Tema pesado. MT5.
 
Sí.... un trabajo realmente interesante y útil. De momento le he echado un vistazo. Lo releeré detenidamente. Utilizaré secciones de código en mis desarrollos.
Gracias.
 
Es una pena que MQ no haya añadido la función HistoryPositionGet a la lista de funciones de Historia. Habría sido mucho más fácil con ella.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:
Es una pena que MQ no haya añadido la función HistoryPositionGet a la lista de funciones de Historia. Habría sido mucho más fácil con ella.

Por eso tenemos que hacerlo nosotros mismos

 

Hola,

¿cómo puedo hacer que el indicador no muestre cada ganancia/pérdida, sino un total acumulativo?

¡¡y si es posible - con una línea ?!!

 
Roman Kutemov #:

Hola,

¿cómo puedo hacer que el indicador de mostrar no todos los beneficios / pérdidas, pero el total acumulado?

¡¡y si es posible - con una linea ?!!

Por una corazonada y sin comprobarlo, solo hay que sumar el beneficio al ya recibido, y no registrarlo cada vez el tomado de las posiciones.

Eso es lo que hay:

//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizada |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Establecer la indexación de las matrices close y time como en series temporales
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(time,true);
//--- Indicador de creación correcta de la lista de elementos
   static bool done=false;
//--- Si se crea el objeto de datos de posición
   if(history!=NULL)
     {
      //--- Si aún no se ha creado la lista de elementos
      if(!done)
        {
         //--- Si la lista de posiciones para el instrumento actual se crea con éxito,
         if(history.CreatePositionList(Symbol()))
           {
            //--- imprimir las posiciones en el diario y fijar la bandera para la creación exitosa de la lista de posiciones
            history.Print();
            done=true;
           }
        }
     }
//--- Número de barras necesarias para el cálculo del indicador
   int limit=rates_total-prev_calculated;
//--- Si el límite es mayor que 1, significa que se trata de la primera ejecución o de un cambio en los datos históricos
   if(limit>1)
     {
      //--- Establecer el número de barras para el cálculo igual a toda la historia disponible e inicializar los buffers con valores "vacíos
      limit=rates_total-1;
      ArrayInitialize(BufferFilling1,EMPTY_VALUE);
      ArrayInitialize(BufferFilling2,EMPTY_VALUE);
     }
//--- En el bucle de la barra de historial de símbolos
   static double profit=0;
   for(int i=limit;i>=0;i--)
     {
      //--- obtener el beneficio de las posiciones presentes en la barra con índice de ciclo i y escribir el valor obtenido en el primer buffer
      profit+= Profit(close[i],time[i]);
      BufferFilling1[i]=profit;
      //--- Escribe siempre cero en el segundo buffer. Dependiendo de si el valor en el primer buffer es mayor o menor que cero,
      //--- el color del relleno dibujado cambiará entre las matrices 1 y 2 del buffer del indicador
      BufferFilling2[i]=0;
     }
//--- valor de retorno de prev_calculado para la siguiente llamada
   return(rates_total);
  }

Bueno, y con el búfer como una línea - es a sí mismos. Allí usted necesita para eliminar un búfer extra, porque el relleno siempre utiliza dos búferes. Y para una línea que necesita uno.

 

Creo que funciona.

Hice tus cambios y sólo especifiqué el tipo - gráficos lineales.

No he quitado los buffers.

https://www.mql5.com/ru/charts/18738352/nzdcad-d1-roboforex-ltd

График NZDCAD, D1, 2024.01.03 16:11 UTC, RoboForex Ltd, MetaTrader 5, Real
График NZDCAD, D1, 2024.01.03 16:11 UTC, RoboForex Ltd, MetaTrader 5, Real
  • www.mql5.com
Символ: NZDCAD. Период графика: D1. Брокер: RoboForex Ltd. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2024.01.03 16:11 UTC.
Archivos adjuntos:
 
Todo parece ir bien en las divisas, pero en la plata se redibuja constantemente por alguna razón.
 
Roman Kutemov #:
Todo parece ir bien en las divisas, pero en la plata se redibuja constantemente por alguna razón.

Es necesario mirar qué datos recibe el indicador y por qué no se calcula. El redibujado puede ser causado por el valor límite mayor que 1. Este valor se calcula como la diferencia entre rates_total y prev_calculated. Es necesario mirar estos valores para ver lo que contienen en cada tick