Questions des débutants MQL4 MT4 MetaTrader 4 - page 31

 
Sinon, indiquez comment écrire cette fonction de suppression dans cette condition.
 
spoiltboy:
Sinon, dites-moi comment écrire cette fonction de suppression dans cette condition.

vous devez d'abord définir le ticket de l'ordre en attente à supprimer

si le ticket est nul ou indéfini - alors ne le supprimez pas

 
spoiltboy:

Il s'agit de commandes différentes. La fonction consistant à supprimer l'un par une condition, à supprimer l'autre sans condition.

La question est de savoir pourquoi, dans mon cas, la fonction de suppression fonctionne avec succès sans condition, mais si je la mets dans une condition, elle génère une erreur lorsque la condition se produit.

La condition doit être corrigée, vous ne pouvez pas le faire sans la condition, les journaux prendront tout le disque dur.
 
Renat Akhtyamov:

vous devez d'abord définir le ticketD et le ticketUP à supprimer

Si le ticket est nul ou indéfini, aucune suppression ne sera effectuée.

Ainsi défini, un ticketD, l'autreticketUP .

Ou est-ce que je mélange quelque chose ?

 
spoiltboy:

Ainsi défini, un ticketD, l'autreticketUP .

Ou est-ce que je confonds quelque chose ?

Comment peut-il être défini si leticketUP est déjà supprimé ?

Vous l'avez supprimé, mettez ticketUP à l'état dont vous avez besoin, dans lequel la condition pour supprimer le ticketUP ne fonctionnera pas, et cette condition doit être ajoutée au code également

 
Renat Akhtyamov:

Comment peut-on le définir sile ticketUP a déjà été supprimé ?

Vous l'avez supprimé, mettez ticketUP à l'état dont vous avez besoin, dans lequel la condition pour supprimer le ticket ne fonctionnera pas, et cette condition doit également être ajoutée au code.

Ainsi, les commandes avecticketD, un autreticketUP sont créées en premier (selon la condition d'absence), et ensuite elles sont déjà supprimées.

if(BuyLimitCount()==0&& BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5) ;
tpB=NormalizeDouble(minpr1+pointtp*Point,5) ;
int ticketUP=OrderSend(Symbol(),OP_BUYLIMIT, lotB, minpr1,3, slB, tpB,"", MagicB,0, Red) ;
if(ticketUP==-1)Print("ERROR OP_BUY") ; elsePrint("OP_BUY OK");}

if(SellLimitCount()==0&& SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5) ;
tpS=NormalizeDouble(maxpr1-pointtp*Point,5) ;
int ticketD=OrderSend(Symbol(),OP_SELLLIMIT, lotS, maxpr1,3, slS, tpS,"", MagicS,0, Blue) ;
if(ticketD==-1)Print("ERROR OP_SELL") ; elsePrint("OP_SELL OK");}

if(x !=maxpr1){x=maxpr1 ;OrderDelete(ticketD);}

CommandeDelete(ticketUP);

Si je suis confus, quoi ?

 
spoiltboy:

Ainsi, les commandes avecticketD, un autreticketUP sont d'abord créées (selon la condition d'absence), puis elles sont supprimées.

si(BuyLimitCount()==0&& BuyCount()==0){
slB=NormaliserDouble(minpr1-pointsl*Point,5) ;
tpB=NormaliserDouble(minpr1+pointtp*Point,5) ;
int ticketUP=OrderSend(Symbol(),OP_BUYLIMIT, lotB, minpr1,3, slB, tpB,"", MagicB,0, Red);
si(ticketUP==-1)Print("ERROR OP_BUY") ; sinonPrint("OP_BUY OK");}

si(SellLimitCount()==0&& SellCount() ==0){
slS=NormaliserDouble(maxpr1+pointsl*Point,5) ;
tpS=NormaliserDouble(maxpr1+pointsl*Point,5) ;
int ticketD=OrderSend(Symbol(),OP_SELLLIMIT, lotS, maxpr1,3, slS, tpS,"", MagicS,0, Blue);
si(ticketD==-1)Print("ERROR OP_SELL") ; sinonPrint("OP_SELL OK");}

if(x!=maxpr1){x=maxpr1 ;OrderDelete(ticketD);}

CommandeDelete(ticketUP);

Si je confonds quoi ?

Encore une fois, vous avez un ordre sans condition :

CommandeDelete(ticketUP);

Pourquoi n'avez-vous pas changé le code ?

Prenez un temps d'arrêt pour "réfléchir" au moins et faire le tri + lisez ce que vous avez écrit, les conseils donnés.

Au fait, il y a le freelancing ici si vous ne pouvez pas...

 
Renat Akhtyamov:

Donc, encore une fois, vous avez un ordre sans condition :

CommandeDelete(ticketUP);

Pourquoi n'avez-vous pas changé le code ?

Prenez un temps d'arrêt pour "réfléchir" au moins et trouver une solution + lisez ce qu'on vous a écrit, les conseils qu'on vous a donnés.

Au fait, il y a le freelancing ici si ça ne marche pas...

Sans condition - parce que c'est ainsi que se fait le retrait, et avec une condition - non. J'ai donc écrit pour indiquer que je ne peux pas. Vous devriez l'écrire de cette façon :

CommandeSuppression(ticketD) ;

CommandeDelete(ticketUP) ;

Ensuite, chaque tick supprime les ordres déjà créés sur chaque tick (selon la condition d'absence). Et si nous l'écrivons avec la condition :

if (x!=maxpr1){x=maxpr1 ; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1 ; OrderDelete(ticketUP);}

Ensuite, lorsque la condition se produit, il écrit une erreur de suppression.

Comment écrire la suppression des commandes spécifiées dans cette condition ?

 
spoiltboy:

C'est sans condition - parce que c'est comme ça que la suppression fonctionne, mais avec une condition, ce n'est pas le cas. Je l'ai écrit de cette façon pour souligner ce que je ne peux pas faire. Si vous l'écrivez de cette façon :

CommandeSuppression(ticketD) ;

CommandeDelete(ticketUP) ;

Ensuite, chaque tick supprime les ordres déjà créés sur chaque tick (selon la condition d'absence). Et si nous l'écrivons avec la condition :

if (x!=maxpr1){x=maxpr1 ; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1 ; OrderDelete(ticketUP);}

Ensuite, lorsque la condition se produit, il écrit une erreur de suppression.

Comment écrire la condition sur la suppression des commandes spécifiées ?


Vous ne pouvez pas supprimer la condition pour supprimer les commandes !

ticketUP et ticketD doivent être écrits dans les variables globales lors de l'ouverture d'un ticket.

GlobalVariableSet("ticketUP",ticketUP) ;

GlobalVariableSet("ticketD",ticketD) ;

et lire à partir de là avant de supprimer un ticket en attente

ticketUP=GlobalVariableGet("ticketUP")

ticketD=GlobalVariableGet("ticketD")

A propos, regardez là (dans le global) - ce que vous avez, ce que le billet est écrit

Je pense qu'après cela, tout fonctionnera comme il se doit.

 
Bonjour, qui peut m'aider à résoudre le problème, j'écris un viper pour un tableau dynamique, voici le code de la classe :
class CArray
{  
private:
   template <typename T>
   T _array[];
   int _index;
   int _err;
   int _err_sys;
public:
   CArray(){_index = -1; _err = 0; _err_sys = 0;}
   ~CArray(){}
  // template <typename T>
   T operator[](int i){
      if((_index == -1) || (i < 0) || (i > _index)) {_err_sys = -1;}
      return (_array[i]);
   }
   T at(int i){  
      if((_index == -1) || (i < 0) || (i > _index)) {_err_sys = -1;}
      return (_array[i]);
   }
   void push_back(T value){
      _array[++_index] = value;
   }
};

une partie du code du programme :

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.1"
#property strict

#include "Array.mqh"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
CArray *array;


int OnInit()
  {
  int b = 1;
   array = new CArray();
   array.push_back(b);
   int a = array.at(0);
  
//---
   return(INIT_SUCCEEDED);
  }
...

Après avoir essayé d'exécuter le conseiller expert sur des données réelles, l'erreur suivante est signalée : erreur interne #-1005

Qu'est-ce que je fais de mal ? Merci d'avance !


Raison: