Indicador estocástico. Una observación curiosa.

 

Creo que el estocástico es un indicador bastante prometedor para el comercio automático.

Pero resulta que no es tan sencillo. He hecho un Asesor Experto muy sencillo (unas diez líneas) basado en estocástico sin ningún "exceso".

Entrada - cruce de la línea principal de la línea de señalización. Por lo tanto, el algoritmo se basa en el cruce de líneas de señales:

int start()
  {
 
 
double StochK_0=iStochastic(NULL, 0, K_period,D_period,3,MODE_SMA,0,MODE_MAIN, 0);
double StochK_1=iStochastic(NULL, 0, K_period,D_period,3,MODE_SMA,0,MODE_MAIN, 1);
 
double StochD_0=iStochastic(NULL, 0, K_period,D_period,3,MODE_SMA,0,MODE_PLUSDI, 0);
 
 
//===== Ищем возможность войти в рынок ==================================================
 
int Orders=OrdersTotal ();     //получаем кол-во открытых ордеров
if (Orders==0)                 //если нет открытых ордеров
  {  
//---------проверяем условие на покупку----------------------------
  if   (  (StochK_1<StochD_0)  &&
          (StochK_0>StochD_0)  )
   {
  ticket= ... ...          
   }
 
//--------проверяем условие на продажу------------------------------
  if  (   (StochK_1>StochD_0)  &&
          (StochK_0<StochD_0)) 
   {       
  ticket=... ...       
   }

Luego lo optimicé a ojo y lo hice funcionar en el probador durante un año y medio. Y aquí descubrí, o más bien confirmé, mi observación de hace tiempo. El estocástico no es un indicador simétrico, como muchos piensan. El rango dinámico del indicador, debido a su estructura, refleja de forma diferente los movimientos de precios al alza y a la baja.

Por eso en el trading manual y en el autotrading a veces estamos inicialmente en desventaja al abrir posiciones de VENTA.

Símbolo GBPUSD (Libra esterlina vs. Dólar estadounidense) Periodo 4 horas (H4) (2006.01.01 - 2007.08.31)

Modelo Todos los ticks (basado en todos los períodos más pequeños disponibles con interpolación fractal de cada tick)

Calidad de modelado 90,00% Depósito inicial 10000,00

Beneficio neto 3667,00

Beneficio total 9801.02

Pérdida total -6134,02 Rentabilidad 1,60

Remuneración esperada 13,94 Reducción absoluta 202,02 Reducción máxima 438,24 (3,25%) Reducción relativa 3,25% (438,24)

Total de operaciones 263

Posiciones cortas (% de ganancias) 134 (51,49%)

Posiciones largas (% de ganancias) 129 (67,44%)

Operaciones rentables (% del total) 156 (59,32%)

Operaciones con pérdidas (% del total) 107 (40,68%)

La operación más rentable es 130.00

Pérdida de la operación -60,56

Operación media rentable 62,83

trato perdedor -57,33

En cualquier disposición, variantes y parámetros siempre resulta que las operaciones largas utilizando el indicador en varios pares son más prometedoras que las cortas.

Siempre resulta que el número de operaciones rentables de los largos es de hasta el 80

Y de las cortas, en el mejor de los casos el 50/55%.

Y esto es cierto para las entradas por la línea de señal, así como por los niveles de sobrecompra/sobreventa, e incluso por iOnArray.

La conclusión es que cuando se utiliza el estocástico, los parámetros para la compra y para la venta deben establecerse por separado. Es decir, aplicar dos indicadores.

 

El estocástico tiene la desagradable propiedad de cambiar sus valores de forma retroactiva, especialmente si los valores se toman de marcos temporales superiores.

Si no fuera por este problema, ¡sería difícil encontrar un indicador mejor!

Y es difícil encontrar un indicador mejor.

 
Aleksey24:

El estocástico tiene la desagradable propiedad de cambiar sus valores de forma retroactiva, especialmente si los valores se toman de marcos temporales superiores.

Si no fuera por este problema, ¡sería difícil encontrar un indicador mejor!


Esto es una tontería. ¿Dónde has visto un estocástico así?
 
leonid553:

El estocástico no es en absoluto un indicador simétrico. Como muchos piensan. El rango dinámico del indicador, debido a su estructura, representa de forma diferente los movimientos de precios al alza y a la baja.

Esa es otra conclusión. ¿Conoces la fórmula estocástica?
 

No. 99/1.

¿Sabías que el código estocástico completo está disponible en: 'Stochastic Oscillator, Stochastic'

¿Le importaría señalar con el dedo en qué parte del código es responsable de:

- ¿"cuando la apertura de una posición de VENTA a veces nos pone inicialmente en desventaja"?

- ¿"El estocástico tiene la desagradable propiedad de cambiar sus valores retroactivamente"?

 

Aquí hay una prueba clara de la asimetría del estocástico.

El canal que cuelga del indicador se estrecha constantemente en la parte inferior y se ensancha en la superior. ¿O tenemos que repasar aburridamente los números para averiguar la fórmula?

 

Si echamos un vistazo superficial a la fórmula del estocástico, ya podemos asumir con gran probabilidad que la unipolaridad del indicador es la "culpable" de la asimetría.

Y no puedo decir nada sobre el cambio de "valores atrasados", no me he enfrentado a ello.

 

¿Qué haría una fórmula "espejo"?

%K = 100*SUMA (MÁX (ALTO, Pk)-CIERRE), Sk) / SUMA (MÁX (ALTO, Pk) - MIN (BAJO, Pk)), Sk)

 

Es difícil decirlo de entrada. Probablemente, hay que escribir el código para el indicador de espejo. Compara su configuración en el gráfico.

Para el comercio automatizado, cualquier diferencia en la visualización será significativa. Entre a comprar usando un indicador normal. Utilice un indicador de espejo para entrar en la venta.

 

Bueno, el código fuente está disponible, es fácil de reemplazar. Pero para la percepción será más natural por idea

%K = 100*(1-SUMA (MÁX (ALTO, Pk)-CIERRE), Sk) / SUMA (MÁX (ALTO, Pk) - MIN (BAJO, Pk)), Sk)

 
leonid553:

Si echamos un vistazo superficial a la fórmula del estocástico, ya podemos asumir con gran probabilidad que la unipolaridad del indicador es la "culpable" de la asimetría.

Y no puedo decir nada sobre el cambio de "valores atrasados", no me he enfrentado a ello.

Unipolaridad del indicador - se puede corregir:
- En el indicador estándar
iStochastic
El alto y el cierre formados por la oferta - ese es todo el punto. ¡¡¡Esto es un grave error!!! ¡¡Especialmente para los estocásticos!! ¡¡¡Y sobre todo en los periodos pequeños!!!
No soy programador, no juzgues severamente, mejoré el estocástico estándar para mí. Funciona correctamente:
//+------------------------------------------------------------------+
//| $Stochastic. mq4 |
//| Vladimir |
//+------------------------------------------------------------------+
 
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_level1 80
#property indicator_level2 50
#property indicator_level3 20
 
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
//---- input parameters
extern int KPeriod=6;
extern int DPeriod=2;
extern int Slowing=1;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//----
int draw_begin1=0;
int draw_begin2=0;
double CHigh,CClose;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- 2 additional buffers are used for counting.
IndicatorBuffers(4);
SetIndexBuffer(2, HighesBuffer);
SetIndexBuffer(3, LowesBuffer);
//---- indicator lines
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0, MainBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1, SignalBuffer);
//---- name for DataWindow and indicator subwindow label
short_name="Stochastic("+KPeriod+","+DPeriod+", "+Slowing+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexLabel(1,"Signal");
//----
draw_begin1=KPeriod+Slowing;
draw_begin2=draw_begin1+DPeriod;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin2);
//----
CHigh=MarketInfo(Symbol(),MODE_SPREAD)*MarketInfo(Symbol(),MODE_POINT);// Вычисляем спред
CClose=CHigh/2.0;// Спред пополам
//----
return(0);
}
//+------------------------------------------------------------------+
//| Stochastic oscillator |
//+------------------------------------------------------------------+
int start()
{
int i,k;
int counted_bars=IndicatorCounted();
double price;
//----
if(Bars<=draw_begin2) return(0);
//---- initial zero
if(counted_bars<1)
{
for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0;
for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0;
}
//---- minimums counting
i=Bars-KPeriod;
if(counted_bars>KPeriod) i=Bars-counted_bars-1;
while(i>=0)
{
double min=1000000;
k=i+KPeriod-1;
while(k>=i)
{
price=Low[k];
if(min>price) min=price;
k--;
}
LowesBuffer[i]=min;
i--;
}
//---- maximums counting
i=Bars-KPeriod;
if(counted_bars>KPeriod) i=Bars-counted_bars-1;
while(i>=0)
{
double max=-1000000;
k=i+KPeriod-1;
while(k>=i)
{
price=High[k]+CHigh;
if(max<price) max=price;
k--;
}
HighesBuffer[i]=max;
i--;
}
//---- %K line
i=Bars-draw_begin1;
if(counted_bars>draw_begin1) i=Bars-counted_bars-1;
while(i>=0)
{
double sumlow=0.0;
double sumhigh=0.0;
for(k=(i+Slowing-1);k>=i;k--)
{
sumlow+=Close[k]+CClose-LowesBuffer[k];
sumhigh+=HighesBuffer[k]-LowesBuffer[k];
}
if(sumhigh==0.0) MainBuffer[i]=100.0;
else MainBuffer[i]=sumlow/sumhigh*100;
i--;
}
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
int limit=Bars-counted_bars;
//---- signal line is simple movimg average
for(i=0; i<limit; i++)
SignalBuffer[i]=iMAOnArray(MainBuffer,Bars,DPeriod, 0, MODE_SMA, i);
//----
return(0);
}
//+------------------------------------------------------------------+
Razón de la queja: