[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 660

 
Craft:


Anatoly, merci beaucoup, c'est dommage qu'on ne puisse pas insérer une icône ici, comme dans Skype avec un arc. Tout est simple et élégant. Je comprends, en communiquant avec d'autres programmes d'analyse technique, qu'il devrait en être ainsi, mais je n'ai toujours pas l'habitude de travailler avec mql. Merci pour le conseil sur le marquage de la méthode - je vais trouver une solution.

Pour mon dernier conseil, comment éviter les placements d'ordres multiples sur une barre par cet EA ? J'ai déjà reçu des conseils de personnes aimables mais ils n'ont pas aidé.

J'ai essayé de résoudre votre problème et voici ce que j'ai obtenu. Mais chaque chose en son temps.

Qui est coupable et que faire ? Ou d'où viennent les jambes...

Dans votre Expert Advisor, différents paramètres de l'indicateur CCI sont utilisés pour ouvrir une position (et respectivement, pour fermer la précédente). Vous avez des paramètres différents pour l'achat et des paramètres différents pour la vente. D'après ce que j'ai compris, c'est le truc. Par exemple, dans les tendances haussières, il est plus rentable d'utiliser des paramètres moins sensibles pour acheter, afin de permettre aux bénéfices de "croître" (c'est-à-dire qu'il est judicieux de maintenir la position...). (c'est-à-dire qu'il est judicieux de conserver plus longtemps une position dans une tendance). Alors que la vente (tendance à la hausse) nécessite des paramètres plus sensibles pour permettre des entrées/sorties rapides, par exemple lorsqu'on essaie d'attraper une correction (et donc de rester sur le marché avec une position de contre-tendance pendant moins longtemps). Tout est très logique et l'idée a du sens, mais il y a un point subtil dans ce système : que faire si deux signaux opposés se produisent simultanément en raison de différences de réglages (en fait, pour le terminal, il s'agit de deux indicateurs) ?

A propos des flèches bleues...

Le conseiller expert sur une barre reçoit un signal d'achat et de vente en même temps, et comme je l'ai écrit plus haut, lorsque vous ouvrez une position, la position opposée doit être fermée. Dans ce cas, le signal d'achat est donné et le signal de vente est fermé ; s'il n'y a pas de vente à ce moment-là, le conseiller ouvre BUY. Au tick suivant, le signal opposé est généré, qui est de vendre, et donc la position d'achat est fermée. Autre observation, avez-vous remarqué que seul l'achat (beaucoup de flèches bleues) "vacille" ? L'implémentation des méthodes d'achat/vente, d'après ce que j'ai compris, est reprise du tutoriel, mais il y a une caractéristique, qui après l'achèvement de l'opération, la sortie de la méthode start() par le retour de l'opérateur, c'est-à-dire que pour un tick il ne peut y avoir qu'une seule ouverture/fermeture. Ainsi, lorsque je reçois un "double signal", toutes les transactions sont fermées (le bloc de fermeture est décrit en premier), puis le bloc d'ouverture des transactions, et dans celui-ci l'achat est décrit en premier ! !!, et après l'achat, sortie de start(), de sorte que le conseiller n'a pas le temps d'arriver aux ventes :))) et boucle jusqu'à ce qu'il obtienne un ordre simple "normal".

A propos des méthodes de solution...

Il existe plusieurs façons de résoudre ce problème.
1. L'ancienne.
Pour commencer, vous pouvez "tuer" l'idée, et simplement définir les mêmes paramètres pour les achats et les ventes et le problème disparaîtra de lui-même.

2. Compliqué.
L'algorithme de détermination de la tendance principale doit être écrit dans le conseiller expert, et, en conséquence, les différents "poids" des transactions doivent être définis. Ainsi, lorsque des signaux opposés arrivent, la préférence doit être donnée à celui qui a le plus de "poids" (c'est-à-dire celui qui est en tendance).

3. Sans titre.
Lors de la réception de signaux multidirectionnels...
Ne rien faire.

if(Opn_B && Opn_S)return;

C'est exactement l'option proposée dans le fichier joint ci-dessous.
J'espère avoir tout expliqué clairement.
Bonne chance :))))

Dossiers :
11_3_1.mq4  13 kb
 

Le message de Volfram a été supprimé pour s'être multiplié dans plusieurs fils.

Volfram, vous avez créé votre propre fil de discussion spécifiquement dans ce but. On vous a déjà répondu ; n'est-ce pas suffisant ?

P.S. Je vais te dire un secret, Volfram: l'absence d'intérêt manifeste pour ton idée suggère implicitement qu'elle n'est pas digne d'attention. Par conséquent, personne n'était disposé à le mettre en œuvre "contre rémunération".

 
ToLik_SRGV:

2. Compliqué.
Nous devrions intégrer l'algorithme de détermination de la tendance principale dans le conseiller expert et ainsi donner des "poids" différents aux transactions. Ainsi, lorsque des signaux opposés arrivent, la préférence doit être donnée à celui qui a le plus de "poids" (c'est-à-dire celui qui est en tendance).

3. Sans titre.
A la réception de signaux dirigés différemment...
Ne faites rien.

C'est exactement l'option proposée dans le fichier joint ci-dessous.
J'espère avoir tout expliqué clairement.
Bonne chance :))))

Puis-je ajouter mon jalon aussi... :)

J'ai également commencé à partir d'un manuel scolaire. Vous pouvez faire plus simple : il suffit de supprimer la clôture d'achat sur un signal de vente et la clôture de vente sur un signal d'achat, c'est-à-dire ne pas utiliser le swing trading, qui a été mis en œuvre dans le tutoriel de Sergey Kovalev... Le suivi des positions ne doit pas être fait par le billet, mais par le magicien. Au début, je l'ai fait et j'ai tranquillement testé mes idées. Ensuite, j'ai écrit mes propres fonctions pour le travail...

ZS. Je n'ai pas regardé le code, donc je peux me tromper sur cette EA...

 

Je n'arrive pas à trouver comment trouver les extrema d'une fonction

J'ai un tableau de données qui stocke des valeurs :

comment trouver les fractures - extrema en utilisant un tableau de données de 250 éléments et en ne stockant que les numéros des éléments où ces extrema sont localisés.

 

Les gars, j'ai une question :

La fonction de détection de tendance indique explicitement que si le CA de la première barre est supérieur au CA de la deuxième barre (c'est-à-dire qu'il augmente), mais que la tendance est à la baisse (les autres indices sont à la baisse), alors dans ce cas, il faut retourner zéro, c'est-à-dire qu'il n'y a pas de tendance à la baisse... Mais l'EA s'entête à l'ignorer, quelle peut en être la raison ?


La fonction du renversement de tendance :

int Trend_BBOsMA (string sy, int tf)
{
   if (sy=="" || sy=="0") sy=Symbol();
double
   BB    =iCustom(sy,tf,"BB_MA",13,13,0,1),
   OsMA  =iOsMA  (sy,tf,9,21,5,PRICE_CLOSE,1),
   AC1   =iAC(sy,tf,1),
   AC2   =iAC(sy,tf,2),
   AC3   =iAC(sy,tf,3);
   
   if (BB>0 && OsMA>0 && AC1>AC2) return(1);
   if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
   else return(0);
}

Vérification des actions d'ouverture (au début, vérification de la tendance, à laquelle il ne réagit pas : trH1 et trM15 ) - autres expériences avec les conditions, ne vous en déplaise, mais le code fonctionne....

//============================================================================================== 
   // Доливка 1
//==============================================================================================  
//------------------------- Покупка 1 ------------------------   
   if (AddPose1 &&
         trH1==1 &&                  // Если часовой и 
         trM15==1 &&                 // пятнадцатиминутный тренды восходящие
         Mom5_1>Mom5_2 &&              // найден разворот
         Mom5_2<=Mom5_3 &&             // Моментума
//         Mom5_2<=100.0 &&
//         DeM5_1<=0.6 &&                  // и Демаркер в зоне перепроданности
//         AC1>AC2 &&                    // Ускорение вверх ----------------------- ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_BUY, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==10 || trM15==10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Buy_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL, OP_BUY, Lots_New, 0, 0, Magic, New_Comm);
         }
//------------------------- Продажа 1 ------------------------   
   if (AddPose1 && 
         trH1==-1 &&                 // Если часовой и 
         trM15==-1 &&                // пятнадцатиминутный тренды нисходящие
         Mom5_1<Mom5_2 &&              // найден разворот
         Mom5_2>=Mom5_3 &&             // Моментума
//         Mom5_2>=100.0 &&
//         DeM5_1>=0.4 &&                  // и Демаркер в зоне перекупленности
//         AC1<AC2 &&                    // Ускорение вниз ------------------------ ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_SELL, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==-10 || trM15==-10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Sell_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL,OP_SELL,Lots_New,0,0,Magic,New_Comm);
         }
//==============================================================================================

Peut-être que quelqu'un verra quelque chose que je ne vois pas ? Merci.

 
La capture d'écran ne montre pas l'indicateur BB_MA. Et il n'y a pas de contrôle de la direction de la tendance dans le code supérieur. La variable BB contiendra toujours une valeur. D'après ce que je comprends, l'indicateur BB_MA est une moyenne mobile. Pour déterminer la direction de la moyenne mobile, il faut avoir 2 valeurs sur des chandeliers différents, par exemple sur le premier et le deuxième chandelier et comparer ces valeurs entre elles. On peut donc dire que le code supérieur ne remplit que partiellement sa tâche.
 
IgorM:

Je n'arrive pas à trouver comment trouver les extrema d'une fonction

J'ai un tableau de données qui stocke des valeurs :

comment trouver les fractures - extrema en utilisant un tableau de données de 250 éléments et en ne stockant que les numéros des éléments où ces extrema sont situés.


Nous créons une boucle où nous parcourons les valeurs du tableau. La valeur de la cellule précédente du tableau est comparée à la valeur de la cellule actuelle. Si elle est supérieure, nous passons à l'itération suivante de la boucle. En bref, nous continuons la boucle tant que la valeur de chaque cellule suivante du tableau est incrémentée. Dès que la valeur devient plus petite que la précédente, nous stockons le numéro de la cellule précédente dans un tableau prédéclaré, car une rupture de tendance s'est produite - nous avons trouvé le pic. Maintenant, la tendance est à la baisse. Maintenant, nous effectuons la recherche jusqu'à ce que la cellule suivante trouve une valeur supérieure à la précédente. Une fois que cela se produit, le numéro de la cellule précédente est stocké dans un tableau prédéfini, car un renversement de tendance s'est produit - nous avons trouvé le fond du creux. Vous pouvez placer les chiffres dans des tableaux différents, pour filtrer les pics des creux. En bref, après avoir parcouru toutes les valeurs du tableau, nous obtenons des données triées (en recherchant les numéros de cellules dans un/deux autres tableaux).
 
drknn:

Nous mettons en place une boucle dans laquelle nous parcourons les valeurs du tableau. La valeur de la cellule précédente du tableau est comparée à la valeur de la cellule actuelle. Si elle est supérieure, nous passons à l'itération suivante de la boucle. En bref, nous continuons à itérer jusqu'à ce que la valeur de chaque cellule suivante du tableau soit incrémentée. Dès que la valeur devient plus petite que la précédente, nous stockons le numéro de la cellule précédente dans un tableau prédéclaré, car une rupture de tendance s'est produite - nous avons trouvé le pic. Maintenant, la tendance est à la baisse. Maintenant, nous effectuons la recherche jusqu'à ce que la cellule suivante trouve une valeur supérieure à la précédente. Une fois que cela se produit, le numéro de la cellule précédente est stocké dans un tableau prédéfini, car un renversement de tendance s'est produit - nous avons trouvé le fond du creux. Vous pouvez placer les chiffres dans des tableaux différents, pour filtrer les pics des creux. En bref, après avoir parcouru toutes les valeurs du tableau, nous obtenons des données triées (en recherchant les numéros des cellules dans un/deux autres tableaux).

yep, donc nous devons essayer pendant - c'est jusqu'au premier pic, et ensuite ........ - Je n'arrive pas à comprendre.
 
drknn:
La capture d'écran ne montre pas l'indicateur BB_MA. Et il n'y a pas de contrôle de la direction de la tendance dans le code supérieur. La variable BB contiendra toujours une valeur. D'après ce que j'ai compris, l'indicateur BB_MA est une moyenne mobile. Pour déterminer la direction de la moyenne mobile, il faut avoir 2 valeurs sur des chandeliers différents, par exemple sur le premier et le deuxième chandelier et comparer ces valeurs entre elles. Nous pouvons donc dire que le code supérieur ne remplit que partiellement son objectif.

Non, BB_MA est la Bears&Bulls_MA en abrégé. Il additionne les valeurs des hausses et des baisses et les sort sous forme d'histogramme, quelque chose comme McDuck ou quelque chose de similaire. Toujours quand l'histogramme est au-dessus de zéro, il y a une tendance à la hausse, quand il est en dessous, il y a une tendance à la baisse...

Il faut donc vérifier la direction de la tendance :

if (BB>0 && OsMA>0 && AC1>AC2) return(1);

pour UP et

if (BB<0 && OsMA<0 && AC1<AC2) return(-1);

pour DOWN, bien et

 else return(0);

pour Flat.

C'est-à-dire que la fonction renvoie 1 si Bears&Bulls_MA est supérieur à zéro, OsMA est supérieur à zéro et la valeur de la première barre AC est supérieure à la valeur de la deuxième barre AC,

et vice versa pour la tendance à la baisse. Eh bien, pour le plat, toutes les autres différences dans les graphiques (pour l'instant..., plus tard, quand j'aurai fait le tri, je relierai le contrôle du mouvement avec l'accélération/décélération et l'inversion).

Lespositions ne doivent êtreouvertes que lorsqu'il existe une "tendance à la hausse" ou une "tendance à la baisse" sans ambiguïté... En gros, tout fonctionnait, jusqu'à ce que j'ajoute l'AC pour contrôler la vitesse du mouvement des devises, afin d'exclure (partiellement) l'ouverture de positions en fin de mouvement, sur épuisement ou correction de tendance.

Pour l'instant, ça ne marche pas... et exactement AC.

 
IgorM:

yep donc nous devons essayer par moment - c'est jusqu'au premier pic et ensuite ........ - Je n'arrive pas à comprendre.

Non - la boucle doit être réalisée par for. Je vais essayer d'inventer un scénario. L'idée est en fait réalisable.