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

 
forexman77:

Je l'ai essayé sur un autre DC et il semble être OK. La question est de savoir pourquoi cet appel :

sort 0.01, mais imprime 131 sur le bot ?

Les lots doivent être normalisés lorsqu'ils sont transmis à la fonction.

 
Artyom Trishkin:

Les lots doivent être normalisés lorsqu'ils sont transférés à la fonction.


En fait, j'ai écrit que je normalisais. Il y a une limite au nombre de lots dans l'auto-trading.

Tu n'as pas besoin d'être le Capitaine Evidence ici.
 
forexman77:

En fait, j'ai écrit que je normalisais. Il existe une sorte de limite au nombre de lots dans le trading automatique.

Ne fais pas ton Capitaine Evidence.

Eh bien, regardez par vous-même, si c'est ainsi que vous voulez communiquer.

 
rabanik:

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 de take profit sont constantes !

bool SendOrder(string Symb,int Type, double OP,int Mode) {
couleur CL ;
double Pp = MarketInfo(Symb,MODE_POINT) ;
si (Type==0) CL=Bleu ;
si (Type==1) CL=Red ;
si (Type==2 || Type==4) CL=DarkTurquoise ;
si (Type==3 || Type==5) CL=Orange ;
//vérification du volume
si(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2 ; sinon DG=1 ;
si (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT) ;
si (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT) ;
si (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("Pas assez d'argent pour ouvrir la transaction",Type," volume : ",DoubleToStr(Lot,DG)),0) ;
retour ;
}
// vérifier les ordres en attente
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp ;
if (Type>1) {
si (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 ;
si (Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv ;
si (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) ; //Dernier prix de transaction reçu. Il est stocké dans la variable prédéfinie Ask pour le symbole courant.
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 la cotation. Il est stocké dans la variable prédéfinie Point pour le symbole courant.
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//Ce nombre de chiffres après la virgule dans le prix du symbole. Pour le symbole actuel, il est stocké dans la variable prédéfinie Digits.

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits) ;
if (Type>1) {
si (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv ;
si (Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv ;
si (Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv ;
si (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv ;
}
// vérifier les arrêts
if (SL!=0 || TP!=0) {
if (Mode==0) {
si (MathAbs(OP-SL)<Slv && SL!=0) {
si (Type==0 || Type==2 || Type==4) SL=OP-Slv ; sinon SL=OP+Slv ;
}
si (MathAbs(OP-TP)<Slv && TP!=0) {
si (Type==0 || Type==2 || Type==4) TP=OP+Slv ; sinon TP=OP-Slv ;
}
}sélection{
si (SL*Pp<Slv && SL!=0) SL=Slv/Pp ;
si (TP*Pp<Slv && TP!=0) TP=Slv/Pp ;
}
}
//ouverture
for(int k=0;k<=TryToTrade;k++) {
si (Type==0) OP=MarketInfo(Symb,MODE_ASK) ;
si (Type==1) OP=MarketInfo(Symb,MODE_BID) ;
PnC(StringConcatenate("Tentative d'ouverture d'un ordre, type :",Type," volume :",Lot," prix :",OP),0) ;
si (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) ;
si (k==TryToTrade) return(false) ; }
si (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 order : ",Ticket," s/l : ",SL," t/p : ",TP),0) ;
si (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) ;
si (k==TryToTrade) return(false) ; }
si (LastError==1) return(false) ;
if (LastError==2) { Work=false ; return(false) ; }
}
retour (vrai) ;

}

Maintenant l'erreur suivante sur la ligneif (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp ;. La fonction OrderOpenPrice() renvoie la même erreur - L'expression n'a pas pu être évaluée. Quel désordre ! !!
 
rabanik:
Voici maintenant l'erreur suivante sur la ligneif (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp ;. La fonction OrderOpenPrice() renvoie la même erreur - L'expression n'a pas pu être évaluée. Quel désordre ! !!

C'est réglé. Désolé pour la question stupide. J'ai une variable principale SL de type int.

Et j'essaie de retrouver SL avec le type double. Mais le système renvoie 1.

Merci.

 

Quelqu'un peut-il suggérer comment faire fonctionner un EA à partir d'un certain endroit jusqu'à son début, sans continuer à exécuter d'autres opérateurs.

 

Bonjour. La question est la suivante : l'EA n'ouvre pas de transaction de vente. Pouvez-vous y jeter un coup d'œil ?

 if (Digits==3||Digits==5) {sl=SL*10*Point;}
         else if (Digits==4||Digits==2) {sl=SL*Point;}
            if (OrdersTotal()==0)
              {
                if (Close[1]>TD2)
                OrderSend (Symbol(),OP_BUY,Lot,Ask,10,Ask-sl,0,NULL,Magic,0,clrBlue);
                else if (Close[1]<TD1)
                OrderSend (Symbol(),OP_SELL,Lot,Bid,10,Bid+sl,0,NULL,Magic,0,clrRed);
              }
 
6737998:

Quelqu'un peut-il suggérer comment faire fonctionner un EA à partir d'un certain endroit jusqu'à son début, sans continuer à exécuter d'autres opérateurs.

Оператор возврата return - Операторы - Основы языка - Справочник MQL4
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
 
danil77783:

Bonjour. La question est la suivante : l'EA n'ouvre pas de transaction de vente. Pouvez-vous y jeter un coup d'œil ?

Qu'est-ce que TD1 et où lui est attribuée une valeur ?
 

Mes amis, comment se sortir correctement de cette situation... L'indicateur dessine deux lignes horizontales à partir du CSV (Rouge - du début de la journée à la fin de la journée) Bleu - Faisceau provenant des derniers jours, à différents niveaux de prix. Mais il y a des jours où ces niveaux ont la même valeur/prix. Comment faire pour que, lorsque les lignes coïncident, le rayon (bleu) soit affiché et que la ligne rouge ne soit pas visible sur le graphique, mais physiquement présente... c'est-à-dire qu'elle soit transparente.

Maintenant - Draw_Level("Red", red, DRAW_NONE, STYLE_SOLID,0) ; il arrête de dessiner la ligne, mais le rayon n'est pas non plus visible de dessous. Merci.

Raison: