Indicatore stocastico. Un'osservazione curiosa.

 

Penso che lo stocastico sia un indicatore abbastanza promettente per il trading automatico.

Ma si scopre che non è così semplice! Ho fatto un Expert Advisor molto semplice (una decina di righe) basato sullo stocastico senza alcun "eccesso".

Entrata - attraversamento della linea principale della linea del segnale. Pertanto, l'algoritmo si basa sull'attraversamento della linea del segnale:

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=... ...       
   }

Poi l'ho ottimizzato a occhio e l'ho fatto girare nel tester per un anno e mezzo. E qui ho scoperto, o meglio dimostrato la mia osservazione di lunga data! Lo stocastico non è un indicatore simmetrico, come molti pensano. La gamma dinamica dell'indicatore, a causa della sua struttura, riflette in modo diverso i movimenti di prezzo verso l'alto e verso il basso!

Questo è il motivo per cui nel trading manuale e automatico siamo a volte inizialmente in svantaggio quando apriamo posizioni SELL.

Simbolo GBPUSD (Sterlina britannica contro dollaro USA) Periodo 4 ore (H4) (2006.01.01 - 2007.08.31)

Modello Tutti i tick (basato su tutti i più piccoli periodi disponibili con interpolazione frattale di ogni tick)

Qualità di modellazione 90.00% Deposito iniziale 10000.00

Utile netto 3667.00

Profitto totale 9801.02

Perdita totale -6134.02 Redditività 1.60

Payoff atteso 13,94 Drawdown assoluto 202,02 Drawdown massimo 438,24 (3,25%) Drawdown relativo 3,25% (438,24)

Totale scambi 263

Posizioni corte (% vittoria) 134 (51,49%)

Posizioni lunghe (% vittoria) 129 (67,44%)

Operazioni redditizie (% di tutte) 156 (59,32%)

Operazioni in perdita (% di tutte) 107 (40,68%)

Il trade più redditizio è 130.00

Deal Deal perdita -60.56

Media degli scambi redditizi 62,83

accordo perdente -57.33

Con qualsiasi layout, variante e parametro risulta sempre che le operazioni lunghe con l'indicatore su diverse coppie sono più promettenti di quelle corte.

Risulta sempre che il numero di affari redditizi di quelli lunghi è fino all'80

E di quelli corti - nel migliore dei casi il 50/55%.

E questo è vero per le entrate dalla linea di segnale, così come dai livelli di ipercomprato/ipervenduto, e anche da iOnArray.

La conclusione è che quando si usa Stochastic, i parametri per comprare e per vendere dovrebbero essere impostati separatamente. Cioè applicare due indicatori.

 

Lo stocastico ha una brutta proprietà di cambiare i suoi valori retroattivamente, specialmente se i valori sono presi da timeframe più alti.

Se non fosse per questo problema - sarebbe difficile trovare un indicatore migliore!

Ed è difficile trovare un indicatore migliore!

 
Aleksey24:

Lo stocastico ha una brutta proprietà di cambiare i suoi valori retroattivamente, specialmente se i valori sono presi da timeframe più alti.

Se non fosse per questo problema, sarebbe difficile trovare un indicatore migliore!


Questa è una sciocchezza. Dove avete visto un tale stocastico?
 
leonid553:

Lo stocastico non è affatto un indicatore simmetrico. Come molti pensano. La gamma dinamica dell'indicatore a causa della sua struttura rappresenta in modo diverso i movimenti di prezzo verso l'alto e verso il basso!

Questa è un'altra conclusione. Conosci la formula stocastica?
 

No. 99/1.

Sapevate che il codice stocastico completo è disponibile su: 'Stochastic Oscillator, Stochastic'.

Vi dispiacerebbe puntare il dito dove nel codice che è responsabile di:

- quando l'apertura di una posizione SELL a volte ci porta inizialmente in svantaggio"?

- "La stocastica ha la brutta proprietà di cambiare i suoi valori retroattivamente"?

 

Ecco una chiara prova dell'asimmetria della stocastica.

Il canale appeso all'indicatore si restringe costantemente in basso e si allarga in alto. O dobbiamo passare noiosamente attraverso i numeri qui per capire la formula?

 

Se diamo un'occhiata superficiale alla formula stocastica, possiamo già assumere con grande probabilità che l'unipolarità dell'indicatore è "colpa" dell'asimmetria!

E non posso dire nulla sul cambiamento dei "valori arretrati", non l'ho affrontato.

 

Cosa farebbe una formula "a specchio"?

%K = 100*SOMMA (MAX (HIGH, Pk)-CLOSE), Sk) / SOMMA (MAX (HIGH, Pk) - MIN (LOW, Pk)), Sk)

 

È difficile dirlo subito. Probabilmente dovrai scrivere il codice per l'indicatore dello specchio. Confronta la loro configurazione sul grafico.

Per il trading automatico qualsiasi differenza di visualizzazione sarà significativa. Entrare in Buy usando un indicatore normale. Usa un indicatore a specchio per entrare in Sell.

 

Beh, il codice sorgente è disponibile, è facile da sostituire. Ma per la percezione sarà più naturale per idea

%K = 100*(1-SOMMA (MAX (HIGH, Pk)-CLOSE), Sk) / SOMMA (MAX (HIGH, Pk) - MIN (LOW, Pk)), Sk)

 
leonid553:

Se diamo un'occhiata superficiale alla formula stocastica, possiamo già assumere con grande probabilità che l'unipolarità dell'indicatore è "colpa" dell'asimmetria!

E non posso dire nulla sul cambiamento dei "valori arretrati", non l'ho affrontato.

Unipolarità dell'indicatore - può essere corretto:
- Nell'indicatore standard
iStochastic
High e Close formati da Bid - questo è il punto. Questo è un errore grossolano!!! Soprattutto per lo stocastico!!! E soprattutto nei piccoli periodi!!!
Non sono un programmatore, non giudicate severamente, ho migliorato lo stocastico standard per me stesso. Funziona correttamente:
//+------------------------------------------------------------------+
//| $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);
}
//+------------------------------------------------------------------+
Motivazione: