Mais uma vez, arbitragem, negociação de pares. - página 18

 
Anatolii Zainchkovskii:

Eu tenho um sistema comum, o drawdown está em torno de 40%, mas se eu o administrar desde 2010, talvez eu veja uma perda.


e o indicador é exatamente o mesmo que o seu

Não quero tornar as coisas mais complicadas do que são agora.
 
Maxim Dmitrievsky:

e o indicador é exatamente o mesmo que o seu

Esta é a coisa mais fácil de se fazer... não quero complicar as coisas...

Acho que não, meu indicador é desajeitado e desenha algo incompreensível...) mas a julgar por suas habilidades, você tem um cálculo mais preciso que provavelmente inclui uma verificação de erro infalível.

 
Anatolii Zainchkovskii:

Acho que não, eu tenho um trabalho desajeitado e isso desenha coisas incompreensíveis), mas a julgar por suas habilidades, você tem cálculos mais corretos e provavelmente com a verificação de erros de um tolo. é por isso que seus testes provavelmente são mais verdadeiros.


Existem variantes para construir modelos mais interessantes, utilizando não só preços, mas também valores indicadores ou algo mais...

Adicionei o indicador à base de códigos, quando será publicado, você pode procurá-lo... Talvez mais tarde eu tente construí-lo com indicadores (agora estou muito preguiçoso antes do Ano Novo :))

 
Maxim Dmitrievsky:

Tenho muitas opções para construir modelos mais interessantes, acrescentando não só preços, mas também valores indicadores ou algo mais...

Vou tentar mais tarde (estou muito preguiçoso agora antes do Ano Novo :))


Já tentei modelos diferentes, não encontrei nenhuma vantagem estatística. Tenho muitas idéias, mas não desejo torná-las públicas. Se você tem um vôo de idéias em termos de idéias agora descansa, posso lançar algumas idéias, mas em correspondência privada.

 
Anatolii Zainchkovskii:

Eu tentei modelos diferentes, mas não encontrei nenhuma vantagem estatística. Tenho muitos pensamentos, mas não há nenhum desejo de colocá-los em exposição pública. Se você tem um vôo de reflexão em termos de idéias, posso lhe dar algumas idéias, mas em correspondência particular.


Eu não acredito no poder do pensamento e nas idéias geniais no Forex ) Além disso, quase todos pensam da mesma maneira - com medo de mostrar seu segredo mais íntimo... mas na realidade é preconceito e medos desnecessários. Colaboração e coletivização governam o mundo :D

 
Maxim Dmitrievsky:

Tenho muitas opções para construir modelos mais interessantes, acrescentando não só preços, mas também valores indicadores ou algo mais...

Eu coloquei o indicador na base de código, quando eles o publicarem, você pode assistir... Talvez mais tarde eu tente construí-lo com indicadores (agora estou muito preguiçoso antes do Ano Novo :))


Não consigo encontrar o link.

 
Aleksei Beliakov:

Você pode me dar o link? Eu não consigo encontrá-lo.


Os moderadores ainda não a postaram, está pendente.

 
Maxim Dmitrievsky:

Os moderadores ainda não o postaram, ainda está sob revisão.

Você pode me PM ou deixar o código aqui e eu vou investigar.
 
//+------------------------------------------------------------------+
//|                                      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("");
 }
Arquivos anexados:
 

Obrigado! Vou dar uma olhada.

Razão: