Criando indicador

 

Bom dia Prezados,

Estou tentando criar esse indicador. Ele foi plotado no gráfico, porém ficou uma linha reta.

Acredito que ficou uma linha reta, pois estou conseguindo calcular apenas a o candle 1 e 2.

Pergunta: como eu faço para estender esse desconto de 3% para todo o gráfico considerando a mínima dos dois candles anteriores para ir acompanhando os sinais anteriores?

int OnInit()
  {
   
   SetIndexBuffer(0, indBuffer, INDICATOR_DATA);
   
   ArrayInitialize(indBuffer, EMPTY_VALUE);
   
   DiaMinima1 = iLow(_Symbol, PERIOD_D1, 1); // calcula a minima do dia anterior
   DiaMinima2 = iLow(_Symbol, PERIOD_D1, 2); // calcula a minima do penultimo dia
   
   Print("Minína1: " +(string)DiaMinima1);
   Print("Minína2: " +(string)DiaMinima2);
               
   valorMinimo = MathMin(DiaMinima1, DiaMinima2);
   Print("O valor minimo é: " +(string)valorMinimo);
               
   valorDesc = valorMinimo * 0.97;
   Print("O valor é: " +(string)valorDesc);

   return(INIT_SUCCEEDED);
  }

Visualize isto! Biblioteca gráfica em linguagem MQL5 como equivalente a plot de R
Visualize isto! Biblioteca gráfica em linguagem MQL5 como equivalente a plot de R
  • www.mql5.com
A exibição visual usando gráficos desempenha um importante papel na exploração e estudo de padrões regulares. Nas populares linguagens de programação entre a comunidade científica, tais como R e Python, a função especial plot é destinada para visualização. Com ela você pode desenhar linhas, gráficos de dispersão e histogramas para visualizar padrões. Em linguagem MQL5 você pode fazer a mesma coisa usando a classe CGraphics.
Arquivos anexados:
DESCONTO_3u.png  13 kb
 
Philzaum:

Bom dia Prezados,

Estou tentando criar esse indicador. Ele foi plotado no gráfico, porém ficou uma linha reta.

Acredito que ficou uma linha reta, pois estou conseguindo calcular apenas a o candle 1 e 2.

Pergunta: como eu faço para estender esse desconto de 3% para todo o gráfico considerando a mínima dos dois candles anteriores para ir acompanhando os sinais anteriores?

Post o codigo completo, nao da pra saber o que voce errou so com a funcao de inicializacao onde voce não populou o array de desenho... Além disso, esses erros de ficar uma linha aleatoria (pode ser reta horizontal, vertical pra baixo/cima, etc) costuma ser o array nao populado naquele lugar.

 
Ricardo Rodrigues Lucca #:

Post o codigo completo, nao da pra saber o que voce errou so com a funcao de inicializacao onde voce não populou o array de desenho... Além disso, esses erros de ficar uma linha aleatoria (pode ser reta horizontal, vertical pra baixo/cima, etc) costuma ser o array nao populado naquele lugar.

Ricardo, obrigado pela ajuda. Segue o código completo. Acho que essa questão de popular array nunca nem ouvir falar, pois sou iniciante dms.

Segue o código completo:

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Propriedades                                                     |
//+------------------------------------------------------------------+
#property indicator_buffers 1
#property indicator_plots   1  

//PLOT LABEL
#property indicator_label1  "Entrada"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_width1  2


// #property indicator_style STYLE_DASHDOT = traços
double indBuffer[];

double DiaMinima1, DiaMinima2;
double valorMinimo;
double valorDesc;
double valorStop;



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int OnInit()
  {
   
   SetIndexBuffer(0, indBuffer, INDICATOR_DATA);
   
   ArrayInitialize(indBuffer, EMPTY_VALUE);
   
   DiaMinima1 = iLow(_Symbol, PERIOD_D1, 1); // calcula a minima do dia anterior
   DiaMinima2 = iLow(_Symbol, PERIOD_D1, 2); // calcula a minima do penultimo dia
   
   Print("Minína1: " +(string)DiaMinima1);
   Print("Minína2: " +(string)DiaMinima2);
               
   valorMinimo = MathMin(DiaMinima1, DiaMinima2);
   Print("O valor minimo é: " +(string)valorMinimo);
               
   valorDesc = valorMinimo * 0.97;
   Print("O valor é: " +(string)valorDesc);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   
   if(prev_calculated == 00)
   {
    for(int i=0;i<rates_total;i++)
      {
         indBuffer[i] = valorMinimo * 0.97;    
      }
   }
   
//--- return value of prev_calculated for next call
   return(rates_total);
   }
//+------------------------------------------------------------------+
além disso, no profit eu colocava só isso:

        Plot(lowest(Close,1)[1]*0.975);
 
Philzaum #:
Ricardo, obrigado pela ajuda. Segue o código completo. Acho que essa questão de popular array nunca nem ouvir falar, pois sou iniciante dms.

Segue o código completo:

além disso, no profit eu colocava só isso:

tira o if do prev_calculated e deixa o for que esta dentro. Ele que popula o vetor de desenho.

O IF esta fazendo o for executar somente uma vez no primeiro calculo que ele faz quando o prev* tem valor de zero, na segunda interacao o valor vai ser diferente e seu codigo nao executa. O for passando de zero pra rates_total costuma ser ineficiente porque tu ja tem de conhecimento que prev_calculated foi calculado antes (ou se nao foi veio zero) e poderia evitar de fazer o calculo com i=0. Poderia por simplificacao, mudar o i=0 por i=prev_calculated e alterar o return para ser rates_total - 1. Isso forcaria o mt5 a na vela atual ficar sempre recalculando.

EDIT: Lembrando que isso vai "alongar" o desenho so, tu precisaria jogar o codigo da inicializacao nessa funcao para ter a atualizacao dos 3%.
 
Ricardo Rodrigues Lucca #:

tira o if do prev_calculated e deixa o for que esta dentro. Ele que popula o vetor de desenho.

O IF esta fazendo o for executar somente uma vez no primeiro calculo que ele faz quando o prev* tem valor de zero, na segunda interacao o valor vai ser diferente e seu codigo nao executa. O for passando de zero pra rates_total costuma ser ineficiente porque tu ja tem de conhecimento que prev_calculated foi calculado antes (ou se nao foi veio zero) e poderia evitar de fazer o calculo com i=0. Poderia por simplificacao, mudar o i=0 por i=prev_calculated e alterar o return para ser rates_total - 1. Isso forcaria o mt5 a na vela atual ficar sempre recalculando.

EDIT: Lembrando que isso vai "alongar" o desenho so, tu precisaria jogar o codigo da inicializacao nessa funcao para ter a atualizacao dos 3%.
Prezado, obrigado. Tentei aqui deixar esse linha dinâmica, mas me faltou conhecimento kkk. vou estudar mais. Abraxx