Discussão do artigo "Escrita de indicadores de bolsa com controle de volume usando o indicador delta como exemplo" - página 9

 
Aleksey Vyazmikin:

Se considerarmos os juros abertos, esse é o tipo de código que você tinha em mente?

Delta negociado, estou me referindo ao indicador, no tópico em que nosso diálogo está acontecendo

Então, você resume esses deltas em uma janela flutuante (por exemplo, os últimos 100) ou em ordem crescente (n+1 a partir de uma determinada data, por exemplo, a partir da data de início do dia atual), para qual período? Por que para esse período?

Bem, sim, esse código é aproximadamente. Se estiver em %, então * 100. Isso é mais adequado para robôs, pois visualmente é melhor olhar para os valores absolutos, na minha opinião.

Tenho várias janelas para diferentes táticas. Algo parecido com isso:


 

Supondo que os futuros comecem a ser negociados ativamente (e, para alguns mercados, determinem globalmente os preços dos ativos, como 6B,6E,RB,CL,GC) assim que se tornarem os mais próximos, o delta deve ser resumido a partir do início dessa data.

Se você trabalha com delta em ações, é muito mais difícil determinar o ponto de partida. Na realidade, a maioria dos sistemas (como o ClusterDelta) usa uma janela móvel fixa, por exemplo, 90 barras. Entretanto, se você pensar com cuidado, provavelmente será mais correto usar algum extremo de preço no passado, por exemplo, 30 dias, como ponto de referência

 

Sr. Kozitsyn,

Parabéns pelo excelente trabalho! Esse é o melhor indicador de Delta até agora, muito rápido.

Tentei modificá-lo para plotar apenas valores positivos com cores diferentes para comprar/vender delta (melhor para comparar o tamanho das barras do histograma), sem sucesso.

Outra pergunta: é possível plotar um histograma vertical em vez de horizontal? Tentei plotar um histograma vertical usando https://www.mql5.com/pt/articles/2714, mas ele não plotou nenhum valor; de fato, tentei plotar valores de volume no histograma vertical e ele não plotou nenhum valor de volume ( usei NormalizeDouble para converter de long para double).

Muito obrigado!

Statistical distributions in the form of histograms without indicator buffers and arrays
Statistical distributions in the form of histograms without indicator buffers and arrays
  • www.mql5.com
Histograms allow researchers to visually evaluate the distribution of statistical data grouped by the frequency of their penetration into a certain (predetermined) interval. Histograms and their use in the statistical data analysis are a well-studied topic with multiple articles devoted to it [1, 2, 3, 4, 5, 6, 7] and a large number of CodeBase...
[Excluído]  
frcardim:

Sr. Kozitsyn,

Parabéns pelo ótimo trabalho! Este é o melhor indicador Delta até agora, muito rápido.

Obrigado!

Tentei modificá-lo para plotar somente valores positivos com cores diferentes para comprar/vender delta (melhor para comparar o tamanho das barras do histograma), sem sucesso. Você poderia dar alguma dica de como fazer isso ou postar onde deveria modificar o código original?

Substitua a função DisplayValues() por esta:

//+------------------------------------------------------------------+
//| Отображение значений индикатора|
//+------------------------------------------------------------------+
void DisplayValues(const int index,// Номер свечи
                   const long sumVolBuy,// Суммарный объем покупок
                   const long sumVolSell,          // Суммарный объем продаж
                   const int line                  // Номер строки вызова функции
                   )
  {
//--- Проверяем корректность номера свечи
   if(index<0) // Если некорректный номер
     {
      Print(__FUNCTION__,": ОШИБКА! Некорректный номер свечи '",index,"'");
      return;                                       // Выходим
     }
//--- Рассчитаем дельту
   const double delta=double(sumVolBuy-sumVolSell);
//--- Заносим значения в буферы
   //bufDelta[ index ]= delta; // Записываем значение дельты
   bufDelta[ index ]= (delta>0) ? delta : -delta;  // Записываем значение дельты
   bufDeltaColor[ index ] =(delta>0) ?  0 : 1;     // Записываем цвет значения
   bufBuyVol[ index ] = (double)sumVolBuy;         // Записываем сумму покупок
   bufSellVol[ index ]=(double)sumVolSell;         // Записываем сумму продаж
  }

Outra pergunta: é possível plotar um histograma vertical em vez de horizontal?

Isso não é possível nesse indicador.
 

Sr. Kozitsyn,


Antes de tudo, parabéns!!! Excelente, excelente, excelente trabalho!!! É isso que estou procurando.

No entanto, esse indicador é metade do meu desejo. Gostaria de desenhar uma banda de Bolinger sobre o indicador delta para me mostrar onde o fluxo de dinheiro é maior do que o comportamento normal. Tentei fazer isso, mas não consegui ver as linhas das bandas de Bolinger na mesma janela. Você poderia me ajudar?

Muito obrigado!!!


Rodrigo Pimenta

[Excluído]  
rpimentaf:

Você poderia me ajudar?

Muito obrigado!!!


Rodrigo Pimenta

Desculpe, mas eu não trabalho com o BB.

Você pode usar o Freelance para sua tarefa.

 
Alexey Kozitsyn:

Em geral, em nosso mercado, usando ticks e vidro, é possível fazer coisas muito legais.

Concordo com você. Estou observando o Delta há muito tempo, mas não o uso com frequência

Você tem um ótimo indicador, que funciona para mim até mesmo nos finais de semana!

Observo o delta em intervalos de tempo inferiores a um minuto, quando o preço rompe a máxima local e, em vez de stops (delta azul), há vendas no mercado. Normalmente, após essa configuração, o preço faz uma correção.

imagem

Bem, é exatamente assim, apenas no tópico.

Minha pergunta é diferente. Comecei recentemente a aprender a escrever indicadores. Estou dominando-os lentamente, usando o método científico e o copypaste.

Eu queria escrever um indicador de divergência delta. Este é o código do delta que vende o delta das barras AP (vermelho) e o delta azul das barras de baixa.

Com a ajuda de seu indicador, por meio do iCustom, meu indicador funciona normalmente.

Mas como estou aprendendo, estou interessado em escrever o meu próprio indicador. E meu próprio indicador não funciona (. É o terceiro dia em que estou batendo nele, e ele não cede. Se não for difícil, por favor, me diga qual é o erro.

A lógica para determinar o delta é a seguinte: como não preciso do delta na barra atual, decidi que posso calcular o delta usando o volume de ticks da barra anterior OnCalculate, tick_volume[] , como o número de ticks ao copiar CopyTicks. O meta-editor compila, mas emite um aviso de que eu uso tipos de dados diferentes em tick volume long e, em CopyTicks, é necessário especificar o número de ticks em uint. A hora do início da cópia é obtida no mesmo time[],

Ao testar no testador, ele dá o erro "Array out of range", e não consigo entender quais limites ele ultrapassa e como determinar o que mudar para que o indicador não funcione, mas pelo menos remover esse erro.

Aqui está o código do somador, por favor, não ria muito.

#property indicator_chart_window 
#property indicator_buffers 5 
#property indicator_plots   1
  
#property indicator_label1  "Diver_handl" 
#property indicator_type1   DRAW_COLOR_CANDLES 
//--- definir 2 cores para pintar as velas (elas são armazenadas no buffer de cores) 
#property indicator_color1  clrRed,clrBlue
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 // espessura do desenho da linha, não é realmente necessária aqui.

//--- parâmetros de entrada 
//--- buffers de indicadores
double         ColorCandlesBuffer1[];//bufões de velas
double         ColorCandlesBuffer2[];
double         ColorCandlesBuffer3[];
double         ColorCandlesBuffer4[];
double         ColorCandlesColors[]; // Buffer de cores

string symbol;  //--- nome do caractere 
double _Delta;
//+------------------------------------------------------------------+ 
//| Função de inicialização do indicador personalizado 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- mapeamento de buffers de indicadores 
   SetIndexBuffer(0,ColorCandlesBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorCandlesBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorCandlesBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,ColorCandlesBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
   
//--- valor vazio (valor que não será desenhado) 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   
//--- nome do símbolo pelo qual as barras são desenhadas 
   symbol=_Symbol;
   
//--- definir a exibição do símbolo 
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"Diver("+symbol+")");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+ 
//| 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[])
  {
   int i,limit;
   int buf_size=rates_total-prev_calculated;
   if(rates_total<2)
      return(0);

   if(prev_calculated<3)
     {
      limit=1;
      // inicializar matrizes com valores vazios
      ArrayInitialize(ColorCandlesBuffer1,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer2,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer3,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesBuffer4,EMPTY_VALUE);
      ArrayInitialize(ColorCandlesColors,EMPTY_VALUE);
     }
   else limit=rates_total-1;

   MqlTick Ticks[];   //declara uma matriz a ser preenchida com dados de ticks
   
   for(i=limit; i<rates_total-1; i++)
     {
      CopyTicks(Symbol(),Ticks,COPY_TICKS_TRADE,0,tick_volume[i]);  // copiar para o array Ticks os dados de ticks na quantidade igual ao volume de ticks no candle tick_volume[i]
      SetBarData(time[i],Ticks,i,_Delta,tick_volume[i]);// função no porão ↓

      if(open[i-1]<close[i-1] && _Delta<0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=1;
        }
      else if(open[i]>close[i] && _Delta>0)
        {
         ColorCandlesBuffer1[i-1]=open[i-1];
         ColorCandlesBuffer2[i-1]=high[i-1];
         ColorCandlesBuffer3[i-1]=low[i];
         ColorCandlesBuffer4[i-1]=close[i];
         ColorCandlesColors[i-1]=0;
        }
      else
        {
         ColorCandlesBuffer1[i]=0.0;
         ColorCandlesBuffer2[i]=0.0;
         ColorCandlesBuffer3[i]=0.0;
         ColorCandlesBuffer4[i]=0.0;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
// Preenche a barra com os ticks apropriados
void SetBarData(const datetime TimeBar,const MqlTick &Ticks[],int &Pos,double &Delta,const long vol)
  {
  int i=0;
   while(i<vol)
     {
      MqlTick Tick=Ticks[Pos];  // copiar as leituras do buffer de dados de tique para a variável
      if(i>=vol)
         break;   // quando i sanset é igual ao volume do tique, vail †
      if((bool)(Tick.flags  &TICK_FLAG_BUY))  // se o sinalizador for de compra, adicione ao delta
         Delta+=(double)Tick.volume;
      else if((bool)(Tick.flags  &TICK_FLAG_SELL)) // se o sinalizador for Sell, subtrair do delta
         Delta-=(double)Tick.volume;
      i++;
     }
   return;
  }
//+------------------------------------------------------------------+
Fiz muitos experimentos, portanto, pode haver artefatos de experimentos anteriores, na forma de variáveis declaradas, mas não usadas.
[Excluído]  
s22aa:

Se não for difícil, diga-me qual é o erro.

Não consigo ver o local exato do erro à primeira vista, mas, para começar, veja como CopyTicks() é tratada em meu indicador. Em particular, o retorno do valor e o tratamento de possíveis erros.

Sim, se ocorrer um overrun de matriz... veja quantos valores há na matriz e qual elemento você está acessando. Você também pode remover a pintura do primeiro e do último valor depois de receber os dados para ver se todos os dados foram recebidos.

 
Alexey Kozitsyn:

Veja como CopyTicks() é tratado em meu indicador.

Uau, é complicado. Os ticks são copiados por intervalo de tempo e por número. Em geral, a duplicação do sistema não é pior do que em cosmonauts))))

Encontrei onde fiz isso.

MqlTick Tick = Ticks[Pos];

Estou tentando copiar uma matriz em uma variável. É estranho o fato de o compilador não reagir a isso e, quando você o executa no testador, o testador trava.

Vou tentar pensar em outra coisa.
 
s22aa:

Estou tentando copiar uma matriz em uma variável.


Não, não está. É isso mesmo. Estou totalmente confuso. Vou ter uma manhã melhor. Amanhã, tudo vai se resolver.