
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich habe bereits 2013 versucht, einen ähnlichen Algorithmus zu implementieren... Aber ich habe 7 Indikatoren verwendet, und Zigzag wurde verwendet, um einen Vektor für das Training des NS zu bilden. Aber das Wesentliche ist dasselbe - ich habe nach umgekehrten Positionen gesucht... Als ich anfing, Zigzag zu verwenden, hatte ich keine Ahnung, was ich mit ihnen machen sollte. bis ich zufällig auf einige Muster stieß. Das hat meinen TS radikal verändert. Jetzt ist mein Algorithmus viel einfacher:
1. Berechnung von Mustern auf Minuten- und Stundenbasis für das letzte Jahr;
2. Erstellung eines Wörterbuchs der Wendepunkte (Paare "Minutenmuster - Stundenmuster") ;
3. NS-Unterricht unter Verwendung des Kipppunkt-Wörterbuchs (bei 150-160 Paaren);
Dies ist das Ergebnis meines Ansatzes:
Zu den Nachteilen meines Ansatzes:
1) Hohes Risiko des TS - da es nicht möglich ist, den genauen Wert des Break Price zu bestimmen, platziert der TS 9 Pending Orders mit Lots: 1, 1, 3, 6, 14, 31, 70, 158, 355;
2) Es ist schwierig, einen Ausstiegsalgorithmus (Schleppnetz TS) zu implementieren;
NS kann also für den Handel verwendet werden, die Frage ist nur, was man NS beibringen soll...
P/s: Unter Mustern verstehe ich die Muster von A. Merrill (M & W).
Das ist ein kluger Ansatz. Und die Muster wurden einfach als die Position der Balken in der Matrix beschrieben, ohne das tatsächliche Preis-Delta zu berücksichtigen - nur die relative Position?
Ich habe eine Idee, um die Muster-Indikatoren zu versuchen, aber mit einem anderen Rahmen - die ersten fünf Balken analysieren wir die Indikatoren auf die letzten 5 Indikatoren, und die beiden Indikatoren für die Trendanalyse - wir analysieren in Schritten von 10 und berücksichtigen die absoluten Veränderungen.
Der Zickzackkurs ist eine clevere Idee, aber wie werden die Spitzen aus den flachen Wobbeln herausgefiltert, die falsche Trendwechselpunkte sein könnten?
Ein vernünftiger Ansatz. Und die Muster, die einfach als die Position der Balken in der Matrix beschrieben werden, ohne das tatsächliche Preis-Delta zu berücksichtigen - nur die relative Position?
Ich habe eine Idee, die Musterindikatoren auszuprobieren, aber mit einem anderen Rahmen - die ersten fünf Balken analysieren wir die Indikatoren auf den letzten 5 Indikatoren, und zwei Indikatoren für die Trendanalyse - wir analysieren in 10er Schritten und berücksichtigen gleichzeitig die absoluten Veränderungen.
Der Zickzackkurs ist eine kluge Idee, aber wie können Spitzen, die aus flachen Wobbeln gefiltert werden, falsche Trendwechselpunkte sein?
Ich mache es so:
Es gibt ein dynamisches Array, das ausschließlich Paare von Mustern speichert (ich nenne es ein Wörterbuch), wenn ein Musterpaar ein zweites Mal in das Wörterbuch gelangt, schreibe ich es nicht auf; und zwei Zähler-Arrays von Senior Timeframe und Junior - sie zählen, wie oft ein Muster an der Bildung von Paaren beteiligt war, auch wenn es nicht in das Wörterbuch geschrieben wurde.
Der Trainingsvektor wird nach dem Wörterbuch gebildet, das Gewicht eines einzelnen Musters = Muster_Zähler / Maximum_Zähler. D.h. das Muster, das am häufigsten an der Bildung von Paaren beteiligt ist, ist gleich 1, und alle anderen Muster sind kleiner als 1. Dies ist die Tabelle, die Sie nach dem Unterrichten des NS erhalten:
Struktur des NS: 64 Eingangsneuronen, 4 interne, 1 Ausgang. Das heißt, ein Eingangsneuron beschreibt ein Muster. Das Training des Gitters dauert 40-50 Minuten, und der Fehler von NS übersteigt nicht 0,00001.
Damit habe ich ein Modell, das die Bedeutung von Musterpaaren vorhersagen kann, auch wenn es vorher nicht im Wörterbuch stand.
Ich kämpfe schon lange mit flachen und falschen Gipfeln, aber ich arbeite auf dem Niveau der ZigZaga-Berechnung. Ich habe den Code eines Standard-Zigzag leicht modifiziert, nämlich ZZ-Prozentsatz auf seiner Basis implementiert. Bislang sieht der Code mehr oder weniger wie folgt aus:
int MyCExtremum::GetCombiZigzag(const double &high[], // буфер цен high
const double &low[], // буфер цен low
const datetime &time[], // буфер время
int ExtDepth, // глубина поиска экстремумов(первого прохода)
double ExtDeviation,// "пороговое значение": жесткая ступенька + % роста цены
int ExtBackstep // глубина поиска экстремумов(второго прохода)
)
{
//--- value
int shift=0, whatlookfor=0, lasthighpos=0, lastlowpos=0, Deviat=1;
double lasthigh=0.0, lastlow=0.0, percent=0.0;
int rates_total = ArraySize(time); // размер входных таймсерий
int limit = rates_total - ExtDepth; // лимит на расчеты...
//+---------------------------------------------------------------+
//| ОЧЕНЬ ВАЖНАЯ ПРОВЕРКА ВЛИЯЮЩАЯ НА КОРРЕКТНОСТЬ ВЫЧИСЛЕНИЙ! |
//+---------------------------------------------------------------+
if(ArrayIsSeries(high)) ArraySetAsSeries(high,false);
if(ArrayIsSeries(low)) ArraySetAsSeries(low,false);
if(ArrayIsSeries(time)) ArraySetAsSeries(time,false);
//+---------------------------------------------------------------+
//| ПРОВЕРКИ ВХОДНЫХ ПЕРЕМЕННЫХ |
//+---------------------------------------------------------------+
if(rates_total<20)
{
Print(__FUNCTION__," ERROR: the small size of the buffer.");
return(-1);
}
if(ExtDeviation<0 || ExtDeviation>100)
{
Print(__FUNCTION__," ERROR: Is\'not correct a Deviation. The value of Deviation should be in the interval [0..100].");
return(-1);
}
//--- Проверка: Depth and Backstep
if((ExtDepth < ExtBackstep)||(ExtDepth < 2))
{
Print(__FUNCTION__+" ERROR: Is\'not correct a Depth and Backstep. The value of Depth should be greater than Backstep.");
return(-1);
}
//--- готовим буфер ZigzagBuffer[]
if(ArraySize(ZigzagBuffer)>0) ArrayFree(ZigzagBuffer); // Удаляем старые данные
ArrayResize(ZigzagBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(ZigzagBuffer,0,rates_total,0.0);
if(ArrayIsSeries(ZigzagBuffer)) ArraySetAsSeries(ZigzagBuffer, false);
//---
if(ArraySize(HighMapBuffer)>0) ArrayFree(HighMapBuffer); // Удаляем старые данные
ArrayResize(HighMapBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(HighMapBuffer,0,rates_total,0.0);
if(ArrayIsSeries(HighMapBuffer)) ArraySetAsSeries(HighMapBuffer, false);
//---
if(ArraySize(LowMapBuffer)>0) ArrayFree(LowMapBuffer); // Удаляем старые данные
ArrayResize(LowMapBuffer,rates_total, EXTREMUM_RESERVE);
ArrayFill(LowMapBuffer,0,rates_total,0.0);
if(ArrayIsSeries(LowMapBuffer)) ArraySetAsSeries(LowMapBuffer, false);
//---
if(ArraySize(TimeBuffer)>0) ArrayFree(TimeBuffer); // Удаляем старые данные
ArrayResize(TimeBuffer, rates_total, EXTREMUM_RESERVE);
ArrayFill(TimeBuffer, 0, rates_total, 0);
if(ArrayIsSeries(TimeBuffer)) ArraySetAsSeries(TimeBuffer, false);
//--- корректировка Deviation
if(ExtDeviation < 1)
{
Deviat = 1;
}else
{
Deviat = (int)ExtDeviation;
}
//--- получаем "свежие" минимумы и максимумы
if(GetHighMapZigzag(high,ExtDepth,Deviat,ExtBackstep) < 0) return(0);
if(GetLowMapZigzag(low,ExtDepth,Deviat,ExtBackstep) < 0) return(0);
//--- final rejection
for(shift=ExtDepth;shift<rates_total;shift++)
{
switch(whatlookfor)
{
case Start: // search for peak or lawn
if(lastlow==0 && lasthigh==0)
{
if(HighMapBuffer[shift]!=0)
{
lasthigh=high[shift];
lasthighpos=shift;
whatlookfor=Sill;
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
}
if(LowMapBuffer[shift]!=0)
{
lastlow=low[shift];
lastlowpos=shift;
whatlookfor=Pike;
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
}
}
break;
case Pike: // search for peak
if(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0)
{
//---
ZigzagBuffer[lastlowpos] = 0.0;
TimeBuffer[lastlowpos] = 0;
//---
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
//--- Обход "двойственности"
if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow)
{
//---
ZigzagBuffer[lastlowpos] = 0.0;
TimeBuffer[lastlowpos] = 0;
//---
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
{
//--- Проверка: % роста цены
percent = (HighMapBuffer[shift]-lastlow)/(lastlow/100);
if(percent > ExtDeviation)
{
lasthigh=HighMapBuffer[shift];
lasthighpos=shift;
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
whatlookfor=Sill;
}
percent = 0.0;
}
break;
case Sill: // search for lawn
if(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)
{
//---
ZigzagBuffer[lasthighpos] = 0.0;
TimeBuffer[lasthighpos] = 0;
//---
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh)
{
//---
ZigzagBuffer[lasthighpos] = 0.0;
TimeBuffer[lasthighpos] = 0;
//---
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
TimeBuffer[shift]=time[shift];
//--- Обязательно: покинуть switch
break;
}
if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
{
//--- Проверка: % роста цены
percent = (lasthigh-LowMapBuffer[shift])/(lasthigh/100);
if(percent > ExtDeviation)
{
lastlow=LowMapBuffer[shift];
lastlowpos=shift;
ZigzagBuffer[shift]=lastlow;
TimeBuffer[shift]=time[shift];
whatlookfor=Pike;
}
percent = 0.0;
}
break;
default:
return(-1);
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
MyCExtremum ist eine Klasse zur Berechnung von ZigZag...
Ein vernünftiger Ansatz. Und die Muster, die einfach als die Position der Balken in der Matrix beschrieben werden, ohne das tatsächliche Preis-Delta zu berücksichtigen - nur die relative Position?
Ich habe eine Idee, die Musterindikatoren auszuprobieren, aber mit einem anderen Rahmen - die ersten fünf Balken analysieren wir die Indikatoren auf den letzten 5 Indikatoren, und zwei Indikatoren für die Trendanalyse - wir analysieren in 10er Schritten und berücksichtigen gleichzeitig die absoluten Veränderungen.
Der Zickzackkurs ist eine clevere Idee, aber wie werden die Spitzen aus den flachen Wobbeln herausgefiltert, die falsche Trendwechselpunkte sein könnten?
Andrey Emelyanov:
Struktur des NS: 64 Eingangsneuronen, 4 interne, 1 Ausgang. Das heißt, ein Eingangsneuron beschreibt ein Muster.
Ich tue Folgendes:
Es gibt ein dynamisches Array, das ausschließlich Paare von Mustern speichert (ich nenne es das Wörterbuch), wenn ein Paar von Mustern ein zweites Mal in das Wörterbuch gelangt, schreibe ich es nicht auf; und zwei Arrays mit Zählern für hohe und niedrige Zeitrahmen - sie zählen, wie oft ein Muster an der Bildung von Paaren beteiligt war, auch wenn es nicht in das Wörterbuch geschrieben wurde.
Der Trainingsvektor wird entsprechend dem Wörterbuch gebildet, das Gewicht eines einzelnen Musters = pattern_counter / maximum_counter. D.h. das Muster, das am häufigsten an der Bildung von Paaren beteiligt ist, ist gleich 1, und alle anderen Muster sind kleiner als 1. Dies ist die Tabelle, die Sie nach dem Unterrichten des NS erhalten:
Struktur des NS: 64 Eingangsneuronen, 4 interne, 1 Ausgang. Das heißt, ein Eingangsneuron beschreibt ein Muster. Das Training des Gitters dauert 40-50 Minuten, und der Fehler von NS übersteigt nicht 0,00001.
Damit habe ich ein Modell, das die Bedeutung von Musterpaaren vorhersagen kann, auch wenn es vorher nicht im Wörterbuch stand.
Ich kämpfe schon lange mit flachen und falschen Gipfeln, aber ich arbeite auf dem Niveau der ZigZaga-Berechnung. Ich habe den Code eines Standard-Zigzag leicht modifiziert, nämlich ZZ-Prozentsatz auf seiner Basis implementiert. Bislang sieht der Code mehr oder weniger wie folgt aus:
Die Anordnung ist eine interessante Lösung. Gibt es statistische Unterschiede zwischen den Paaren/Zeiträumen, wie stabil ist generell die Variabilität der Häufigkeit des Auftretens eines Musters, das ein positives Vorhersageergebnis liefert?
Was den Zickzackkurs angeht, so habe ich auch eine prozentuale Lösung, aber ich verwende auch einen tieferen Verlauf, um einen Referenzabschnitt des Zickzackkurses zu berechnen, mit dem ich die prozentuale Veränderung in anderen Bereichen vergleiche.
Was die Analyse von Indikatoren mit Mustern angeht - das ist sehr interessant... Ich denke, dass es bei Indikatoren weniger Rauschen gibt, aber man muss die Indikatoren so auswählen, dass einer "geringes Rauschen" und der andere "hohes Rauschen" unterdrückt, dann hat man einen Multifilter.
Hoffen Sie auf Ergebnisse mit diesem Modell? Ihre innere Schicht fungiert als Zwischenkompressor, nicht als Klassifikator.
Die Anordnung ist eine interessante Lösung. Gibt es Unterschiede in der Statistik zwischen den Paaren/Zeiträumen, wie stabil ist die Häufigkeitsvariabilität des Auftretens von Mustern im Allgemeinen, die zu einem positiven Vorhersageergebnis führt?
Was den Zickzackkurs angeht, so habe ich auch eine prozentuale Lösung, aber ich verwende auch einen tieferen Verlauf, um einen Referenzabschnitt des Zickzackkurses zu berechnen, mit dem ich die prozentuale Veränderung in anderen Bereichen vergleiche.
Wie jeder weiß, geben die Muster von A. Merrill keine genaue Antwort darauf, ob sich das Muster weiterentwickelt (Trendfortsetzung) oder in ein anderes Muster übergeht (Kurserholung). Deshalb habe ich beschlossen, die Antwort in zwei Zeitrahmen zu suchen - eine Stunde und eine Minute. Ich sammle Statistiken über die Wiederholung von Paaren und habe noch kein universelles Trainingswörterbuch. Ich bin jedoch sicher, dass diese Verbindung bestehen muss... Sonst gäbe es keine harmonischen Modelle: Schmetterlinge, Fledermäuse, usw.
Mein Baby ist immer noch dumm und stumpf, aber es macht Fortschritte... 8 Eingangsindikatoren, 1 Ausgang, 15 Neuronen in der verdeckten Schicht. 2000 Eingabevektoren, 10000 Trainingsepochen.
Dies ist bereits das 3. oder 4. Mal, wobei alle so ziemlich die gleichen Ergebnisse erzielen. Ich denke, ich brauche mehr Neuronen und einen Eingabevektor, aber das Training dauert sehr lange.
Ich habe eine ungefähre Vorstellung von dem Muster, das es aufgreifen sollte, ich habe Indikatoren aus verschiedenen Zeitrahmen ausgewählt und die Ausgaben scheinen aussagekräftige Informationen zu enthalten.