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

 
Alexey Viktorov:

Et il ne pouvait pas y en avoir d'autres. Aucun ordinateur ne connaît une année de moins que 1970. Commencez par l'année qui apparaît dans les devis du courtier.

Je vois) Merci.
 
Aleksey Vyazmikin:

Code dans MT5

Résultat :


SZZY : J'ai changé le code - c'était de la mauvaise personne.

Je n'ai pas tout de suite compris l'idée. Je ne l'ai pas fait dans mql5, je vais devoir trouver une solution. Mais vous pouvez le faire dans mql4 de la manière suivante :

Créez deux tampons supplémentaires.

Définir un décalage pour N barres et remplir ces N barres avec la dernière valeur des tampons principaux.

Et bien sûr, l'indice N+1 de ces tampons supplémentaires se remplit de valeur vide.

 
Alexey Viktorov:

Je n'ai pas tout de suite compris l'idée. Je ne l'ai pas fait dans mql5, je vais devoir trouver une solution. Mais dans mql4 vous pouvez le faire de la manière suivante :

Créez deux tampons supplémentaires.

Définissez un décalage pour eux de N barres et remplissez ces N barres avec la dernière valeur des tampons principaux.

Et bien sûr, l'indice N+1 de ces tampons supplémentaires se remplit de valeur vide.


Merci pour l'idée - je l'ai fait initialement dans MT5, puis je l'ai optimisé.

Bref, je me suis couché à 4 heures du matin (le code public n'est pas complet, bien sûr), mais j'ai fait ce que je voulais avec deux tampons.

Le problème était que dans MT5 le remplissage se fait de gauche à droite, et dans MT4 c'est l'inverse. La fonctionArraySetAsSeries n'a pas aidé - j'ai réécrit toute la logique en fait.

 

Bonjour, Artem !

Je voudrais demander de l'aide pour mon remaniement de TrExp_Nik ver. Je veux ajouter la possibilité de le déplacer vers le seuil de rentabilité, mais mes compétences limitées en programmation ne me permettent pas de le faire. J'ai décidé d'utiliser e-MovingInWL dont j'essaie d'intégrer le code dans mon EA, mais je n'arrive pas à combiner les variables correctement ou je ne comprends pas correctement le code du deuxième Conseiller Expert Breakeven. Ce n'est peut-être pas la variante optimale. Je voudrais vous demander votre avis sur la manière de l'améliorer ou de le rendre plus facile.

Dossiers :
 
niktach:

Bonjour, Artem !

Je voudrais demander de l'aide pour mon remaniement de TrExp_Nik ver. Je veux ajouter la possibilité de le déplacer vers le seuil de rentabilité, mais mes compétences limitées en programmation ne me permettent pas de le faire. J'ai décidé d'utiliser e-MovingInWL dont j'essaie d'intégrer le code dans mon EA, mais je n'arrive pas à combiner les variables correctement ou je ne comprends pas correctement le code du deuxième Conseiller Expert Breakeven. Ce n'est peut-être pas la variante optimale. Je voudrais vous demander votre avis sur la manière de l'améliorer ou de le simplifier.

Bonne journée. Qu'avez-vous essayé de faire exactement ? Je ne vois que deux codes joints. Si vous avez besoin de quelqu'un qui fasse tout à votre place, c'est à cela que sert le travail en free-lance.

Et si vous essayez de le faire vous-même, montrez-moi exactement ce que vous faites et ce que vous ne comprenez pas.

 

Bonjour,

Existe-t-il un moyen d'accéder par programme aux propriétés de l'objet graphique "triangle" placé sur le graphique ? Je veux parler des coordonnées de temps et de prix des sommets, qui sont affichées dans l'onglet "Paramètres" lorsque le formulaire des propriétés est ouvert de manière interactive. J'ai essayé d'utiliser les fonctionsObjectGetInteger et ObjectGetDouble, mais elles ne peuvent obtenir des données que sur un seul vertex.

Merci.

 
oddball:

Bonjour,

Existe-t-il un moyen d'accéder par programme aux propriétés de l'objet graphique "triangle" placé sur le graphique ? Je veux parler des coordonnées de temps et de prix des sommets, qui sont affichées dans l'onglet "Paramètres" lorsque le formulaire des propriétés est ouvert de manière interactive. J'ai essayé d'utiliser les fonctions ObjectGetInteger et ObjectGetDouble, mais elles ne peuvent obtenir des données que sur un seul vertex.

Merci.

Oui, vous pouvez. Et le sens de la pensée est correct. Pouvez-vous me montrer comment vous avez essayé d'obtenir les paramètres ?

 
Artyom Trishkin:

Lorsque l'ordre est sélectionné par ticket, il n'est pas nécessaire de spécifier le pool - MODE_TRADES est redondant ici - ce paramètre est ignoré lors de la sélection par ticket et l'ordre est sélectionné dans l'une des deux listes - dans la liste des positions fermées ou dans la liste des positions sur le marché - cela dépend si la position est fermée ou pas encore.

Après la sélection réussie d'un ordre basé sur le ticket, afin de comprendre à partir de laquelle des deux listes l'ordre a été sélectionné, il est nécessaire de vérifier l'heure de clôture de la position - si elle est supérieure à zéro, alors l'ordre a déjà été fermé et a été sélectionné à partir de la liste des ordres historiques, sinon - l'ordre est toujours sur le marché.

Mais pour comprendre où vous avez une erreur, vous devez joindre le code - donner plus d'informations, car il n'y a pas d'erreur dans cette ligne en principe (sauf que vous ne vérifiez pas le résultat du retour de la fonction, vous utilisez un modificateur qui est ignoré dans ce cas et il n'y a pas de " ;" après la parenthèse fermante).


Merci beaucoup pour la réponse.

Voici la fonction complète, le point est qu'elle ouvre un ordre et ajoute ensuite des valeurs constantes de stop loss et de take profit par modification.

L'ordre est ouvert mais le stop loss et le take profit ne sont pas fixés (la fonction de calcul en rouge, dans laquelleOrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) donne une erreur ((())

//Fonction Ordre ouvert, variables : symbole, type d'ordre, lot, prix ouvert, méthode de calcul du TP et du SL (0 - fixé dans le prix, 1 - fixé dans les points qui doivent être calculés à partir du prix ouvert), stop loss, take profit)

//Symbole/Paire, type d'ordre ouvert - en attente, prix ouvert, switch = 1, SL B TP - Les valeurs de Stop Loss et Take Profit sont constantes !

bool SendOrder(string Symb,int Type, double OP,int Mode) {
color CL ;
double Pp = MarketInfo(Symb, MODE_POINT) ;
if (Type==0) CL=Blue ;
if (Type==1) CL=Red ;
if (Type==2 || Type==4) CL=DarkTurquoise ;
if (Type==3 || Type==5) CL=Orange ;
//verview volume
if(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2 ; sinon DG=1 ;
if (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT) ;
if (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT) ;
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("Pas assez d'argent pour ouvrir la transaction",Type," ",DoubleToStr(Lot,DG)),0) ;
return ;
}
// vérifier les ordres en attente
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp ;
if (Type>1) {
if (Type==2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv ;
si (Type==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv ;
if (Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv ;
if (Type==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv ;
}
*/
RefreshRates() ;
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL) ; //Limite le niveau de stop loss/stake profit en pips. Distance minimale
double Tek_Ask = MarketInfo(Symb,MODE_ASK) ; //Le dernier prix de vente reçu. Il est stocké dans la variable prédéfinie Ask pour le symbole actuel
double Tek_Bid = MarketInfo(Symb,MODE_BID) ; //Le dernier prix d'offre reçu. Il est stocké dans la variable prédéfinie Bid pour le symbole actuel
double Tek_Point = MarketInfo(Symb,MODE_POINT) ; //Taille du point dans la devise de cotation. Il est stocké dans la variable prédéfinie Point pour le symbole actuel
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//Ce nombre de chiffres après la virgule dans le prix du symbole. Il est stocké dans la variable prédéfinie Digits

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits) ;
if (Type>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv ;
if (Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv ;
if (Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv
if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv ;
}
// vérifier les arrêts
if (SL !=0 || TP!=0) {
if (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL !=0) {
if (Type==0 || Type==2 || Type==4) SL=OP-Slv ; else SL=OP+Slv ;
}
if (MathAbs(OP-TP)<Slv && TP !=0) {
if (Type==0 || Type==2 || Type==4) TP=OP+Slv ; else TP=OP-Slv ;
}
}else{
if (SL*Pp<Slv && SL !=0) SL=Slv/Pp ;
if (TP*Pp<Slv && TP !=0) TP=Slv/Pp ;
}
}
// octobre
for(int k=0;k<=TryToTrade;k++) {
if (Type==0) OP=MarketInfo(Symb,MODE_ASK) ;
if (Type==1) OP=MarketInfo(Symb,MODE_BID) ;
PnC(StringConcatenate("Trying to open an order, type : ",Type," volume : ",Lot," prix : ",OP),0) ;
if (IsTradeAllowed()) {
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL) ;
}else{ PnC(StringConcatenate("Cannot open order ",k),0 ;) Sleep(3000) ; continue ; }
if (Ticket >= 0) { PnC(StringConcatenate("Order opened ",Ticket),0) ; break ; }
LastError=Fun_Error(GetLastError()) ;
if (LastError==0) {
RefreshRates() ; Sleep(WaitTime) ;
if (k==TryToTrade) return(false) ; }
if (LastError==1) return(false) ;
if (LastError==2) { Work=false ; return(false) ; }
}
// définir les arrêts
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) ;
if (SL==0 && TP==0) return ;
if (Mode==1) {
if (SL !=0) {
if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp ;
si (Type==1 || Type==3 || Type==5) SL=OrderOpenPrice()+SL*Pp ;
}
si (TP !=0) {
if (Type==0 || Type==2 || Type==4) TP=OrderOpenPrice()+TP*Pp ;
if (Type==1 || Type==3 || Type==5) TP=OrderOpenPrice()-TP*Pp ;
}
}

for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Trying to set stops on an order : ",Ticket," s/l : ",SL," t/p : ",TP),0) ;
if (IsTradeAllowed()) {
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE) ;
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE)
}else{ PnC(StringConcatenate("Cannot modify order ",k),0) ; Sleep(3000) ; continue ; }
if (TickeT == true) { PnC(StringConcatenate("Order modified ",Ticket),0) ; break ; }
LastError=Fun_Error(GetLastError()) ;
if (LastError==0) {
RefreshRates() ; Sleep(WaitTime) ;
if (k==TryToTrade) return(false) ; }
if (LastError==1) return(false) ;
if (LastError==2) { Work=false ; return(false) ; }
}
return(true) ;

}

 

Quelqu'un peut-il expliquer pourquoi l'erreur 131"wrong volume" apparaît lors de la modification d'un ordre ?

Le pending s'ouvre normalement, le lot est normalisé, lors de l'impression, le lot minimum est de 0,01, ce qui n'est pas inférieur à mon volume (compte de démonstration).

J'ai tout relu sur le forum et je n'ai pas trouvé le problème !

Je me demande toujours ce qui se passe dans les coulisses et ce qui n'est pas décrit.
 
forexman77:

Quelqu'un peut-il expliquer pourquoi l'erreur 131"wrong volume" apparaît lors de la modification d'un ordre ?

Le pending s'ouvre normalement, le lot est normalisé, lors de l'impression, le lot minimum est de 0,01, ce qui n'est pas inférieur à mon volume (compte de démonstration).

J'ai tout relu sur mon forum mais je n'ai pas trouvé le problème !

Ne cessez pas d'être surpris par les bugs cachés qui apparaissent et qui ne sont pas décrits.

J'ai essayé avec une autre société de courtage et cela ne m'a pas fait changer d'avis. La question est de savoir pourquoi quand vous appelez :

double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
Alert("MinLot=",MinLot,"MaxLot=",MaxLot);  

déduit 0.01, et le robot imprime 131 ?

Raison: