Cálculo da diferença, exemplos.

 

Proponho coletar indicadores e especialistas em cálculo de diferenças neste tópico, no código fonte aberto.

Se houver interesse, eventualmente vamos construir ou desenhar algo útil. :)

Eu reescrevi o indicador em uma versão mais clara como exemplo:

//|                                Copyright 2016, Aleksey Panfilov. |
//|                                                filpan1@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Aleksei Panfilov. filpan1@yandex.ru"
#property link      "filpan1@yandex.ru"
#property version   "1.2"
#property description    "2018_01_10_Polynom_s4_s2_p72"
#property strict

#include <MovingAverages.mqh>


#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots   2
//--- plot a1_
#property indicator_label1  "MACD"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot a2_
#property indicator_label2  "Signal"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot a3_
#property indicator_label3  "Fast_line_1"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrBlueViolet
#property indicator_style3  STYLE_SOLID
#property indicator_width3  6
//--- plot a4_
#property indicator_label4  "Fast_line_2"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrBlue
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
//--- plot a5_
#property indicator_label5  "Slow_line_1"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrDarkGreen
#property indicator_style5  STYLE_SOLID
#property indicator_width5  4
//--- plot a6_
#property indicator_label6  "Slow_line_2"
#property indicator_type6   DRAW_LINE
#property indicator_color6  clrRed
#property indicator_style6  STYLE_SOLID
#property indicator_width6  1//--- input parameters

//         int   LIN_1_STEP    =4; //line_1_power
//input int      LIN_1_PLECHO  =72; //Fast_line_1_leverage
//         int   LIN_2_STEP    =2;//line_2_power
//input int      LIN_2_PLECHO  =78; //Fast_line_2_leverage
//         int   LIN_3_STEP    =4;//line_3_power
//input int      LIN_3_PLECHO  =72; //Slow_line_1_leverage
//         int   LIN_4_STEP    =2;//Slow_line_4_power
//input int      LIN_4_PLECHO  =72;//Slow_line_2_leverage

input        int TOCHKA_VHODA = 300;// start_point
//input int           base  =450;
      int   point_shift_1 = 0;
      int   point_shift_2 = 0;
//input int   Multiplikator = 10;
//input int   InpSignalSMA  = 9;  // Signal SMA Period



//--- indicator buffers

double a1_Buffer[];
double a2_Buffer[];
double a3_Buffer[];
double a4_Buffer[];
double a5_Buffer[];
double a6_Buffer[];
//double a7_Buffer[];
//double a8_Buffer[];
/**/


//===========================================================================================
   double Znach;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
 
//--- indicator buffers mapping
   SetIndexBuffer(0,a5_Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,a6_Buffer,INDICATOR_DATA);
   SetIndexBuffer(2,a1_Buffer,INDICATOR_DATA);
   SetIndexBuffer(3,a2_Buffer,INDICATOR_DATA);
   SetIndexBuffer(4,a3_Buffer,INDICATOR_DATA);
   SetIndexBuffer(5,a4_Buffer,INDICATOR_DATA);
//----
//----
   SetIndexShift(2,-72);
   SetIndexShift(5,20);

//    if(TOCHKA_VHODA <= (LIN_1_PLECHO+25)*LIN_1_INTERVAL) TOCHKA_VHODA=(LIN_1_PLECHO+25)*LIN_1_INTERVAL;  
//    if(TOCHKA_VHODA <= (LIN_2_PLECHO+25)*LIN_2_INTERVAL) TOCHKA_VHODA=(LIN_2_PLECHO+25)*LIN_2_INTERVAL;  
//    if(TOCHKA_VHODA <= (LIN_3_PLECHO+25)*LIN_3_INTERVAL) TOCHKA_VHODA=(LIN_3_PLECHO+25)*LIN_3_INTERVAL;  
//    if(TOCHKA_VHODA <= (LIN_4_PLECHO+25)*LIN_4_INTERVAL) TOCHKA_VHODA=(LIN_4_PLECHO+25)*LIN_4_INTERVAL;  
//    if(TOCHKA_VHODA <= (base*2+25))                      TOCHKA_VHODA=(base*2+25);  

//------
//===========================================================================================
//===========================================================================================

   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[])
  {

   int i,z,limit;
//   int Bars=Bars(_Symbol,_Period);

   if(prev_calculated==0)// first calculation    
     {
      limit=rates_total-TOCHKA_VHODA;
      //--- set empty value for first limit bars
//Print("Bars=",Bars," rates_total=",rates_total," TOCHKA=",TOCHKA_VHODA," limit=",limit);
      if(limit<1)return(0);
      for(i=rates_total-1;i>=limit;i--)
      {
       a1_Buffer[i]=open[limit+1];
       a2_Buffer[i]=open[limit+1];
       a3_Buffer[i]=open[limit+1];
       a4_Buffer[i]=open[limit+1];
       a5_Buffer[i]=open[limit+1];
       a6_Buffer[i]=open[limit+1];
      }

     }
   else limit=rates_total-prev_calculated;
//--- main loop
   for(i=limit;i>=0 && !IsStopped();i--)
   {
//===========================================================================================
   Znach = 0; //iMA(NULL,0,base*2,0,MODE_SMA,PRICE_OPEN,i);
//===========================================================================================

 
      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

      a2_Buffer[i]=  3160*a1_Buffer[i]   -6240   *a1_Buffer[i+1 ]    +  3081*a1_Buffer[i+2 ];

      a4_Buffer[i+92]=a1_Buffer[i];   if(i<=10) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}


//      a3_Buffer[i]=((open[i] - Znach)    +5061600*a3_Buffer[i+1 ]-7489800    *a3_Buffer[i+2 ]+4926624*a3_Buffer[i+3 ]-1215450*a3_Buffer[i+4 ])/1282975;

//      a4_Buffer[i]=  2701*a3_Buffer[i]   -5328   *a3_Buffer[i+1 ]    +  2628 *a3_Buffer[i+2 ];



//================================================================================================================================================================================================
//================================================================================================================================================================================================

//   a5_Buffer[i] = (a2_Buffer[i+point_shift_1] - a4_Buffer[i+point_shift_2])* Multiplikator;

   } 
//----
//--- signal line counted in the 2-nd buffer

//     SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,a5_Buffer,a6_Buffer);

//--- done

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 

O que é o cálculo da diferença?

Pois é:

Δf(xk) = f (xk+1) - f (xk)

 
Aleksey Panfilov:

Proponho recolher indicadores e especialistas em cálculo de diferenças neste ramo, em código aberto.

Eu reescrevi o indicador em uma variante mais clara como exemplo:

Na tabela parece que é assim:



A linha azul-vermelha é interpolação (encontrando um ponto dentro do intervalo) por um polinômio de 4º grau com uma alavancagem de 72.

      a1_Buffer[i]=((open[i] - Znach)    +5061600*a1_Buffer[i+1 ]-7489800   *a1_Buffer[i+2 ]+4926624*a1_Buffer[i+3 ]-1215450*a1_Buffer[i+4 ])/1282975;

A fina linha azul é a extrapolação (encontrar um ponto fora do intervalo) pelo polinômio de grau 2 com alavancagem 78.

 a2_Buffer[i]=  3160*a1_Buffer[i]   -6240   *a1_Buffer[i+1 ]    +  3081*a1_Buffer[i+2 ];

A linha vermelha é a linha de construção do polinómio de potência 4. É redesenhado e baseado no último ponto de abertura do bar.

 a4_Buffer[i+92]=a1_Buffer[i];   if(i<=10) { for(z=92-1;z>=0;z--){        a4_Buffer[i+0+z]=  5*a4_Buffer[i+1+z]  -  10*a4_Buffer[i+2+z]   +   10*a4_Buffer[i+3+z]  -  5*a4_Buffer[i+4+z]  +  1*a4_Buffer[i+5+z];  }}

 
Evgeny Belyaev:

O que é o cálculo da diferença?

Pois é:

Δf(xk) = f (xk+1) - f (xk)


Sim.

Está directamente relacionado com o binómio de Newton.

É verdade para pontos equidistantes:

1*Y1-2*Y2+1*Y3=0 é a equação da diferença de uma linha reta.

1*Y1-3*Y2+3*Y3-1*Y4=0 - a equação da diferença da parábola de segundo grau.

1*Y1-4*Y2+6*Y3-4*Y4+ 1*Y5=0 - equação da diferença da parábola do terceiro grau.

Também se sobrepõe com os tópicos:

https://www.mql5.com/ru/forum/61389/page48#comment_5633264

https://www.mql5.com/ru/forum/211220/page2#comment_5632736 .

Как измерить скорость цены
Как измерить скорость цены
  • 2017.07.20
  • www.mql5.com
Всем привет, тут такая тема Хочу использовать "ускорение" цены на тиковых интервалах, но не пойму как вообще посчитать скорость цены...
 
Aleksey Panfilov:

Sim.


Isso é o que todos têm feito... a escrever...

O futuro depende do passado?

 
Evgeny Belyaev:

Isso é o que todos têm feito... a escrever...

O futuro depende do passado?


Para cada ação, há um traço no presente, que, naturalmente, afeta o futuro. :))))

Sugiro que pulemos a filosofia neste tópico, vamos discutir apenas matemática, programação, testes e otimização.

 
Aleksey Panfilov:

Sim.

Directamente relacionado com o binómio de Newton.

Para pontos equidistantes, é verdade:

Y1-2*Y2+Y3=0 - equação da diferença de uma linha reta.

Y1-3*Y2+3*Y3-Y4 =0 - a equação da diferença da parábola de segundo grau.

Y1-4*Y2+6*Y3-4*Y4 + Y5 =0 - é a equação da diferença da parábola de terceiro grau.

Já experimentou esta fórmula?

Y = a0 + a1X + a2X^2 + a3X^3 + a4X^4

onde:

X é o preço do bar anterior;

Y - preço do bar actual.


E assim ficamos com a seguinte imagem:


 
Yousufkhodja Sultonov:

Já experimentou esta fórmula?

Y = a + bX + cX^2 + dX^3 + eX^4


É claro que nesta forma existem X e Y, mas na equação de recorrência, apenas Y e todos os coeficientes (a + bX+ cX^2+ dX^3+ eX^4) são reduzidos e substituídos por cinco valores de Y em si.

 

Olhei para o código, acertei, é alguma variante de um filtro de feedback? De onde vêm os coeficientes 5061600, 4926624 e outros?

Na verdade, de onde veio o índio, da Internet? ))

 
Alexey Volchanskiy:

1. Olhei para o código, acertei, é alguma variante de filtro com feedback?

2.E de onde vieram os coeficientes 5061600, 4926624 e outros?

3. Em geral, de onde veio o indutor, da internet? ))

1. Sim. Este filtro tem 400 anos de idade e só tem história escrita: Descartes, Newton, Pascal, Taylor, Lagrange.

2. Os coeficientes são calculados. Parece que, no segundo ano, conhecemos os métodos de Lagrange e Taylor. Parece haver muitas variantes para o cálculo de coeficientes.

3. Este em particular foi desenhado hoje. :)))))

 

Quando a amostra é aumentada para N=100, a equação do 4º grau dá o seguinte resultado: