Discussão do artigo "Indicador de posições históricas no gráfico em forma de diagrama de lucro/prejuízo"

 

Novo artigo Indicador de posições históricas no gráfico em forma de diagrama de lucro/prejuízo foi publicado:

Vamos falar sobre como obter informações sobre posições fechadas usando o histórico de negociações. Vamos criar um indicador simples que mostra um diagrama aproximado de lucro/prejuízo das posições em cada barra.

A função recebe o preço (fechamento da barra) em relação ao qual o número de pontos de lucro da posição deve ser obtido, e o tempo em que se verifica a existência da posição (tempo de abertura da barra). Em seguida, o lucro de todas as posições, obtido de cada objeto de posições históricas, é somado e retornado.

Após a compilação, o indicador pode ser executado no gráfico de um símbolo onde houve muitas posições abertas, e ele desenhará um diagrama de lucro de todas as posições históricas:

Autor: Artyom Trishkin

 
Artigo interessante, obrigado!
 
Tópico pesado. MT5.
 
Sim.... um trabalho realmente interessante e útil. Até agora, dei uma olhada nele. Vou relê-lo completamente. Usarei as seções de código em meus desenvolvimentos.
Obrigado.
 
É lamentável que o MQ não tenha adicionado a função HistoryPositionGet à lista de funções de histórico. Teria sido muito mais fácil com ela.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:
É lamentável que o MQ não tenha adicionado a função HistoryPositionGet à lista de funções de histórico. Teria sido muito mais fácil com ela.

É por isso que temos que fazer isso nós mesmos

 

Olá,

Como posso fazer com que o indicador mostre não cada lucro/perda, mas um total acumulado?

E, se possível, com uma linha?!

 
Roman Kutemov #:

Olá,

Como posso fazer com que o indicador mostre não cada lucro/perda, mas o total acumulado?

E, se possível, com uma linha?!

Com base em um palpite e sem verificar, você só precisa adicionar o lucro ao já recebido, e não registrá-lo sempre que for retirado das posições.

Éassim que funciona:

//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado
//+------------------------------------------------------------------+
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[])
  {
//--- Definir a indexação das matrizes close e time como em séries temporais
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(time,true);
//--- Sinalizador para a criação bem-sucedida da lista de itens
   static bool done=false;
//--- Se o objeto de dados de posição for criado
   if(history!=NULL)
     {
      //--- Se a lista de itens ainda não tiver sido criada
      if(!done)
        {
         //--- Se a lista de posições do instrumento atual for criada com sucesso,
         if(history.CreatePositionList(Symbol()))
           {
            //--- imprimir posições no diário e definir o sinalizador para a criação bem-sucedida da lista de posições
            history.Print();
            done=true;
           }
        }
     }
//--- Número de barras necessárias para o cálculo do indicador
   int limit=rates_total-prev_calculated;
//--- Se o limite for maior que 1, significa que essa é a primeira execução ou uma alteração nos dados históricos
   if(limit>1)
     {
      //--- Definir o número de barras para cálculo igual a todo o histórico disponível e inicializar os buffers com valores "vazios".
      limit=rates_total-1;
      ArrayInitialize(BufferFilling1,EMPTY_VALUE);
      ArrayInitialize(BufferFilling2,EMPTY_VALUE);
     }
//--- No loop da barra de histórico de símbolos
   static double profit=0;
   for(int i=limit;i>=0;i--)
     {
      //--- obter o lucro das posições presentes na barra com índice de ciclo i e gravar o valor obtido no primeiro buffer
      profit+= Profit(close[i],time[i]);
      BufferFilling1[i]=profit;
      //--- Sempre escreva zero no segundo buffer. Dependendo do fato de o valor no primeiro buffer ser maior ou menor que zero,
      //--- a cor do preenchimento desenhado mudará entre as matrizes 1 e 2 do buffer do indicador
      BufferFilling2[i]=0;
     }
//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }

Bem, e com o buffer como uma linha - são eles mesmos. Aí você precisa remover um buffer extra, porque o preenchimento sempre usa dois buffers. E para uma linha você precisa de um.

 

Acho que está funcionando.

Fiz suas alterações e especifiquei apenas o tipo - gráficos de linha.

Não removi os 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.
Arquivos anexados:
 
Tudo parece estar bem nas moedas, mas na prata, por algum motivo, ela está sendo constantemente redesenhada.
 
Roman Kutemov #:
Tudo parece estar bem com as moedas, mas com a prata ele está sendo constantemente redesenhado por algum motivo.

É necessário verificar quais dados o indicador recebe e por que eles não são calculados. O redesenho pode ser causado pelo valor limite maior que 1. Esse valor é calculado como a diferença entre rates_total e prev_calculated. Você precisa examinar esses valores para ver o que eles contêm em cada tick