Calcul des différences, exemples.

 

Je propose de rassembler les indicateurs et les experts du calcul des différences dans ce fil, en code source ouvert.

Si l'intérêt est là, nous finirons par construire ou dessiner quelque chose d'utile. :)

J'ai réécrit l'indicateur dans une version plus claire à titre d'exemple :

//|                                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);
  }
//+------------------------------------------------------------------+
 

Qu'est-ce que le calcul des différences ?

Elle l'est :

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

 
Aleksey Panfilov:

Je propose de rassembler les indicateurs et les experts du calcul des différences dans ce fil, en code source ouvert.

J'ai réécrit l'indicateur dans une version plus claire pour vous donner un exemple :

Sur le graphique, ça ressemble à ça :



La ligne bleu-rouge est une interpolation (trouver un point à l'intérieur de l'intervalle) par un polynôme de 4ème degré avec un levier 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;

La ligne bleue fine est l'extrapolation (trouver un point en dehors de l'intervalle) par le polynôme de degré 2 avec un levier 78.

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

La ligne rouge est la ligne de construction du polynôme de puissance 4. Il est redessiné et basé sur le point d'ouverture de la dernière barre.

 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:

Qu'est-ce que le calcul des différences ?

Elle l'est :

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


Oui.

Il est directement lié au binôme de Newton.

C'est vrai pour les points équidistants :

1*Y1-2*Y2+1*Y3=0 est l'équation de différence d'une ligne droite.

1*Y1-3*Y2+3*Y3-1*Y4=0 - l'équation différentielle de la parabole du second degré.

1*Y1-4*Y2+6*Y3-4*Y4+ 1*Y5=0 - équation différentielle de la parabole du troisième degré.

Il se recoupe également avec les sujets :

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:

Oui.


C'est ce que tout le monde a fait... l'écriture...

L'avenir dépend-il du passé ?

 
Evgeny Belyaev:

C'est ce que tout le monde a fait... l'écriture...

L'avenir dépend-il du passé ?


Pour chaque action, il y a une trace dans le présent, qui affecte bien sûr le futur. :))))

Je suggère de ne pas parler de philosophie dans ce fil de discussion, mais uniquement de mathématiques, de programmation, de tests et d'optimisation.

 
Aleksey Panfilov:

Oui.

Directement lié au binôme de Newton.

Pour des points équidistants, c'est vrai :

Y1-2*Y2+Y3=0 - équation de différence d'une ligne droite.

Y1-3*Y2+3*Y3-Y4 =0 - l'équation différentielle de la parabole du second degré.

Y1-4*Y2+6*Y3-4*Y4 + Y5 =0 - est l'équation différentielle de la parabole du troisième degré.

Avez-vous essayé cette formule ?

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

où :

X est le prix de la barre précédente ;

Y - prix de la barre actuelle.


Et nous obtenons ainsi l'image suivante :


 
Yousufkhodja Sultonov:

Avez-vous essayé cette formule ?

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


Bien sûr, dans cette forme il y a X et Y, alors que dans l'équation de récurrence, seul Y et tous les coefficients (a + bX+ cX^2+ dX^3+ eX^4) sont réduits et remplacés par cinq valeurs de Y lui-même.

 

J'ai regardé le code, est-ce que j'ai bien compris, c'est une variante d'un filtre à rétroaction ? D'où viennent les coefficients 5061600, 4926624 et autres ?

En fait, d'où vient l'indé, d'Internet ? ))

 
Alexey Volchanskiy:

1. J'ai regardé le code, est-ce que j'ai bien compris, c'est une variante d'un filtre à rétroaction ?

2. et d'où viennent les coefficients 5061600, 4926624 et autres ?

3. En général, d'où vient l'inducteur, d'internet ? ))

1. Oui. Ce filtre est vieux de 400 ans avec seulement une histoire écrite : Descartes, Newton, Pascal, Taylor, Lagrange.

2. Les coefficients sont calculés. Il semble qu'en deuxième année, nous nous soyons familiarisés avec les méthodes de Lagrange et de Taylor. Il semble y avoir beaucoup de variantes pour le calcul des coefficients.

3. Celui-ci en particulier a été dessiné aujourd'hui. :)))))

 

Lorsque l'échantillon est porté à N=100, l'équation du 4ème degré donne le résultat suivant :