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

 
spoiltboy:

Salutations. Je me suis renseigné, mais je n'ai pas encore trouvé de réponse. Pouvez-vous me dire pourquoi avec l'entrée suivante

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

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

Le système génère constamment des erreurs

: ticket invalide pour la fonction OrderDeletefunction

: Erreur de suppression de commande 4051

Selon le livre de référence, c'est

Valeur invalide du paramètre de fonction

Bien que les paramètres semblent être les mêmes.

Bien que si vous supprimez la condition et laissez seulement

CommandeSuppression(ticketD) ;

CommandeDelete(ticketUP) ;

il supprime avec succès (mais j'en ai besoin par condition). Qu'est-ce que je fais de mal ? Voici le tout :

Parce qu'il doit être sélectionné par OrderSelect, votre valeurticketD est perdue, et très probablement il y a à la place du ticket, du yukhnya, essayez d'imprimer, et comparez. Et en général, ce style d'écriture est une absurdité.
 
Vitaly Muzichenko:
Parce qu'il doit être sélectionné via OrderSelect, votre valeurticketD est perdue, et il est fort probable qu'il y ait une connerie à la place du ticket, essayez de l'imprimer et comparez.

Est-ce parce que la fonction de suppression est déclenchée par la condition de perte de la valeur ? J'ai essayé de l'écrire comme ça :

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

CommandeDelete(ticketUP) ;

sur la condition à venir pour "ticketD" écrit les mêmes erreurs, et l'ordre"ticketUP" est supprimé avec succès à chaque tick.

 
Vitaly Muzichenko:
Et en général, ce style d'écriture est absurde.
Je viens juste de commencer, les commentaires sont les bienvenus.
 
spoiltboy:
Je ne fais que commencer, les commentaires sont les bienvenus.
Collez le code avec "SRC" pour pouvoir le consulter.
 
Renat Akhtyamov:
insérer le code via "SRC" pour pouvoir regarder
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0;


void OnTick()  
{
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}

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"); else Print("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"); else Print("OP_SELL OK");}

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


double maxpr=-9999; double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}

int BuyCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}}return(count);}

int SellLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}}return(count);}

int SellCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}}return(count);}
 
spoiltboy:

Est-ce parce que la fonction de suppression est déclenchée par la condition de perte de la valeur ? J'ai essayé de l'écrire comme ça :

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

CommandeDelete(ticketUP) ;

Lorsque la condition pour "ticketD" arrive, elle écrit les mêmes erreurs, et l'ordre"ticketUP" est supprimé avec succès à chaque tick.

Nous devons vérifier l'existence de l'ordre, et s'il y en a un avec un tel ticket, nous le supprimons ; s'il n'y en a pas, nous ne faisons rien. Ce qui se passe, c'est que la commande est déjà supprimée et que vous continuez à la supprimer à nouveau.
 
Vitaly Muzichenko:
Nous devons vérifier l'existence de l'ordre et s'il y en a un avec une telle coche, nous le supprimerons, sinon, nous ne ferons rien. Ce qui se passe, c'est que la commande a déjà été supprimée et que vous continuez à la supprimer à nouveau.

Dans cette entrée, l'ordre avecticketUP est d'abord ouvert puis supprimé à chaque tick, tandis que l'ordre tikcetD, si la condition correspondante se produit, génère une erreur de suppression. C'est selon le journal.

Ou peut-être ai-je confondu quelque chose ?

 
spoiltboy:

mais la ligne de fond des deux est-elle par hasard redondante ?

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);//лишняя?

Si elle n'est pas superflue, où se trouve la condition de suppression ?

Il s'agit d'une variante du code qui essaie de supprimer un ordre en attente à chaque tick, comme je le pense.

Et le numéro du billet n'est pas clair.

C'est ce qui va renvoyer l'erreur.

 
spoiltboy:

Dans cette entrée, l'ordre avecticketUP est d'abord ouvert puis supprimé à chaque tick, tandis que l'ordre tikcetD, si la condition correspondante se produit, génère une erreur de suppression. C'est selon le journal.

Ou peut-être suis-je confus ?

bien, correctement.

Quelle est la question alors ?

 
Renat Akhtyamov:

Eh bien, c'est vrai.

Quelle est la question alors ?

Ceci est pour des commandes différentes. La fonction de supprimer l'un avec une condition, de supprimer l'autre sans condition.

La question est de savoir pourquoi, dans mon cas, la fonction de suppression sans condition fonctionne avec succès, alors que si je l'intègre à une condition, elle donne lieu à une erreur lorsque la condition se produit.