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

 
Лауреат:
Comment créer une fonction qui fermerait une position ouverte par son propre pont après qu'un nombre spécifié de bougies se soient écoulées dans l'historique du temps.
int numBars = 5;
void OnTick()
{
     for(int i = OrdersTotal(); i >= 0; i--)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
          if( OrderSymbol() != _Symbol)                continue;
          if( OrderMagicNumber() != Magic)             continue;
          if( OrderOpenTime() > Time[numBars-1] )      continue; 
          
          /* work */
     }
}
 
sviter-pro:
J'expérimente ! !! la logique est spécifique ! !! pouvez-vous m'aider ?

Qu'est-ce qu'il y a de spécifique ?

Regardez la dernière position, et ouvrez la position opposée.

 
Konstantin Nikitin:

Je vais vérifier.

 
sviter-pro:

Je vais vérifier.

 

Bonjour. Veuillez m'aider avec cette fonction. Sur un compte, il est censé y avoir plusieurs EAs qui traitent. Chaque EA ne peut ouvrir plus d'une transaction par jour. J'ai besoin d'une fonction qui renvoie true si l'EA a déjà eu une transaction, et false s'il n'y a pas eu de transaction. La vérification devrait être effectuée par magie à la date du jour si je comprends bien. Si vous pouvez m'aider, je prévois de construire cette fonction dans chacune de mes EA, qui auront besoin d'une telle vérification. Si je peux aider, je prévois de le construire dans chacun de mes EAs où j'ai besoin d'une telle vérification.

 
Kolya32:

Bonjour. Veuillez m'aider avec cette fonction. Sur un compte, il est censé trader avec plusieurs EAs. Chaque EA ne peut ouvrir plus d'une transaction par jour. Nous avons besoin d'une fonction qui renvoie true s'il y a eu une transaction, et false s'il n'y a pas eu de transaction. La vérification devrait être effectuée par magie à la date du jour si je comprends bien. Si vous pouvez m'aider, je prévois de construire cette fonction dans chacune de mes EA, qui auront besoin d'une telle vérification. Si je peux aider, je prévois de le construire dans chacun de mes EAs où j'ai besoin d'une telle vérification.

Tout a déjà été fait avant nous ;) Voir ici.

 

On dirait que j'ai besoin de la fonction isTradeToDay(). Eh bien, je vais expérimenter) Merci.

J'ai corrigé la fonction pour moi-même en commentant int mn=-1 et en remplaçant mn par Magic. Après avoir exécuté l'EA avec cette fonction dans le testeur, j'ai vu un gros inconvénient : le temps de test de l'EA a augmenté POUR DES ANNÉES ! Maintenant, j'ai décidé de tester le conseiller expert avec cette fonctionnalité sur un compte de démonstration. J'ai 5 Expert Advisors sur mon compte et je crains que les transactions soient ouvertes avec un décalage...

bool isTradeToDay(string sy="", int op=-1 /*,int mn=-1*/) {
int i, k=OrdersHistoryTotal() ;

si (sy=="0") sy=Symbole() ;
for (i=0 ; i<k ; i++) {
si (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
si (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
si (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Magic) {
si (TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year()) return(True) ;
}
}
}
}
}
}
k=OrdersTotal() ;
for (i=0 ; i<k ; i++) {
si (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
si (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
si (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Magic) {
si (TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year()) return(True) ;
}
}
}
}
}
}
retourner(Faux) ;
}

 

Vous devez marquer le seuil de rentabilité de la grille sur le graphique.

Profit en pips :

double current_Prof_Pts = current_Prof_Bux/current_summ_lot/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point)

Position de seuil de rentabilité pour la grille BUY

zero = Bid-current_Prof_Pts*_Point

(Pour VENDRE, respectivement : Ask+Prof_Pts*_Point actuel)

Résultat : semble être vrai, mais saute toujours autour de la vraie valeur d'environ 3 points.

Pouvez-vous me dire où se trouve l'erreur ?

 
Kolya32:

On dirait que j'ai besoin de la fonction isTradeToDay(). Eh bien, je vais expérimenter) Merci.

J'ai découvert un gros inconvénient : le temps de test d'une EA a été multiplié par cinq !

Oui, bien sûr. La fonction est écrite de manière universelle. Si vous y accédez à chaque tic, la boucle passe par l'historique complet du compte. De plus, l'historique du compte peut être assez long (j'ai vu des cas où il y avait plus de 100 000 commandes). Pour accélérer l'exécution, il n'est pas nécessaire d'exécuter la boucle sur l'ensemble de l'historique à chaque fois. Il suffit de le faire une seule fois au tout début et de se souvenir de l'index de la dernière commande traitée. La fois suivante, vous devez parcourir la boucle uniquement pour les commandes dont l'index est supérieur à l'index stocké. Ensuite, il faut se souvenir à nouveau de l'indice de la dernière commande, et ainsi de suite.

 
Igor Zakharov:

Vous devez marquer le seuil de rentabilité de la grille sur le graphique.

Profit en pips :

Position de seuil de rentabilité pour la grille BUY

(Pour VENDRE, respectivement : Ask+Prof_Pts*_Point actuel)

Résultat : semble être vrai, mais saute toujours autour de la valeur réelle d'environ 3 points.

Veuillez me dire où se trouve l'erreur.

Le spread flottant est à blâmer.