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

 

Bonjour !
Pour corriger l'indicateur, il fallait remplacer tous les points "." par un "" vide.

Dossiers :
supDem.zip  68 kb
 

Salutations.

J'ai modifié le type de sélection descommandes dans la fonction écrite de certains comptages de commandes, de la sélection par commande à la sélection par ticket.

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

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

Ensuite, lors de l'exécution de quelques dizaines de bougies, tout fonctionne correctement et après cela, il y a des erreurs répétées dans le journal :

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1 : ticket inconnu 2 pour la fonction OrderModify

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1 : OrderModify error 4108 // Numéro de ticket invalide.

Voici le texte complet, je l'ai modifié dans les quatre fonctions :

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=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double 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);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("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);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double 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
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


Et là, il y a un moment - après avoir changé la fonction de sélection, la fonction de modification de l'ordre a commencé à générer une erreur et seulement après un certain temps detest, au début tout était normal.

Pourquoi cela se produit-il et comment y faire face ?


 
spoiltboy:

Salutations.

J'ai modifié le type de sélection descommandes dans la fonction écrite de certains comptages de commandes, de la sélection par commande à la sélection par ticket.

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

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

Ensuite, lors de l'exécution de quelques dizaines de bougies, tout fonctionne correctement et après cela, il y a des erreurs répétées dans le journal :

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1 : ticket inconnu 2 pour la fonction OrderModify

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1 : OrderModify error 4108 // Numéro de ticket invalide.

Voici le texte complet, je l'ai modifié dans les quatre fonctions :

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=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double 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);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("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);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double 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
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


Et là, il y a un moment - après avoir changé la fonction de sélection, la fonction de modification de l'ordre a commencé à générer une erreur et seulement après un certain temps detest, au début tout était normal.

Pourquoi cela se produit-il et comment y faire face ?


Très probablement, vous obtenez cette erreur parce que vous essayez de modifier un ordre qui a déjà été déclenché ou supprimé. Vous devez effacer les variables où le ticket de l'ordre en attente est stocké, par exemple, lorsque l'ordre en attente a été déclenché.
 
Sergey Gritsay:
Vous obtenez probablement cette erreur parce que vous essayez de modifier un ordre en attente qui a déjà été déclenché ou supprimé. Vous devez réinitialiser les variables où le ticket en attente est stocké, par exemple, lorsque l'ordre en attente a été déclenché.
Savez-vous comment le faire correctement ? Je ne sais pas comment faire.
 

Bonjour à tous, aidez-moi à comprendre ce qui ne va pas.

mon Expert Advisor ouvre ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green) ;

Fermez МТ4, ouvrez МТ4 et vérifiez les travaux précédents de l'EA.

for(int prev=0 ; prev<OrdersTotal();prev++) //Contrôle de l'opération EA précédente

{

ViborOrdera=OrderSelect(prev,SELECT_BY_POS) ;

si(OrderSymbol()==Symbol())

//*************************************

//-------Vérifier le cycle d'achat--------

if(OrderType()==OP_BUY && OrderMagicNumber()==1111)

{

PriceAsk=OrderOpenPrice();//prix d'ouverture, nécessaire pour la suite du travail de l'EA.

}

question, où est l'erreur, il n'y a pas de contrôle ? Le corps de la boucle est dans l'Inite.

 

Pas le temps de faire le tri..........

Essayez de lire et de placer aux bons endroits.

boolRefreshRates() ;

///
 
ed3sss:

Bonjour à tous, aidez-moi à comprendre ce qui ne va pas.

mon Expert Advisor ouvre ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green) ;

Fermez МТ4, ouvrez МТ4 et vérifiez les travaux précédents de l'EA.


Question, où est l'erreur, il n'y a pas de contrôle ? Le corps de la boucle est en Inite.

Et prouver que c'est la boucle qui n'entre pas dans la boucle. De plus, pourquoi vérifier TOUTES les commandes, depuis le tout début de la vie du compte, si vous avez besoin des dernières ???
 
Mikhail Kozhemyako:

Pas le temps de faire le tri..........

Essayez de lire et de placer aux bons endroits.

boolRefreshRates() ;

///
Ça n'a pas aidé.
 
Vitalie Postolache:
Et prouver que c'est le cycle qui ne rentre pas. D'ailleurs, pourquoi devrions-nous vérifier TOUTES les commandes depuis le tout début de la vie du compte si nous avons besoin des dernières ?

Preuve : Print("Previous PriceAsk-",PriceAsk) ; le journal est vide.

D'ailleurs, pourquoi devrais-je vérifier TOUTES les commandes depuis le début de la vie du compte, si j'ai besoin des dernières ? - Comment faire autrement, s'il y a 10 paires de devises ouvertes ?


 

Tout allait bien jusqu'à ce que nous changions ViborOrdera=OrderSelect(prev,SELECT_BY_POS) dans MQL ;

Il s'agissait auparavant deOrderSelect(prev,SELECT_BY_POS) ;. C'était il y a longtemps), mais ça a marché.

Raison: