[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 656

 
artmedia70:
Qu'est-ce qui peut provoquer un débordement de pile ? Lorsque vous ouvrez une position avec une prise importante (la prise est calculée à partir de la volatilité et multipliée par 100, la taille est 41*100), alors un dépassement de pile est écrit dans le journal et... ... juste le prendre. Aucune autre position n'est ouverte tant que celle-ci n'est pas fermée, et celle-ci, bien sûr, ne sera pas fermée à cause de l'énorme TP... Et l'EA ne fonctionne pas du tout correctement, car il devrait fermer toutes les positions lorsque le profit total prédéfini des positions ouvertes est atteint.... Mais cela ne se produit pas, même si cette position a enregistré d'énormes bénéfices pendant longtemps, environ deux mille points... Comment puis-je le combattre ? On ne peut pas se prémunir contre la situation où toutes les positions ouvertes déborderont de la pile, et tout sera sens dessus dessous...
.


la pile ne peut pas déborder juste avec un nombre qui est en dehors de la gamme de type - il y aura une autre erreur

Les données passées dans une fonction ou un appel récursif à une fonction sans quitter celle-ci peuvent faire déborder la pile.

start() est aussi une fonction - peut-être avez-vous beaucoup de variables ici.

la pile est une région de la mémoire où sont stockées les valeurs intermédiaires (variables locales) d'une fonction ; vous pouvez casser la pile vous-même si vous utilisez des tableaux dynamiques et que vous n'avez pas correctement vérifié la portée du tableau, c'est-à-dire que vous écrivez des données non pas dans un tableau, mais dans une région de la mémoire qui se trouve juste après le tableau.

essayez de déplacer certains des tableaux vers des variables globales - mettez-les en haut du tableau.

ZS : au moins c'est le même dans tous les langages de programmation - je pense que c'est le même dans mql

 
IgorM:


la pile ne peut pas déborder juste avec un nombre qui est en dehors de la gamme de type - il y aura une autre erreur

Les données passées dans une fonction ou un appel récursif à une fonction sans quitter celle-ci peuvent faire déborder la pile.

start() est aussi une fonction - peut-être avez-vous beaucoup de variables ici.

la pile est une région de la mémoire où sont stockées les valeurs intermédiaires (variables locales) d'une fonction ; vous pouvez casser la pile vous-même si vous utilisez des tableaux dynamiques et que vous n'avez pas correctement vérifié la portée du tableau, c'est-à-dire que vous écrivez des données non pas dans un tableau, mais dans une région de la mémoire qui se trouve juste après le tableau.

essayez de déplacer certains des tableaux vers des variables globales - mettez-les en haut du tableau.

ZS : au moins c'est le même dans tous les langages de programmation - je pense que c'est le même dans mql

Igor, tu sais que j'ai évité d'utiliser des tableaux jusqu'à présent... Je n'ai que deux tableaux dans mon code - un tableau des ordres avant le tick et un tableau des ordres après le tick. Je les ai définis dans la zone des variables globales. Ce qui est amusant, c'est que j'ai déplacé le code pour ouvrir ces positions ailleurs dans l'EA et l'erreur a disparu. Il semble qu'il y ait eu un appel récursif à l' ouverture des commandes, bien que je ne m'en sois pas vraiment occupé. J'ai simplement décidé qu'il ne serait pas approprié de placer l'ouverture immédiatement après la fermeture de toutes les positions dans le code pour vérifier si le profit total a été atteint et si toutes les positions ont été fermées... J'ai fait un gâchis... :)
 
artmedia70:
Igor, tu sais que j'ai évité d'utiliser des tableaux jusqu'à présent... Je n'ai que deux tableaux dans mon code - un tableau des ordres avant le tick et un tableau des ordres après le tick. Je les ai définis dans la zone des variables globales. Ce qui est amusant, c'est que j'ai déplacé le code pour ouvrir ces positions ailleurs dans l'EA et l'erreur a disparu. Il semble qu'il y ait eu un appel récursif pour ouvrir des ordres, bien que je ne m'en sois pas vraiment occupé. J'ai simplement décidé qu'il ne serait pas approprié de placer l'ouverture immédiatement après la fermeture de toutes les positions dans le code pour vérifier si le profit total a été atteint et si toutes les positions ont été fermées... J'ai fait un gâchis... :)

J'ai créé un modèle pour la création d'un EA - lorsqu'un ordre est placé, le drapeau de cet ordre est immédiatement activé et ensuite, avant d'ouvrir un nouvel ordre de ce type, je vérifie toujours le drapeau - si l'ordre existe, mais j'écris des EA avec un seul ordre.
 
IgorM:

J'ai depuis longtemps créé un modèle pour la création d'un EA - lorsque je place un ordre, je mets immédiatement un signe (drapeau) qu'un tel ordre existe, et ensuite avant d'ouvrir un nouvel ordre de ce type je vérifie toujours le drapeau - si un tel ordre existe, mais j'écris des EAs avec un seul ordre
Eh bien, je, et je pense que tout le monde, a ses propres développements, modèles et autres goodies. Ce n'est pas la question. Je continue à me battre avec les drawdowns et à essayer différentes méthodes, fonctions et autres. Si je travaille strictement avec la tendance, je ne peux pas comprendre comment attraper l'épuisement de la tendance si sur un TF, le plus ancien, la tendance s'est déjà transformée en un plat, tandis que sur le plus jeune, elle est toujours là, mais elle arrive à sa fin. Lorsque l'on ouvre une position dans un ordre faible, la probabilité de son drawdown est élevée et elle ne sera pas fermée à temps. J'essaie maintenant de travailler avec des graphiques de 4 heures en partant du graphique de 4 heures, où l'on définit la direction et où l'on travaille uniquement dans cette direction à tous les points bas. Le moment de la transition de la tendance à l'appartement, je l'ai plus ou moins identifié, nous allons regarder les résultats.
 
Craft:


Oui, j'ai obtenu "0", mais que dois-je faire ? Je ne peux pas le faire des deux façons (j'ai même essayé des périodes égales), j'ai essayé les deux Print("NormalizeDouble(c1b_1..."), mais j'ai obtenu des zéros (seul c1b[i] montre la valeur, tous les autres y compris c1s[i] sont des zéros), pouvez-vous m'aider à mettre l'un d'entre eux en état de fonctionnement ou partager une astuce, si vous remarquez des défauts ?

Nouveau :

Vieux :

Entier :


Yuri, à l'avenir, si le code est répété au moins deux fois, il devrait être alloué à une méthode, et vous n'aurez pas besoin de tas de tableaux qui encombrent le code.
Voici une méthode pour vous :

//+------------------------------------------------------------------+
double iCCIAverage(string cci_symbol, int cci_timeframe, int cci_period, int cci_applied_price, int ma_period, int ma_method, int ma_shift){
   double array[];
   int loop_array;
   ArrayResize(array,ma_period + ma_shift);
   for(int loop = ma_period + ma_shift - 1; loop >= 0; loop--, loop_array++)array[loop_array] = iCCI(cci_symbol, cci_timeframe, cci_period, cci_applied_price, loop);
   return(iMAOnArray(array, 0, ma_period, 0, ma_method, ma_shift));
}
//+------------------------------------------------------------------+

Je pense que tout est clair avec les paramètres, entrez les données et en faisant varier le paramètre ma_shift obtenez le décalage dont vous avez besoin. Notez que cette méthode peut être utilisée comme modèle, il suffit de changer les méthodes d'accès pour les indicateurs i...(...) ou iCustom(...). Maintenant, votre bloc de décisions commerciales est comme il se doit :

//--------------------------------------------------------------- 5 --
   // Торговые критерии
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 1),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 3),4))
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 1),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 3),4))
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --

Par conséquent, il n'y a plus besoin de variantes "anciennes" et "nouvelles", les transactions sont ouvertes en fonction de critères donnés (si j'ai bien compris, vous avez un modèle à trois barres de sommets et de creux lissés iCC). Il y a une variante corrigée dans le dossier.

Dossiers :
21_2.mq4  14 kb
 

Bonjour.

Pouvez-vous me donner le code pour écrire les prix depuis l'ouverture de l'ordre dans le tableau.

Comment faire pour que chaque nouveau prix soit ajouté au tableau.

 
zelek:

Bonjour.

Pouvez-vous me donner le code pour écrire les prix depuis l'ouverture de l'ordre dans le tableau.

Comment faire pour que chaque nouveau prix soit ajouté au tableau.


Veuillez être plus précis dans votre question

Si vous êtes intéressé par le prix actuel au moment où vous passez la commande, vous pouvez ajouter un appel au code qui se chargera de stocker le prix actuel dans le tableau global en modifiant le compteur d'index du tableau, que vous pourrez consulter ultérieurement à partir de n'importe quel point du code.

 

comment vérifier les performances d'un EA - je voudrais juste afficher le temps d'exécution du code en millisecondes

Quelles sont les performances de MT5 par rapport à MT4 ?

 
IgorM:

comment vérifier les performances d'un EA - je voudrais juste afficher le temps d'exécution du code en millisecondes

Quelles sont les performances de MT5 par rapport à MT4 ?


GetTickCount serait utile https://docs.mql4.com/ru/common/GetTickCount
 
DDFedor:

GetTickCount vous aidera https://docs.mql4.com/ru/common/GetTickCount


merci oui c'est ce que je cherchais, quelqu'un a-t-il mesuré la vitesse du même type de code pour mt4 et mt5 ?