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

 
a olyakish


Buenas noches a todos.
¿Podría decir a los niños de este algoritmo?

Gracias de antemano


Te lo estoy diciendo.

Aplicamos un filtro de mediana múltiple a la curva de precios. ¿Qué es? Tomamos una ventana de tamaño impar (>=3) y la pasamos por todos los valores de la curva original. En cada punto actual, ordena por valor los puntos incluidos en la ventana. Al punto actual se le asigna un valor medio (en el sentido de que está situado en el centro de la matriz) de la matriz ordenada. Una vez más, aplicamos el mismo filtro al resultado obtenido. Lo repetimos muchas veces (normalmente 20-30 veces es suficiente).
Para obtener los niveles de resistencia invertimos la curva de precios al revés y hacemos lo mismo. A continuación, invertimos el resultado obtenido.
¡Eso es todo!
...



Una pregunta rápida.
Supongamos que tenemos un historial de 1000 informes (barras)
ventana 3
no calculamos los resultados para 1000,999 ventanas y realizamos el primer cálculo cuando llegamos al 998º informe (tenemos datos de 998,999 y 1000 informes)
nuestra primera pasada nos da 998 resultados
para la segunda pasada, llegamos al informe 996 utilizando la matriz formada durante la ejecución anterior
en la tercera carrera, obtenemos 994 ...
y así sucesivamente...
Es decir, si ejecutamos 30 veces, obtenemos una matriz de 960 valores

¿Quizás no te he entendido bien?
 
a olyakish

<br/ translate="no"> Una pregunta rápida
Supongamos que tomamos un histórico de 1000 informes (barras)
ventana 3
resulta que para 1000,999 no contamos porque es más pequeño que la ventana y el primer cálculo lo hacemos sólo al llegar a 998 informe (tenemos datos de 998,999 y 1000 informes)
obtenemos la primera pasada con 998 resultados
la segunda pasada llegamos a 996 informe ya generado por el array de la pasada anterior
la tercera pasada llegamos a 994...
y así sucesivamente...
Es decir, si se ejecuta 30 veces, se obtiene una matriz de 960 valores

¿Quizás te he entendido mal?



No exactamente. Técnicamente se hace de forma un poco diferente. Antes de aplicar un filtro, se amplía la matriz original en la mitad de la anchura de la ventana del filtro en ambas direcciones. Se rellenan los espacios vacíos de la nueva matriz con una constante, es decir, con el último valor del borde de la matriz original, o simétricamente con los valores extremos de la matriz original. En este caso obtendrá de nuevo 1000 puntos después de aplicar el filtro a la matriz original de 1000 puntos. La siguiente vez que se filtra, todo se repite.
Por supuesto, en este caso pueden producirse distorsiones en los bordes. Pero esto no puede evitarse porque cualquier filtro de ventana (y cualquier filtro en general) tiene un retardo de fase, incluido el de la mediana. En general, la naturaleza funciona así.
Podemos hacerlo de la forma que describes, pero entonces no llegaremos al borde del array original; o podemos usar una extensión, pero entonces no llegaremos al borde del resultado.
Estas son las malas noticias.
La buena noticia es que el filtro mediano no es tan sensible a los efectos de los bordes como los filtros lineales. Los pocos ejemplos que he tenido tiempo de ver muestran que las distorsiones de los bordes son pequeñas o, en algunos casos, no existen.

PS. Sí... Se me acaba de ocurrir una idea. El filtro puede aplicarse de forma recursiva. No sé qué haría, no lo he probado, pero contaría más rápido.
 
Andre69, he implementado el algoritmo del filtro mediano que has sugerido. Resulta que después de la tercera pasada, la forma de la curva suavizada no cambia. Se ha probado este efecto en una amplia gama de tamaños de ventana (hasta 10000 muestras).
En lo que respecta a las aplicaciones en el comercio, es correcto utilizar "ventana izquierda" cuando se asigna al punto actual un valor del centro de la ventana situado COMPLETAMENTE a la izquierda del valor actual. Por supuesto, esto introduce un retraso de fase (lag), pero así es el mundo:-)
 
a Neutrón

Andre69, he implementado el algoritmo del filtro mediano que has sugerido. Resulta que después de la tercera pasada, la forma de la curva suavizada no cambia. He comprobado este efecto en una amplia gama de tamaños de ventana (hasta 10000 muestras). <br/ translate="no"> En cuanto a las aplicaciones en el comercio, es correcto utilizar la "ventana izquierda" cuando al punto actual se le asigna un valor del centro de la ventana que está TOTALMENTE a la izquierda del valor actual. Por supuesto, esto introduce un retraso de fase (lag), pero así es el mundo:-)


Sí... Eso no tiene sentido. Empezó a comprobarlo. Finalmente miré mi código, que uso para el filtrado de la mediana. Lo escribí hace N años (N>5) para un pequeño programa de salida de gráficos. Ahora he empezado a utilizar este programa como polígono para todo tipo de investigaciones. Es práctico, y ni siquiera he mirado las partes antiguas del código. Todo está funcionando y bien... Ahora lo estoy viendo... y de repente descubrí que la función que yo creía que era el filtrado de la mediana, ¡no hace exactamente eso! Siento mucho la desinformación involuntaria. Inclino mi cabeza culpable.
Por qué y para qué lo hice en su momento, no lo recuerdo.
La mediana clásica es cuando se toma el valor central de una matriz ordenada. En este caso concreto, he tomado la media entre el valor central y el anterior. Tal vez lo necesitaba hace mucho tiempo por alguna razón. También tengo un filtro no lineal, aunque, por supuesto, no es la mediana en sentido estricto. Cuando volví a la versión clásica, me salió como describes. En mi variante, la curva cambia cada vez que se aplica el filtro y finalmente tiende a una línea recta (después de varios cientos de filtraciones). Cuanto más grande sea la ventana de filtrado, más rápido ocurrirá.
Para evitar más ambigüedades, proporciono un trozo de código en C.
Es sencillo, espero que cualquiera pueda resolverlo.
//---------------------------------------------------------------------------
void __fastcall TPlotForm2D_WL::FilterCurveMedian(int Flen)
{
 //количество точек кривой
 int NN=Chart1->Series[IndexUpDown->Position-1]->Count();
 
 //объявляем временные массивы и выделяем память под них
 double* TempArray=new double[NN+(Flen/2)*2];
 double* ResultArray= new double[NN];
 double* XArray=new double[NN];
 double* MedArray=new double[Flen];

 //заполняем массив значений Х точками текущей кривой
 for(int i=0;i<NN;++i)
  XArray[i]=Chart1->Series[IndexUpDown->Position-1]->
                           XValues->Value[i];

 double Start=2*Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[0];
 double End=2*Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[NN-1];

 int k=0;

 //заполняем временный массив значениями Y точками текущей кривой
 for(int i=Flen/2;i>0;--i) //симметричное расширение влево
  TempArray[k++]=Start-Chart1->Series[IndexUpDown->Position-1]->
                                      YValues->Value[i];
 for(int i=0;i<NN;++i)
  TempArray[k++]=Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[i];
 for(int i=NN-1;i>=NN-Flen/2;--i)//симметричное расширение вправо
  TempArray[k++]=End-Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[i];

 //собственно фильтрация
 for(int i=Flen/2;i<NN+Flen/2;++i)
  {
   for(int j=-Flen/2;j<=Flen/2;++j)
    MedArray[j+Flen/2]=TempArray[i+j];
   ::sort(MedArray,MedArray+Flen);
   //Это то, что я написал когда-то. Уже не помню, почему так.
   //Но это работает!!!!!!!!!!
   ResultArray[i-Flen/2]=(MedArray[Flen/2]+MedArray[Flen/2-1])/2;
   //А эта строчка - классический медианный фильтр.
   //И это не работает, так как хотелось бы. ???? Sorry
   //ResultArray[i-Flen/2]=MedArray[Flen/2];
  }


 //дальше вывод и удаление временных массивов
 AddFastLine();

 for(int i=0;i<NN;++i)
  Chart1->Series[Chart1->SeriesCount()-1]->
          AddXY(XArray[i],ResultArray[i],"",clBlue);

 SwitchOnCurve(PlotForm2D_WL->Chart1->SeriesCount()-1);

 delete [] TempArray;
 delete [] ResultArray;
 delete [] XArray;
 delete [] MedArray;

 if(PlotForm2D_WL->Visible)
  PlotForm2D_WL->Visible = false;
 PlotForm2D_WL->Show();

}
//---------------------------------------------------------------------------



Sobre la "ventana de la izquierda": todo es cierto, estoy de acuerdo. Pero por ahora, creo que son los detalles.

Una vez más, mis disculpas.

 
a Northwind
...Pero si está seriamente interesado en obtener este trabajo de investigación, envíenos un correo electrónico (info@disserr.ru) y le entregaremos el trabajo solicitado desde el archivo si es posible...


¿Tal vez haya alguna noticia sobre este trabajo?
 
a Северный Ветер
...Pero si está seriamente interesado en obtener este trabajo de investigación, escríbanos (info@disserr.ru) y le entregaremos el trabajo solicitado desde el archivo si es posible...


¿Ha habido alguna noticia sobre este trabajo?

No tomé ninguna otra medida tras la publicación de su respuesta.
Acabo de mostrarte una forma de intentar encontrar el material de la tesis.
Le advierto que el material puede tener que ser pagado.
 
2 Andre69

Haciendo algunas pesadas batallas posicionales con MatLab.
Para empezar, decidí observar la descomposición en ondas de una serie de precios y una serie de valores de indicadores. Para DWT no encontré ninguna sorpresa, todo es más o menos comprensible.
En el caso de CWT, la descomposición de los indicadores también fue bastante clara. Sin embargo, las series de precios han arrojado el siguiente panorama:


La estructura de esta imagen, en términos generales, difiere significativamente de, por ejemplo, la imagen en el post de Andre69 el 28.06.07 20:43 en la página. 141. Me gustaría entender por qué.
Por otro lado, tiene una estructura demasiado regular. ¿Por qué?
Este análisis se realizó para una serie de 1024 muestras.
Ajustes de escala: Min=1, Step=1, Max=512. Ondícula DMeyer

PS Por cierto, el post anterior fue el último de una serie interminable sobre wavelets. :-)
Me gustaría saber sobre la continuación. ¿Debería?
 
a Yurixx
La estructura de esta imagen en general es bastante diferente de, por ejemplo, la imagen del post Andre69 28.06.07 20:43 en la página 141. 141. Me gustaría entender por qué.
Por otro lado, tiene una estructura demasiado regular. ¿Por qué?


Yura, dicha estructura regular es inherente a la naturaleza de los efectos de borde que inevitablemente se producen en los extremos de la PA que se estudia. Es imposible evitar estos efectos. Pero si la condición del problema a resolver lo permite, se pueden dejar algunos términos de la serie de cada extremo de la RV (el número de términos es igual al ancho de la ventana de muestreo) que participarán en los cálculos, pero no se utilizarán en la visualización. Tras este procedimiento, la imagen será adecuada e isotrópica.
 
<br / translate="no"> Pero si la condición del problema a resolver lo permite, se pueden dejar algunos miembros de fila en cada extremo del PB, que participarán en los cálculos, pero no se utilizarán en la visualización. Tras este procedimiento, la imagen será adecuada e isotrópica.


Gracias, Sergey, por la aclaración. Sólo queda averiguar cómo hacer lo que se escribe.
Parsing Wavelet Toolbox no encontré esas características allí. ¿Quizás he pasado algo por alto o sólo se puede hacer manualmente?
 
Este efecto se puede minimizar cumpliendo la condición: n/N<<1, donde n es el tamaño de la ventana (en tu caso, según tengo entendido, n = Max), N es el número de miembros del BP (1024). Suponiendo 0,01<<1, tenemos Mach<10 para la serie disponible.
En este caso, los resultados presentados serán correctos.