Stochastischer Indikator. Eine merkwürdige Beobachtung.

 

Ich denke, die Stochastik ist ein vielversprechender Indikator für den automatischen Handel.

Aber so einfach ist es nicht! Ich habe einen sehr einfachen (etwa zehn Zeilen) Expert Advisor auf Basis der Stochastik ohne jegliche "Exzesse" erstellt.

Einfahrt - Überquerung der Hauptlinie der Signalstrecke. Daher basiert der Algorithmus auf der Kreuzung von Signallinien:

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

Dann habe ich es nach Augenmaß optimiert und eineinhalb Jahre lang im Testprogramm laufen lassen. Und hier habe ich es herausgefunden, oder besser gesagt, meine alte Beobachtung bestätigt! Die Stochastik ist kein symmetrischer Indikator, wie viele Leute glauben. Der dynamische Bereich des Indikators spiegelt aufgrund seiner Struktur die Aufwärts- und Abwärtsbewegungen der Kurse unterschiedlich wider!

Aus diesem Grund sind wir beim manuellen und automatischen Handel anfangs manchmal im Nachteil, wenn wir SELL-Positionen eröffnen.

Symbol GBPUSD (Britisches Pfund gegen US Dollar) Zeitraum 4 Stunden (H4) (2006.01.01 - 2007.08.31)

Modell Alle Ticks (basierend auf allen kleinsten verfügbaren Perioden mit fraktaler Interpolation jedes Ticks)

Modellierungsqualität 90.00% Ersteinzahlung 10000.00

Nettogewinn 3667,00

Gesamtgewinn 9801.02

Gesamtverlust -6134,02 Rentabilität 1,60

Erwartete Auszahlung 13,94 Absoluter Drawdown 202,02 Maximaler Drawdown 438,24 (3,25%) Relativer Drawdown 3,25% (438,24)

Handel insgesamt 263

Short-Positionen (% Gewinn) 134 (51,49%)

Long-Positionen (% Gewinn) 129 (67,44%)

Gewinnbringende Geschäfte (in % aller Geschäfte) 156 (59,32%)

Verlustgeschäfte (% von allen) 107 (40,68%)

Der profitabelste Handel ist 130,00

Deal Deal Verlust -60.56

Durchschnittlich profitabler Handel 62,83

Verlustgeschäft -57,33

Bei allen Layouts, Varianten und Parametern zeigt sich immer wieder, dass Long-Geschäfte mit dem Indikator auf verschiedene Paare erfolgversprechender sind als Short-Geschäfte.

Es zeigt sich immer wieder, dass die Zahl der gewinnbringenden Geschäfte bei langen Geschäften bis zu 80 % beträgt.

Und von den kurzen - im besten Fall 50/55%.

Und dies gilt sowohl für die Eingaben durch die Signallinie als auch durch die überkauften/überverkauften Niveaus und sogar durch iOnArray.

Die Schlussfolgerung ist, dass bei der Verwendung der Stochastik die Parameter für Kauf und Verkauf getrennt eingestellt werden sollten. D.h. zwei Indikatoren anwenden.

 

Die Stochastik hat die unangenehme Eigenschaft, ihre Werte rückwirkend zu ändern, insbesondere wenn die Werte aus höheren Zeitrahmen stammen.

Wenn es dieses Problem nicht gäbe, wäre es schwer, einen besseren Indikator zu finden!

Und es ist schwer, einen besseren Indikator zu finden!

 
Aleksey24:

Die Stochastik hat die unangenehme Eigenschaft, ihre Werte rückwirkend zu ändern, insbesondere wenn die Werte aus höheren Zeitrahmen stammen.

Wenn es dieses Problem nicht gäbe, wäre es schwierig, einen besseren Indikator zu finden!


Das ist Unsinn. Wo haben Sie eine solche Stochastik gesehen?
 
leonid553:

Die Stochastik ist keineswegs ein symmetrischer Indikator. Wie viele Menschen denken. Der dynamische Bereich des Indikators bildet aufgrund seiner Struktur die Kursbewegungen nach oben und unten unterschiedlich ab!

Das ist eine weitere Schlussfolgerung. Kennen Sie die stochastische Formel?
 

Nein. 99/1.

Wussten Sie, dass der vollständige Stochastik-Code verfügbar ist unter: 'Stochastic Oscillator, Stochastic'.

Würden Sie bitte mit dem Finger auf die Stelle im Code zeigen, die dafür verantwortlich ist:

- wenn die Eröffnung einer VERKAUFS-Position uns anfangs manchmal einen Nachteil bringt"?

- "Die Stochastik hat die unangenehme Eigenschaft, ihre Werte rückwirkend zu ändern"?

 

Hier ist ein klarer Beweis für die Asymmetrie der Stochastik.

Der am Indikator hängende Kanal verengt sich ständig nach unten und verbreitert sich nach oben. Oder müssen wir hier mühsam die Zahlen durchgehen, um die Formel herauszufinden?

 

Wenn wir einen oberflächlichen Blick auf die Stochastik-Formel werfen, können wir bereits mit großer Wahrscheinlichkeit davon ausgehen, dass die Unipolarität des Indikators an der Asymmetrie "schuld" ist!

Und ich kann nichts über den Wandel der "rückständigen Werte" sagen, ich bin damit nicht konfrontiert worden.

 

Was würde eine "Spiegel"-Formel bewirken?

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

 

Das ist auf Anhieb schwer zu sagen. Sie müssen wahrscheinlich den Code für den Spiegelindikator schreiben. Vergleichen Sie deren Konfiguration in der Tabelle.

Für den automatischen Handel ist jeder Unterschied in der Anzeige von Bedeutung. Geben Sie Kaufen mit einem normalen Indikator ein. Verwenden Sie einen Spiegelindikator zur Eingabe von Verkaufen.

 

Nun, der Quellcode ist verfügbar, er ist leicht zu ersetzen. Aber für die Wahrnehmung wird es durch die Idee natürlicher sein

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

 
leonid553:

Wenn wir einen oberflächlichen Blick auf die Stochastik-Formel werfen, können wir bereits mit großer Wahrscheinlichkeit davon ausgehen, dass die Unipolarität des Indikators an der Asymmetrie "schuld" ist!

Und ich kann nichts über den Wandel der "rückständigen Werte" sagen, ich bin damit nicht konfrontiert worden.

Unipolarität des Indikators - kann korrigiert werden:
- Im Standardindikator
iStochastic
High und Close werden durch Bid gebildet - das ist der Punkt. Das ist ein grober Fehler!!! Insbesondere für Stochastik!!! Und vor allem bei kleinen Zeiträumen!!!
Ich bin kein Programmierer, urteilen Sie nicht streng, ich habe die Standard-Stochastik für mich verbessert. Sie funktioniert einwandfrei:
//+------------------------------------------------------------------+
//| $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);
}
//+------------------------------------------------------------------+