Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 280

 
hamsteruser:

*Returntick n'est pas détruit non plus. Je suis juste confus par l'échappement du terminal de trading. Il s'agit d'écrire sur des souvenirs non effacés.


Donnez-moi tout le code où vous utilisez le pointeur retourné par la fonction et le moment où vous détruisez le pointeur. C'est si difficile de vous aider.

 
Anatolij Povoroznyj:

Bonjour. Veuillez m'aider à corriger le code. J'ai besoin que l'EA n'ouvre pas une série d'ordres, mais un seul ordre sur le premier événement.

Maintenant, cela fonctionne de la façon suivante: lorsque le CCI traverse la ligne 200 vers le bas, cela ouvre un BAY, puis si le CCI traverse à nouveau 200 vers le bas, cela ouvre un autre BAY, etc., etc., jusqu'à ce que le CCI traverse la ligne -200 vers le haut, alors tous les BAY sont fermés et un Sell est ouvert.

Ce que je veux savoir : lorsque l'indice SSI franchit la ligne 200 de haut en bas - le premier et seul BAI s'ouvre, les autres BAI ne doivent pas s'ouvrir avant que l'indice SSI ne franchisse la ligne -200 de bas en haut, dans ce cas le BAI est fermé et une vente est ouverte. (Miroir de la ligne de vente et de la ligne -200).


Ajouter une fonction permettant de vérifier s'il existe des ordres ouverts du type concerné. C'est-à-dire que s'il y a des ordres, la fonction retournera vrai et l'ordre suivant ne s'ouvrira pas.

 

Probablement hors sujet...

Un souhait sur MT4

J'utilise de nombreuses alertes, et elles sont toutes réglées pour certains paramètres.

Je fixe la durée de vie de mes alertes aussi longtemps que nécessaire et les ressuscite à un nouveau prix cible.

Comme le journal des alertes de mon terminal n'est pas trié par symbole ou par événement, la recherche de la bonne alerte à chaque fois est un véritable casse-tête.

Il serait bon d'avoir des options de tri comme dans l'onglet "commerce".

 
hamsteruser:

Il y a une fonction avec un pointeur :


Je l'appelle encore dans une autre fonction :


Comment puis-je effacer la mémoire derrière elle ?

Sur delete(TickReturn) ; je reçois une erreur operand excepté.

TickReturn* rt = returntick( period, 1 );

int timeis = rt.curtime;

delete rt;
 
MMM1972:

Probablement hors sujet...

Un souhait sur MT4

J'utilise de nombreuses alertes, et elles sont toutes réglées pour certains paramètres.

Je fixe la durée de vie de mes alertes aussi longtemps que nécessaire et les ressuscite à un nouveau prix cible.

Comme le journal des alertes de mon terminal n'est pas trié par symbole ou par événement, la recherche de la bonne alerte à chaque fois est un véritable casse-tête.

Il serait bon d'avoir des options de tri comme dans l'onglet "commerce".

Le terminal MT4 n'est plus développé. Seuls les bogues trouvés sont corrigés.

 
Алексей Барбашин:

Donnez tout le code où vous utilisez le pointeur retourné par la fonction et le point où vous détruisez le pointeur. C'est si difficile de vous aider.

La mémoire est vraiment fluide.

  class TickReturn

   {

   public:

      int curtime;

      double open;

      double close;

      double high;

      double low;

      double priceask;

      double pricebid;

      

   };



  TickReturn *returntick(int period, int timeposition)

   {

      TickReturn *returntick = new TickReturn();

      MqlRates rates[];

      MqlTick last_tick;

      

      if(SymbolInfoTick(symbol,last_tick)){}

      else Print("SymbolInfoTick() failed, error = ",GetLastError());

      

      //int timeposition=0;

      ArraySetAsSeries(rates,true);

      ArrayResize(rates,1);

      int copied=CopyRates(symbol,period,timeposition,1,rates);

      

      returntick.curtime = rates[0].time;

      returntick.open = rates[0].open;

      returntick.close = rates[0].close;

      returntick.high = rates[0].high;

      returntick.low = rates[0].low;

      returntick.priceask = last_tick.ask;

      returntick.pricebid = last_tick.bid;

      

      return(returntick);

}

void OnTick() { int period = 15; int timeis = returntick(period, 1).curtime; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)); Вот здесь пытаюсь уничтожить указатель. }

 
hamsteruser:

La mémoire est vraiment fluide.


void OnTick() { int period = 15 ; int timeis = returntick(period, 1).curtime ; Print("timeis= ", TimeToStr(timeis,TIME_SECONDS)) ; C'est ici que j'essaie de détruire le pointeur }


On ne sait pas exactement ce qui peut être détruit ici. Pas étonnant que la mémoire fuit. Qu'est-ce qu'un pointeur ? Un pointeur est une référence à l'adresse mémoire où est stockée la variable dynamique créée. En fait, vous appelez la procédure de récupération d'un pointeur sur la variable de classe, dans cette procédure l'objet classe est créé, placé en mémoire, puis le pointeur est renvoyé à la fonction de récupération des ticks et..... est détruit lorsque vous quittez la fonction. Notez que le pointeur est détruit, mais que la mémoire n'est pas effacée ! Et à chaque nouveau tic, de plus en plus de mémoire est consommée ! Pour éviter ce point dans votre code, vous devez d'abord supprimer l'abréviation et placer le pointeur dans une autre variable :TickReturn* temptick =returntick(period, 1);// récupérer le pointeur et le placer dans une variable int timeis = temptick.curtime ; // Récupère la valeur requise de l'objet par le pointeur ...... delete temptick ; // Détruit le pointeur et vide la mémoire

Et avant de détruire le pointeur, il est préférable de vérifier s'il est correct pour éviter l'erreur de suppression.

Dans l'ensemble, je ne m'embêterais pas avec les pointeurs et la classe en particulier, car la tâche est beaucoup plus facile en fait et il n'y a pas besoin d'utiliser la classe. Créez une structure avec les champs nécessaires, déclarez une variable globale avec le type de cette structure, créez une fonction pour mettre à jour les informations dans cette structure à chaque tic et récupérez ce dont vous avez besoin, car la variable sera globale, vous n'aurez pas besoin de la faire passer par des fonctions et vous n'aurez pas besoin de pointeurs.

 

1. est-il possible d'utiliser mql4 pour désactiver d'autres EAs ?

2. Pour vérifier s'il y a un Expert Advisor en cours d'exécution sur un ChartId donné ?

 
Sergey Likho:

1. est-il possible d'utiliser mql4 pour désactiver d'autres EAs ?

2. Vérifier s'il y a un Expert Advisor en cours d'exécution sur un ChartId donné ?


Il est possible de désactiver le trading à l'intérieur du code de l'EA, et de faire un changement dans un fichier externe, alors un autre EA sera capable d'informer n'importe quel EA que le trading n'est plus nécessaire.

 
Aleksey Vyazmikin:

Vous pouvez interdire la négociation à l'intérieur du code de l'EA, et faire le changement dans le fichier externe, alors un autre EA sera capable de dire à n'importe quel EA que la négociation n'est plus nécessaire.


L'idée est exactement que l'EA A va désactiver l'EA B par condition.

Raison: