Encore une fois, l'arbitrage, les échanges par paire. - page 18

 
Anatolii Zainchkovskii:

J'ai un système ordinaire, le drawdown est d'environ 40%, mais si je le fais tourner depuis 2010, je pourrais voir une perte.


et l'indicateur est exactement le même que le vôtre

Je ne veux pas rendre les choses plus compliquées qu'elles ne le sont actuellement.
 
Maxim Dmitrievsky:

et l'indicateur est exactement le même que le vôtre

C'est la chose la plus simple à faire... je ne veux pas compliquer les choses...

Je ne pense pas, mon indicateur est maladroit et dessine quelque chose d'incompréhensible...) mais à en juger par vos compétences, vous avez un calcul plus précis qui inclut probablement un contrôle d'erreur infaillible.

 
Anatolii Zainchkovskii:

Je ne pense pas, j'ai un travail maladroit et il dessine des choses incompréhensibles), mais à en juger par vos compétences vous avez plus de calculs corrects et probablement avec une vérification des erreurs d'un imbécile. c'est pourquoi vos tests sont probablement plus vrais.


Il existe des variantes pour construire des modèles plus intéressants, en utilisant non seulement les prix mais aussi les valeurs indicatrices ou autre chose...

J'ai ajouté l'indicateur à la base de code, quand il sera publié, vous pourrez le consulter... Peut-être que plus tard j'essaierai de le construire avec des indicateurs (maintenant je suis trop paresseux avant la nouvelle année :))

 
Maxim Dmitrievsky:

J'ai beaucoup d'options pour construire des modèles plus intéressants en ajoutant non seulement des prix mais aussi des valeurs indicatrices ou autre chose...

J'essaierai plus tard (je suis trop paresseux maintenant avant la nouvelle année :))


J'ai essayé différents modèles, je n'ai pas trouvé d'avantage statuaire. J'ai beaucoup de pensées, mais aucune envie de les rendre publiques. Si vous avez des idées en tête, je peux vous en soumettre quelques-unes, mais dans le cadre d'une correspondance privée.

 
Anatolii Zainchkovskii:

J'ai essayé différents modèles, mais je n'ai pas trouvé d'avantage statistique. J'ai beaucoup de pensées, mais je n'ai aucune envie de les exposer en public. Si vous avez une idée en tête, je peux vous en donner une ou deux, mais par correspondance privée.


Je ne crois pas au pouvoir de la pensée et aux idées géniales de Forex ;) D'ailleurs, presque tout le monde pense de la même façon - peur de montrer son secret le plus intime... mais en réalité il s'agit de préjugés et de peurs inutiles. La collaboration et la collectivisation règnent sur le monde :D

 
Maxim Dmitrievsky:

J'ai beaucoup d'options pour construire des modèles plus intéressants en ajoutant non seulement des prix mais aussi des valeurs indicatrices ou autre chose...

J'ai mis l'indicateur dans la base de code, quand ils le publieront, vous pourrez le regarder... Peut-être que plus tard j'essaierai de le construire avec des indicateurs (maintenant je suis trop paresseux avant la nouvelle année :))


Je n'arrive pas à le trouver.

 
Aleksei Beliakov:

Pouvez-vous me donner le lien ? Je ne le trouve pas.


Les modérateurs ne l'ont pas encore posté, c'est en attente.

 
Maxim Dmitrievsky:

Les modérateurs ne l'ont pas encore affiché, il est toujours en cours de révision.

Vous pouvez m'envoyer un message ou laisser le code ici et je le vérifierai.
 
//+------------------------------------------------------------------+
//|                                      cointegration_indicator.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
#property  indicator_buffers 30
#property indicator_plots   30
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMaroon
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrGreen
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDarkOrange
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrMidnightBlue
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrOlive
#property indicator_type6   DRAW_LINE
#property indicator_color6  clrBlueViolet
#property indicator_type7   DRAW_LINE
#property indicator_color7  clrDarkMagenta
#property indicator_type8   DRAW_LINE
#property indicator_color8  clrChartreuse
#property indicator_type9   DRAW_LINE
#property indicator_color9  clrBlue
#property indicator_type10   DRAW_LINE
#property indicator_color10  clrBlueViolet
#property indicator_type11   DRAW_LINE
#property indicator_color11  clrBrown
#property indicator_type12   DRAW_LINE
#property indicator_color12  clrBurlyWood
#property indicator_type13   DRAW_LINE
#property indicator_color13  clrChartreuse
#property indicator_type14   DRAW_LINE
#property indicator_color14  clrChocolate
#property indicator_type15   DRAW_LINE
#property indicator_color15  clrCoral
#property indicator_type16   DRAW_LINE
#property indicator_color16  clrCornflowerBlue
#property  indicator_type17   DRAW_LINE
#property  indicator_color17  clrCornsilk
#property  indicator_type18   DRAW_LINE
#property  indicator_color18  clrCrimson
#property  indicator_type19   DRAW_LINE
#property  indicator_color19  clrCyan
#property  indicator_type20   DRAW_LINE
#property  indicator_color20  clrDarkBlue
#property  indicator_type21   DRAW_LINE
#property  indicator_color21  clrDarkBlue
#property  indicator_type22   DRAW_LINE
#property  indicator_color22  clrDarkBlue
#property  indicator_type23   DRAW_LINE
#property  indicator_color23  clrDarkBlue
#property  indicator_type24   DRAW_LINE
#property  indicator_color24  clrDarkBlue
#property  indicator_type25   DRAW_LINE
#property  indicator_color25  clrDarkBlue
#property  indicator_type26   DRAW_LINE
#property  indicator_color26  clrDarkBlue
#property  indicator_type27   DRAW_LINE
#property  indicator_color27  clrDarkBlue
#property  indicator_type28   DRAW_LINE
#property  indicator_color28  clrDarkBlue
#property  indicator_type29   DRAW_LINE
#property  indicator_color29  clrDarkBlue
#property  indicator_type30   DRAW_LINE
#property  indicator_color30  clrDarkBlue


#include <Math\Alglib\alglib.mqh>
#include <Math\Stat\Math.mqh>

CLinReg linear_regression;
CLinearModel linear_model;
CLRReport linear_report;
int retcode;

CMatrixDouble LRmatrix;

input int learning_depth = 500;
input string SymbolsList = "AUDUSD,GBPUSD,NZDUSD";

double mainsynthetic[], zscore[];
int splittedPairsNumber;
string splittedPairs[];

static datetime last_time = 0;

struct spreads
 {
  string symbol;
  double spreadBuffer[];
  double pricesBuffer[];
  double zscore[];
  double weights[];
 };
 
spreads allspreads[];
bool second_call=false;

int OnInit()
  {
//--- indicator buffers mapping
   string sep = ",";
   ushort u_sep;
   u_sep = StringGetCharacter(sep,0);
   splittedPairsNumber = StringSplit(SymbolsList, u_sep, splittedPairs);
   ArrayResize(allspreads, splittedPairsNumber);
    
   string smbls;
   if (splittedPairsNumber > 0)
    {
     for (int i=0; i < splittedPairsNumber; i++)
      {
       getSymbolByName(splittedPairs[i]);
       SetIndexBuffer(i,allspreads[i].zscore, INDICATOR_DATA);
       ArraySetAsSeries(allspreads[i].spreadBuffer, true);
       ArrayResize(allspreads[i].spreadBuffer, learning_depth);
       ArrayResize(allspreads[i].pricesBuffer,learning_depth);
       ArraySetAsSeries(allspreads[i].pricesBuffer,true);
       ArrayInitialize(allspreads[i].pricesBuffer,0);
       ArrayResize(allspreads[i].weights,splittedPairsNumber);
       ArraySetAsSeries(allspreads[i].zscore, true);
       ArrayInitialize(allspreads[i].zscore, 0);    
       allspreads[i].symbol = splittedPairs[i];
       PlotIndexSetString(i, PLOT_LABEL, allspreads[i].symbol); 
       PlotIndexSetInteger(i,PLOT_LINE_WIDTH, 2);
       smbls += (splittedPairs[i] + ", ") ;  
      }
    }
   SetIndexBuffer(splittedPairsNumber, zscore, INDICATOR_DATA);
   PlotIndexSetInteger(splittedPairsNumber, PLOT_DRAW_TYPE, DRAW_HISTOGRAM);
   PlotIndexSetInteger(splittedPairsNumber, PLOT_LINE_STYLE, STYLE_DOT);
   
   PlotIndexSetInteger(splittedPairsNumber, PLOT_LINE_WIDTH, 1);
   PlotIndexSetInteger(splittedPairsNumber, PLOT_LINE_COLOR, clrSilver);
   PlotIndexSetString(splittedPairsNumber, PLOT_LABEL, "Z-SCORE");
     
   LRmatrix.Resize(learning_depth, splittedPairsNumber);
   ArrayResize(mainsynthetic, learning_depth);
   ArraySetAsSeries(mainsynthetic, true);
   ArrayResize(zscore, learning_depth);
   ArraySetAsSeries(zscore, true);
   ArrayInitialize(mainsynthetic,0);
   ArrayInitialize(zscore,0);
   
   IndicatorSetString(INDICATOR_SHORTNAME, "Z-score: " + smbls);
   IndicatorSetInteger(INDICATOR_DIGITS, 2);  
   IndicatorSetInteger(INDICATOR_LEVELS, 6);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, -1);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, 2);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 3, -2);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 4, 3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 5, -3);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,      
                 const int prev_calculated,  
                 const int begin,            
                 const double& price[])       
  {
   bool first_call=(prev_calculated==0);
     
   if(first_call || second_call)
    {
     if(fillPricesToBuffers(learning_depth))
      {
       fillLRmatrixes(); 
       calculateSpreads(learning_depth);
       calculateMainSynthetic(learning_depth);
       second_call=false;
      } else second_call=true;
    }
    
   if(isNewBar())
    {
     if(fillPricesToBuffers(learning_depth))
      {
       fillLRmatrixes(); 
       calculateSpreads(learning_depth);
       calculateMainSynthetic(learning_depth);
       second_call=false;
      } else second_call=true;
    }
   
   if(!second_call)
    {
     fillPricesToBuffers(1);
     calculateSpreads(1); 
     calculateMainSynthetic(learning_depth);
    }
   return(rates_total);
  }
//+------------------------------------------------------------------+

bool fillPricesToBuffers(int depth)
 {
  for (int l = 0; l<ArraySize(allspreads); l++)
   {
    int copied = CopyClose(allspreads[l].symbol, PERIOD_CURRENT, 0, learning_depth, allspreads[l].pricesBuffer);
     Comment("");
    if (copied != learning_depth)
     {
      Comment("Update " + allspreads[l].symbol + ", waiting for quotes to be downloaded!");
      return (false);
     }
   }
  return(true);
 }

void fillLRmatrixes()
 {
  for (int k = 0; k<ArraySize(allspreads); k++)
   {
    int n=0;    
    for(int l = 0; l<ArraySize(allspreads); l++)
     {
      if(l==k) continue;
    
      for(int i=0;i<learning_depth;i++) 
       {     
        LRmatrix[i].Set(n,allspreads[l].pricesBuffer[i]); 
       }
      n++;
     }
   
    for(int i=0;i<learning_depth;i++) 
     {     
      LRmatrix[i].Set(splittedPairsNumber-1,allspreads[k].pricesBuffer[i]);
     }
     
    linear_regression.LRBuild(LRmatrix,learning_depth,splittedPairsNumber-1,retcode,linear_model,linear_report);
    //Print(linear_report.m_cvrmserror);
    int nvars; 
    linear_regression.LRUnpack(linear_model,allspreads[k].weights,nvars); 
   }      
 }

void calculateSpreads(int depth)
 {
  for (int k = 0; k<ArraySize(allspreads); k++)
   {
    double summKoeffForIndex=0;
    for(int i=depth-1;i>=0;i--) 
     {
      int n=0;  
      for(int l = 0; l < ArraySize(allspreads); l++)
       {
        if(l == k) continue; 
        summKoeffForIndex += allspreads[l].pricesBuffer[i] * allspreads[k].weights[n]; 
        n++;     
       }  
      allspreads[k].spreadBuffer[i]=allspreads[k].pricesBuffer[i]-(summKoeffForIndex+allspreads[k].weights[ArraySize(allspreads)-1]);
      summKoeffForIndex=0;
     }
    
   double std = MathStandardDeviation(allspreads[k].spreadBuffer);
   for(int i=depth-1;i>=0;i--)
    {
     allspreads[k].zscore[i]=allspreads[k].spreadBuffer[i]/std;
    } 
   }
 }
  
void calculateMainSynthetic(int depth)
 {
  ArrayInitialize(zscore,0);
  for(int i=depth-1;i>=0;i--)
   {
    for(int l = 0; l<ArraySize(allspreads); l++)
     {
      zscore[i]+=allspreads[l].zscore[i];
     }
   }
 }
 
bool isNewBar()
 {
  datetime lastbar_time=datetime(SeriesInfoInteger(Symbol(),_Period,SERIES_LASTBAR_DATE));
  if(last_time==0)
   {
    last_time=lastbar_time;
    return(false);
   }
  if(last_time!=lastbar_time)
   {
    last_time=lastbar_time;
    return(true);
   }
  return(false);
 }

string getSymbolByName(string symbol)
 {
  string symbol_name="";
  if(symbol=="")
     return("");
  for(int s=0; s<SymbolsTotal(false); s++)
   {
    symbol_name=SymbolName(s,false);
    if(symbol==symbol_name)
     {
      SymbolSelect(symbol,true);
      return(symbol);
     }
   }
  Alert("The symbol "+symbol+" is not present on the server, please change symbol name!");
  return("");
 }
Dossiers :
 

Merci ! Je vais regarder.