una estrategia de negociación basada en la teoría de las ondas de Elliott - página 28

 
Además, sobre los cálculos. Hace poco pensé en la necesidad de utilizar la función de densidad de la distribución normal, pero aún no he empezado. También pensé en cómo hacerlo, si usando una función complicada o un método tabular, me incliné más por llenar la tabla en Excel con incrementos de una milésima (o una diezmilésima) y guardarla como un archivo txt que contenga el código mq4 para llenar un array grande. Ahora, gracias a Vladislav, también ahorra recursos de la CPU.
En definitiva, he aprendido muchas cosas útiles. :)
 
<br/ translate="no"> Uno de sus axiomas es que existe una trayectoria verdadera (es decir, una única), que viene determinada por el proceso de optimización. ¿Cómo puede una sola trayectoria dar lugar a múltiples canales?


Perdón de nuevo por las respuestas tardías. Cuando se aproxima una trayectoria nunca se puede saber cuánto mejor describe una aproximación la propia trayectoria, si están en el mismo intervalo de confianza. Y, en consecuencia, todas las aproximaciones que entran en el intervalo de confianza pueden suponerse equivalentes. En principio, esto es así. Para realizar una previsión a partir de un conjunto de aproximaciones posibles (normalmente ninguna satisface los criterios de selección, porque se establecen los límites de error), es mejor elegir la "más" óptima, por así decirlo. Al estudiar el algoritmo, me di cuenta de otra peculiaridad: aunque las aproximaciones son diferentes, las previsiones son las mismas en la gran mayoría de los casos. Una vez más te recuerdo que la trayectoria en sí no es necesaria y no la estoy buscando. En cuanto a los canales, la singularidad de los canales está relacionada con el "grado de detalle" (llamémoslo así) de las estructuras estudiadas. Así, si hay tendencias, podemos identificar zonas de retroceso y estimar las probabilidades de finales de tendencia, rupturas de zonas de inversión, etc. O simplemente para identificar las áreas de incertidumbre, cuando es mejor no entrar en el mercado. Además, siempre hay que tener en cuenta las limitaciones del tamaño de la muestra, ya que, de lo contrario, el resultado tendrá un índice de incertidumbre demasiado alto.

Buena suerte y buenas tendencias.
 
¡Querido Vladislav!

Tengo un malentendido respecto al cálculo del coeficiente de Hurst.
En el caso de la regresión lineal tenemos 2 variantes de cálculo de S y R.

Variante 1.
S - podemos calcularlo como la suma de las diferencias de desviación a lo largo de toda la longitud de la línea de regresión lineal.
Significa:

S=0.0;
for (n=0; n<Period; n++) { S+ = MathPow( Close[n] - (a+b*n) , 2); }
S=MathSqrt( S / Period );

Y podemos calcular R como la diferencia entre la desviación máxima y mínima a lo largo de toda la línea de la regresión lineal.
Es decir:

pMax=0.0; pMin=0.0;
for (n=0; n<Period; n++)
{
dc=Close[n] - (a+b*n);
if ( dc > pMax) pMax = dc;
if ( dc < pMin) pMin = dc
}
R=MathAbs( pMax - pMin);

Opción 2.
Podemos calcular S en relación con la última barra utilizando iStdDev( ) del conjunto de indicadores técnicos estándar. Pero en este caso tendremos S calculado con respecto a la última barra, lo que equivale al cálculo de S con respecto al valor en el medio de una línea de regresión lineal.

Y R - como la diferencia entre los valores máximos y mínimos en la proyección horizontal:

pMax=High[Highest(NULL,0,MODE_HIGH,Period,i)];
pMin=Low[Lowest(NULL,0,MODE_Low,Period,i)];

lo cual no es del todo correcto, sería más correcto utilizar MODE_CLOSE si inicialmente utilizamos Close.

Por lo que tengo entendido, ¿se utiliza la segunda variante en su caso? ¿O debo estar equivocado?

Así que mi pregunta es: ¿Qué variante es más correcta para un cálculo más preciso del coeficiente de Hurst?

Gracias de antemano por su respuesta - Alexander.
 
Todas las aproximaciones que entran en el intervalo de confianza pueden considerarse equivalentes

Gracias, Vladislav, por alguna razón no había tenido en cuenta este punto. Pero es realmente cierto. Esto significa que, de hecho, no obtenemos varios canales, sino toda una gama delimitada por líneas con el ángulo máximo y mínimo.
Siempre hay que tener en cuenta las limitaciones del tamaño de la muestra, de lo contrario el resultado tendrá demasiada incertidumbre

No sé muy bien a qué incertidumbre se refiere. Sin embargo, la otra cosa está clara para mí. La muestra debe definir un canal de regresión, y un canal de regresión es un canal de tendencia. Si agrupamos tanto la tendencia como el piso en una muestra, dicha muestra apenas nos daría nada útil. Por lo tanto, nos enfrentamos al problema de dividir el mercado en fases y, lo que es más importante, de identificar la tendencia y el piso en las primeras fases, es decir, en el mercado real. En mi opinión, se trata de una tarea nada trivial.
 
Privet,
Los indicadores estándar son los que más se utilizan, los que más se usan y los que más se usan son los que más se usan, los que más se usan y los que más se usan son los que más se usan:



Vot kod mojevo indikatora:

//+------------------------------------------------------------------+
//|                                                   StdDevChan.mq4 |
//|                           Copyright © 2005, Arunas Pranckevicius |
//|                                      irc://irc.omnitel.net/forex |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Arunas Pranckevicius(T-1000), Lithuania"
#property link      "irc://irc.omnitel.net/forex"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Blue

//---- input parameters
extern int       PriceBars=350;
extern int       Shift;
extern bool      Comments=false;

double Support[];
double StdDev[];
double Resistance[];

//---- buffers
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void SetObject(string ObjName,int ObjType,datetime ObjTime1,double ObjPrice1,datetime ObjTime2=0,double ObjPrice2=0,color ObjColor=Red,int ObjSize=1,int ObjStyle=STYLE_SOLID,datetime ObjTime3=0,double ObjPrice3=0)
{

if (ObjectFind(ObjName) != -1) ObjectDelete(ObjName);
ObjectCreate(ObjName, ObjType, 0,ObjTime1 , ObjPrice1, ObjTime2, ObjPrice2, ObjTime3, ObjPrice3);
ObjectSet(ObjName,OBJPROP_COLOR,ObjColor); 
ObjectSet(ObjName,OBJPROP_STYLE,ObjStyle); 
ObjectSet(ObjName,OBJPROP_WIDTH,ObjSize); 
}


int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Resistance);
   SetIndexDrawBegin(0,0);
   SetIndexEmptyValue(0,0);
   SetIndexShift(0,0);
   SetIndexLabel(0,"Standart Deviation Support-");
//----
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,StdDev);
   SetIndexDrawBegin(1,0);
   SetIndexEmptyValue(1,0);
   SetIndexShift(1,0);
   SetIndexLabel(1,"Standart Deviation");
//----
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Support);
   SetIndexDrawBegin(2,0);
   SetIndexEmptyValue(2,0);
   SetIndexShift(2,0);
   SetIndexLabel(2,"Standart Deviation Resistance+");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counter,counter2;
   double DevAvg=0;
   double DevPlus1=0;
   double DevMinus1=0;
   double DevPlusStart=0;
   double DevMinusStart=0;
   double DevAvgStart=0;
   double DevPlusEnd=0;
   double DevMinusEnd=0;
   double DevAvgEnd=0;
   double DevPlus2=0;
   double DevMinus2=0;
   double DevAvg1=0;
   double DevAvg2=0;
   double PriceDiff;
   double deviance,Max,Min;
   int DrawBegin = Shift;   
   int DrawEnd;
   int counted_bars=IndicatorCounted();
   DrawEnd=Bars-counted_bars;
   
   if ( DrawEnd < DrawBegin + PriceBars) DrawEnd = DrawBegin + PriceBars;
   
   if (Bars < (PriceBars * 2 + Shift)) return(0);
   
   for (counter=DrawBegin-1;counter<=DrawEnd;counter++)
   {
   deviance=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter);
   Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,counter)];
   Min=Low [Lowest (NULL,0,MODE_LOW,PriceBars,counter)];
   //DevAvg=MathPow((Max + Min + deviance) / 3,2);  
   DevAvg=(Max + Min + deviance) / 3;  

   for (counter2=(PriceBars + counter);counter2 >=counter;counter2--)
   {
   PriceDiff = (Max + Min + Open[counter2]) / 3;
   deviance+= MathPow((PriceDiff - DevAvg),2);   
   }

   // Calculate average deviation
   deviance = deviance / (PriceBars + 1);
   DevAvg = MathSqrt(deviance/Point) * Point; 

   // Calculate deviation channel starting/current average deviation prices
   DevAvg1 = (DevPlus1 + DevMinus1 + (Max + Min + Open[PriceBars + counter]) / 3) / 3;

   // Calculate deviation channel +/- starting points
   DevPlus1 = (Min+Max + Open[PriceBars + counter]) / 3 + DevAvg;
   DevMinus1 = (Min+Max + Open[PriceBars + counter]) / 3 - DevAvg;     

  // Calculate deviation channel current +/- points
   DevPlus2 = (Max + DevAvg1) / 2 + DevAvg;
   DevMinus2 = (Min + DevAvg1) / 2 - DevAvg;

   DevAvg2 = (DevPlus2 + DevMinus2 + (Max + Min + DevAvg1) / 3) / 3;
   
   Resistance[counter]=DevMinus2;
   Support[counter]=DevPlus2;
   StdDev[counter]=DevAvg2;   
   //if (counter == DrawEnd && Symbol() == "EURUSD" ) Print ("DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2);

   if (counter == DrawBegin)
   {
   DevPlusEnd=Resistance[counter];
   DevMinusEnd=Support[counter];
   DevAvgEnd=StdDev[counter];
//   if (Symbol() == "EURUSD" ) Print ("DrawBegin=",DrawBegin," DrawEnd=",DrawEnd," DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2);
   }      
   
   if (counter == DrawBegin + PriceBars)
   {
   DevPlusStart=Resistance[counter];
   DevMinusStart=Support[counter];
   DevAvgStart=StdDev[counter];
   }      

   }
//----

   if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvgStart=",DevAvgStart," DevAvgEnd=",DevAvgEnd," DevPlusStart=",DevPlusStart," DevPlusEnd=",DevPlusEnd," DevMinusStart=",DevMinusStart," DevMinusEnd=",DevMinusEnd);
   //Draw channel
   SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlusStart,Time[Shift],DevPlusEnd,Blue,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinusStart,Time[Shift],DevMinusEnd,Red,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvgStart,Time[Shift],DevAvgEnd,White,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green);
   
   return(0);
  }
//+------------------------------------------------------------------+
 
2 ANG3110 En realidad, ya he respondido a esta pregunta más arriba. Vuelvo a contestar -la última- porque a mí también me da pereza ;). La desviación estándar debe calcularse en relación con la aproximación y los precios realmente obtenidos. Si se aproximan los precios de cierre por un muving, entonces debería ser la diferencia entre Klose y el valor del muving en cada barra. Y puede utilizar el algoritmo estándar - iStdDev( ). Si por un canal de regresión lineal, entonces entre el valor de la línea de regresión y el klose. Si por el contrario, la diferencia es entre el valor de la función de aproximación y el valor realmente obtenido. Si se aproxima a algo más, como la rentabilidad de las operaciones, entonces debe seleccionar otras variables. No utilizo iStdDev( ) en mis cálculos.

que no es del todo correcto, sería más correcto utilizar MODE_CLOSE si inicialmente utilizamos Close.

La clave aquí es: si inicialmente se cuenta por Close

2Yurixx En cuanto a la incertidumbre - si el número de grados de libertad de una muestra es insuficiente, no se puede estimar su convergencia de forma fiable, y por tanto se pueden aplicar a una muestra divergente métodos de análisis estadístico que sólo son aplicables a muestras convergentes. En consecuencia, el resultado es incierto.

PS Aquí el término "muestra" se utilizó para referirse a una distribución. Es decir, sería más correcto decir "el número de grados de libertad de una muestra afecta al grado de fiabilidad para determinar la convergencia de una distribución válida para esa muestra". Los métodos válidos para las distribuciones convergentes pueden aplicarse a las divergentes (o a las distribuciones sin hecho de convergencia conocido).

Buena suerte y buena suerte con las tendencias.
 
Privet,

Vot po4emu ja dal kod svojevo indikatora - ras4ioty idut po vsem parametram:

   deviance=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter); Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,counter)]; Min=Low [Lowest (NULL,0,MODE_LOW,PriceBars,counter)]; DevAvg=(Max + Min + deviance) / 3;



Un buen indicador y un buen gráfico :-D

 
¡Querido Vladislav! <br/ translate="no">
Tengo un malentendido sobre el cálculo del coeficiente de Hurst.
En el caso de la regresión lineal tenemos 2 variantes de cálculo de S y R.


Esta es una pregunta interesante :)
Supongamos que tenemos un canal de regresión lineal, por ejemplo ascendente, que satisface el criterio de convergencia RMS. Por un lado, si el canal es ascendente, entonces el RMS calculado en las barras incluidas en él tenderá a 1,0 (ya que el desplazamiento es evidente). Por otra parte, si calculamos el RMS en relación con la línea de regresión (eliminando así el desplazamiento), el RMS tenderá a 0,5, porque el RMS se aproxima a la distribución normal. Creo que todo el mundo debería comprobarlo por sí mismo (es mucho más interesante así).
 
No he podido resistirme y he modificado el script de solandr. Incluir la extracción de RMS es más correcto utilizando el iStdDevOnArray incorporado, ya que la división por (número de potencias-1) es razonable sólo para muestras de hasta 30 elementos.
//+------------------------------------------------------------------+
//|                                                     Herst-II.mq4 |
//|                             solandr (обработал напильником Rosh) |
//|                       http://www.metaquotes.ru/forum/6839/page11 |
//+------------------------------------------------------------------+
#property copyright "solandr (обработал напильником Rosh)"
#property link      "http://www.metaquotes.ru/forum/6839/page11"
#property show_inputs

extern int start_bar=500;
extern int end_bar=0;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
double viborka[];
int size_of_array,i;

size_of_array=start_bar-end_bar+1;
ArrayResize(viborka, size_of_array);
for(i=size_of_array-1;i>=0;i--) viborka[i]=Open[i+end_bar];

double S_A=iMAOnArray(viborka,0,size_of_array,0,MODE_SMA,0);
Print("Среднее арифметическое выборки = ",DoubleToStr(S_A,8));

double S=iStdDevOnArray(viborka,0,size_of_array,MODE_SMA,0,0);

Print("СКО выборки (размах) = ",DoubleToStr(S,8));

double pMax=viborka[ArrayMaximum(viborka)];
double pMin=viborka[ArrayMinimum(viborka)];

double R=pMax-pMin;
Print("pMin = ",pMin," pMax = ",pMax, " R = ",R);

double Hrst;
if( (R>0)&&(S>0)) Hrst = MathLog(R/S)/MathLog(size_of_array*0.5);
Print("Хёрст = ",DoubleToStr(Hrst ,8));
  
  return(0);
}
//+------------------------------------------------------------------+



La búsqueda extrema se basa en los datos brutos, no en las posiciones y las rupturas.

Por lo tanto, el criterio es algo diferente:

2006.05.28 14:53:08 Herst EURUSD,M15: removed<br/ translate="no"> 2006.05.28 14:53:08 Herst EURUSD,M15: Hearst = 0.27582880
2006.05.28 14:53:08 Herst EURUSD,M15: pMin = 1.2691 pMax = 1.2892 R = 0.0201
28 14:53:08 Herst EURUSD,M15: RMS de muestreo (spread) = 0.00438062
2006.05.28 14:53:08 Herst EURUSD,M15: Varianza de muestreo = 0.00001919
2006.05.28 14:53:08 Herst EURUSD,M15: Media de muestreo = 1.27924631
2006.05.28 14:53:06 Herst EURUSD,M15: cargado con éxito
2006.05.28 14:52:59 Herst-II EURUSD,M15: eliminado
2006.05.28 14:52:59 Herst-II EURUSD,M15: Hurst = 0.26196806
2006.05.28 14:52:59 Herst-II EURUSD,M15: pMin = 1.2696 pMax = 1.2882 R = 0.0186
2006.05.28 14:52:59 Herst-II EURUSD,M15: RMS de la muestra (spread) = 0.00437625
2006.05.28 14:52:59 Herst-II EURUSD,M15: Media de la muestra = 1.27924631
2006.05.28 14:52:59 Herst-II EURUSD,M15: cargado con éxito
2006.05.28 14:52:54 Compilando 'Herst-II'

 
¡Querido Vladislav!
Gracias por su exhaustiva respuesta.
Razón de la queja: