![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
J'ai aussi essayé d'implémenter un algorithme similaire en 2013... Mais j'ai utilisé 7 indicateurs, et Zigzag a été utilisé pour former un vecteur pour l'entraînement du NS. Mais l'essence est la même - je cherchais des positions inversées... Lorsque j'ai commencé à utiliser Zigzag, je n'avais aucune chance avec les données des indicateurs et les signaux de trading. jusqu'à ce que je tombe accidentellement sur des modèles. Cela a radicalement changé mon TS. Maintenant, mon algorithme est beaucoup plus simple :
1. Calculer les tendances à la minute et à l'heure, sur l'année écoulée ;
2. Réalisation d'un dictionnaire des points d'inflexion (paires "schéma des minutes - schéma des heures") ;
3. enseignement du NS à l'aide du dictionnaire du point de bascule (sur 150-160 paires) ;
C'est le résultat de ma démarche :
aux inconvénients de mon approche :
1) Risque élevé du TS - comme il n'est pas possible de déterminer la valeur exacte du prix de rupture, le TS place 9 ordres en attente avec des lots : 1, 1, 3, 6, 14, 31, 70, 158, 355 ;
2) Difficile de mettre en œuvre un algorithme de sortie (chalut TS) ;
Donc NS peut être utilisé pour le trading, la seule question est de savoir ce qu'il faut enseigner à NS...
P/s : Par motifs, j'entends les motifs de A. Merrill (M & W) .
C'est une approche intelligente. Et les modèles ont été décrits simplement comme la position des barres dans la matrice, sans prendre en compte le delta de prix réel - seulement la position relative ?
J'ai une idée, pour essayer les indicateurs de tendance mais avec un cadre différent - les cinq premières barres nous analysons les indicateurs sur les 5 derniers indicateurs, et les deux indicateurs pour l'analyse de tendance - nous analysons par incréments de 10 et prenons en compte les changements absolus.
Le zig-zag est une idée intelligente, mais comment les pics sont-ils filtrés à partir des ondulations plates qui pourraient être de faux points de changement de tendance ?
Une approche raisonnable. Et les modèles décrits simplement comme la position des barres dans la matrice, sans prendre en compte le delta de prix réel - juste la position relative ?
J'ai une idée, pour essayer les indicateurs de tendance, mais avec un cadre différent - les cinq premières barres nous analysons les indicateurs sur les 5 derniers indicateurs, et deux indicateurs pour l'analyse des tendances - nous analysons par pas de 10 et en même temps nous prenons en compte les changements absolus.
Le zig-zag est une idée intelligente, mais comment des pics filtrés à partir de wobbles plats pourraient être de faux points de changement de tendance ?
Je le fais de cette façon :
Il y a un tableau dynamique qui stocke exclusivement les paires de motifs (je l'appelle un dictionnaire), si une paire de motifs entre dans le dictionnaire une deuxième fois, je ne l'écris pas ; et deux tableaux de compteurs de senior timeframe et junior - ils comptent combien de fois un motif a été impliqué dans la formation de paires, même s'il n'a pas été écrit dans le dictionnaire.
Le vecteur d'apprentissage est formé selon le dictionnaire, le poids d'un motif individuel = compteur_de_motifs / compteur_maximum. C'est-à-dire que le motif qui participe le plus souvent à la formation de paires est égal à 1, et tous les autres motifs sont inférieurs à 1. C'est le tableau que vous obtenez après avoir enseigné le NS :
Structure du SN : 64 neurones d'entrée, 4 internes, 1 de sortie. C'est-à-dire qu'un neurone d'entrée décrit un seul motif. L'entraînement de la grille prend 40 à 50 minutes, et l'erreur de NS ne dépasse pas 0,00001.
J'ai donc un modèle qui peut prédire la signification de paires de motifs, même si elle ne figurait pas dans le dictionnaire auparavant.
J'ai longtemps lutté contre les pics plats et faux, mais je travaille au niveau du calcul de ZigZaga. J'ai légèrement modifié le code d'un Zigzag standard, à savoir, implémenté le pourcentage ZZ sur sa base. Jusqu'à présent, le code ressemble plus ou moins à ce qui suit :
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 est une classe permettant de calculer le ZigZag...
Une approche raisonnable. Et les modèles sont décrits simplement comme la position des barres dans la matrice, sans prendre en compte le delta de prix réel - juste la position relative ?
J'ai une idée, pour essayer les indicateurs de tendance, mais avec un cadre différent - les cinq premières barres nous analysons les indicateurs sur les 5 derniers indicateurs, et deux indicateurs pour l'analyse des tendances - nous analysons par pas de 10 et en même temps nous prenons en compte les changements absolus.
Le zig-zag est une idée intelligente, mais comment les pics sont-ils filtrés à partir des ondulations plates qui pourraient être de faux points de changement de tendance ?
Andrey Emelyanov:
Structure du SN : 64 neurones d'entrée, 4 internes, 1 de sortie. C'est-à-dire qu'un neurone d'entrée décrit un seul motif.
Je fais ce qui suit :
Il y a un tableau dynamique qui stocke exclusivement les paires de motifs (je l'appelle le dictionnaire), si une paire de motifs se retrouve dans le dictionnaire une deuxième fois, je ne l'écris pas ; et deux tableaux de compteurs de temps forts et de temps faibles - ils comptent combien de fois un motif a été impliqué dans la formation de paires, même s'il n'a pas été écrit dans le dictionnaire.
Le vecteur d'apprentissage est formé selon le dictionnaire, le poids d'un motif individuel = compteur_de_motifs / compteur_maximum. C'est-à-dire que le motif qui participe le plus souvent à la formation de paires est égal à 1, et tous les autres motifs sont inférieurs à 1. C'est le tableau que vous obtenez après avoir enseigné le NS :
Structure du SN : 64 neurones d'entrée, 4 internes, 1 de sortie. C'est-à-dire qu'un neurone d'entrée décrit un seul motif. L'entraînement de la grille prend 40 à 50 minutes, et l'erreur de NS ne dépasse pas 0,00001.
J'ai donc un modèle qui peut prédire la signification de paires de motifs, même si elle ne figurait pas dans le dictionnaire auparavant.
J'ai longtemps lutté contre les pics plats et faux, mais je travaille au niveau du calcul de ZigZaga. J'ai légèrement modifié le code d'un Zigzag standard, à savoir, implémenté le pourcentage ZZ sur sa base. Jusqu'à présent, le code ressemble plus ou moins à ce qui suit :
Le tableau est une solution intéressante. Y a-t-il des différences dans les statistiques entre les paires/périodes, quelle est la stabilité en général de la variabilité de la fréquence d'occurrence d'un modèle donnant un résultat de prédiction positif ?
En ce qui concerne le zig-zag, j'ai aussi une solution en pourcentage, mais j'utilise aussi un historique plus profond pour calculer une section de référence du zig-zag, par rapport à laquelle je compare le pourcentage de changement des autres.
Quant à l'analyse des indicateurs avec des modèles, c'est très intéressant... Je pense qu'il y a moins de bruit dans les indicateurs, mais il faut choisir les indicateurs de façon à ce que l'un supprime le "faible bruit" et l'autre le "fort bruit", puis vous avez un multi-filtre.
Vous espérez des résultats avec ce modèle ? Votre couche interne agit comme un compresseur intermédiaire, pas comme un classificateur.
Le tableau est une solution intéressante. Existe-t-il des différences statistiques entre les paires/périodes, quelle est la stabilité en général de la variabilité de la fréquence d'apparition du motif qui donne un résultat de prédiction positif ?
En ce qui concerne le zig-zag, j'ai aussi une solution en pourcentage, mais j'utilise aussi un historique plus profond pour calculer une section de référence du zig-zag, par rapport à laquelle je compare le pourcentage de changement des autres.
Comme tout le monde le sait, les modèles d'A. Merrill ne donnent pas une réponse exacte à la question de savoir si le modèle va se développer davantage (maintien de la tendance) ou se transformer en un autre modèle (rebond du prix). C'est pourquoi j'ai décidé de chercher la réponse en utilisant deux échelles de temps - une heure et une minute. Je collecte des statistiques sur la récurrence des paires et je ne dispose pas encore d'un dictionnaire de formation universel. Cependant, je suis sûr que cette connexion doit exister... Sinon, il n'y aurait pas de modèles harmonieux : papillons, chauves-souris, etc.
Mon bébé est toujours aussi bête et ennuyeux, mais il avance... 8 indicateurs d'entrée, 1 sortie, 15 neurones dans la couche couverte. 2000 vecteurs d'entrée, 10000 époques d'apprentissage.
C'est en fait le 3e ou 4e, et tous obtiennent à peu près les mêmes résultats. Je suppose que j'ai besoin de plus de neurones et de vecteurs d'entrée, mais l'entraînement prend beaucoup de temps.
J'ai une idée approximative du modèle qu'il devrait détecter, j'ai sélectionné des indicateurs de différentes périodes et les sorties semblent contenir des informations significatives.