[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 562

 
Merci ! !!
 
Ekburg:

Pouvez-vous me dire ce qui pourrait clocher dans ce code ? C'est un stop suiveur, mais lorsqu'il est testé, il génère l'erreur 1, lorsqu'il est modifié. Pourquoi l'ordre n'est-il pas modifié ?

Lorsque j'ai corrigé cette erreur (sans succès jusqu'à présent), en compilant le code principal de l'Expert Advisor dans la fonction d'impression, il a commencé à renvoyer une erreur, disant qu'il a besoin de guillemets, mais tout est correct, et pour corriger cette erreur je dois enlever et mettre un nouveau guillemet...

bool trailingstop()
{
si ((OrderMagicNumber()==11111)==true)
{
Print("Maintenir la position d'achat") ;
while(OrderCloseTime()==0)
{
si ((Bid-OrderStopLoss())>(StopLevel*Point))
{
si (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Bid-StopLevel*Point),0,0)))
Print("Stop Loss de l'ordre portant le numéro ",OrderTicket()," et le numéro magique ",OrderMagicNumber()," a été modifié avec succès en ",OrderStopLoss()) ;
else Print("Le niveau de Stop Loss de l'ordre avec le numéro ",OrderTicket()," et le numéro magique ",OrderMagicNumber(),". Erreur ",GetLastError()) ;
}
}
si (OrderCloseTime()>0)
{
Print("L'ordre portant le numéro ",OrderTicket()," et le numéro magique ",OrderMagicNumber()," a été clôturé au prix ",OrderClosePrice()," avec un profit/une perte ",OrderProfit()) ;
retour (vrai) ;
}
}
sinon
{
si ((OrderMagicNumber()==22222)==true)
{
Print((Position de vente) ;
while(OrderCloseTime()==0)
{
si ((OrderStopLoss()-Ask)>(StopLevel*Point))
{
si (OrderModify(OrderTicket(),OrderOpenPrice(),ND(Ask+StopLevel*Point),0,0)))
Print("Stop Loss de l'ordre portant le numéro ",OrderTicket()," et le numéro magique ",OrderMagicNumber()," a été modifié avec succès en ",OrderStopLoss()) ;
else Print("Le niveau de Stop Loss de l'ordre avec le numéro ",OrderTicket()," et le numéro magique ",OrderMagicNumber(),". Erreur ",GetLastError()) ;
}
}
si (OrderCloseTime()>0)
{
Print("L'ordre portant le numéro ",OrderTicket()," et le numéro magique ",OrderMagicNumber()," a été clôturé au prix ",OrderClosePrice()," avec un profit/une perte ",OrderProfit()) ;
retour (vrai) ;
}
}
sinon retour(false) ;
}
}


L'erreur 1 n'est pas une erreur. Cela signifie que l'ordre a déjà été modifié. Insérez une vérification des paramètres de modification avant OrderModify() (si l'ordre stoploop n'est pas égal à stopLoss , (ND(Bid-StopLevel*Point)ou ND(Ask+StopLevel*Point)), alorsOrderModify(), sinon retour).
 
rigonich:

L'erreur 1 n'est pas une erreur. Cela signifie que l'ordre a déjà été modifié. Insérez une vérification des paramètres de modification avant OrderModify() (si le stop loss de l'ordre n'est pas égal au stop loss, (ND(Bid-StopLevel*Point) ouND(Ask+StopLevel*Point)), alorsOrderModify(), sinon retour).


Cette vérification est au-dessus : si ((Bid-OrderStopLoss())>(StopLevel*Point)), ou je me suis trompé.

Et je l'ai testé sur un fort mouvement, même visuellement, il est clairement visible que le stop loss de l'ordre et l'expression ne sont pas égaux

 
Usual_Trader:


D'un coup d'oeil, ce que je vois dans la fonction de fermeture des ordres, vous devez sélectionner l'ordre par le ticketOrderSelect(Ticket, SELECT_BY_TICKET), le nombre de lots n'indique pas la variable Lts, car elle est recalculée à chaque fois, mais utilisez OrderLots() Et une autre chose, vous continuez à travailler sur la barre 0, respectivement, les critères sur une barre peuvent disparaître, vos ordres peuvent ne pas s'ouvrir où vous le souhaitez. Remplacer la barre 0 par 1 et 1 par 2 dans les paramètres de l'indicateur.



Merci beaucoup pour la réponse), mais le critère ne fonctionne pas comme je le voudrais (tous les croisements de stochastiques n'affichent pas d'ordres ( ) et je voudrais ouvrir des ordres sur la barre 0, mais je suppose que j'ai besoin d'une condition supplémentaire : après avoir ouvert un ordre sur la barre actuelle, je dois ne rien faire jusqu'à la fermeture de la barre, mais je n'ai aucune idée de la façon de le faire (peut-être en utilisant des tableaux de séries chronologiques ???) Veuillez me conseiller.
Dossiers :
 
Ekburg:


Cette vérification est au-dessus : si ((Bid-OrderStopLoss())>(StopLevel*Point)), ou je vous ai mal compris.

Je l'ai vérifié sur un mouvement brusque où vous pouvez clairement voir que le stop loss de l'ordre et l'expression ne sont pas égaux.


Le problème est le suivant : puisque vous n'avez pas OrderSelect() dans cette fonction, elle doit être utilisée quelque part dans la boucle avec la recherche des commandes. Si cette boucle organise la recherche de l'ordre zéro au dernier, alors après la modification du premier ordre, ou si un ordre a déjà été trouvé, lorsque OrderSelect() est appelé la fois suivante, l'ordre de l'ordre change et la fonction peut sélectionner un ordre qui a déjà été modifié. Par conséquent, nous devons vérifier si la valeur de l'ordre StopLoss est égale à celle que nous envoyons à la fonction OrderModify()

if(ND(Bid-StopLevel*Point)==OrderStopLoss())return(true);
 

abeiks:

Depuis quelque temps, , j'essaie de refaire le bloc de fermeture des achats pour ne fermer que les deux dernières positions d'achat, mais cela échoue. Pouvez-vous dire à comment refaire le bloc ?

//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void Close_2buy()
   {
   bool     result;
   int      Count=2,Ticket=-1,error;
   datetime time=0;
   while(Count>0)
      {
      for (int f=OrdersTotal()-1; f>=0; f--) // 
         {
         OrderSelect(f, SELECT_BY_POS);
         if (OrderSymbol()==Symbol() &&(OrderMagicNumber()==magic ) 
         && (OrderType() == OP_BUY )) 
            {
            if(OrderOpenTime()>time)
               {
               time=OrderOpenTime();Ticket=OrderTicket();
            }
         }
      }
      if(OrderSelect(Ticket,SELECT_BY_TICKET)==True);
         {
         result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),0,CLR_NONE);
         if(result!=TRUE){error=GetLastError();Print("LastError = ", error);}
      }
      else{error=GetLastError();Print("LastError = ", error);} 
      Ticket=-1;time=0;Count--;
   }
   return;
} 
 
ametist444:

Bonjour !

Pouvez-vous me dire quels fichiers doivent être téléchargés et où les installer dans mt4 pour obtenir cette fenêtre ?

Je ne comprends pas comment le faire dans lasimulation sur différentes échéances de l'instrument testé.

Je veux voir seulement trois graphiques quotidiens, quatre heures et horaires.

Je veux voir trois graphiques quotidiens, de quatre heures et horaires. S'il vous plaît aidez, je n'ai pas réussi à le faire toute la nuit !



Les fenêtres de type (visuel) s'ouvrent lors du test de l'EA en mode visuel.


 
peshihod:

Quel type de StopLoss ?

Je dois l'avoir mal formulé :(

Nous avons un algorithme pour l'ouverture des commandes.

J'ai besoin qu'il ouvre l'ordre suivant dans une autre direction (lorsque les conditions apparaissent), si le dernier ordre a été fermé d'une quelconque manière.

Tout fonctionne, mais si j'ai fermé par un stop loss, par exemple, pour la vente, et les conditions pour ouvrir une vente dans cette direction, l'ouverture continue. Ce dont nous avons besoin, c'est d'attendre les conditions pour acheter.

C'est-à-dire que nous devons vérifier le dernier ordre fermé, afin qu'il ne coïncide pas avec l'ordre d'ouverture (alternance achat-vente-achat-vente). Seule une commande ou l'attente d'un signal est en cours.

Je comprends que nous devrions probablement utiliser OrdersHistoryTotal(), mais à quoi cela ressemblerait-il dans un EA fonctionnel ?

Merci.

 
delf:

Il existe un algorithme pour l'ouverture des ordres.

Nous avons besoin de toute variante du dernier ordre pour ouvrir le suivant dans une direction différente (lorsque les conditions apparaissent).

En d'autres termes, nous devons vérifier le dernier ordre fermé afin qu'il ne coïncide pas avec l'ordre d'ouverture (alternance achat-vente-achat-vente). Il n'y a qu'un seul ordre ou signal qui attend d'être ouvert.

Cette alternance a-t-elle toujours lieu dans tous les cas, et un seul ordre est toujours en vigueur ?

Il est alors plus facile d'ajouter le contrôle du nombre de commandes à la condition :

if(OrdersTotal()==0)
{
	if(OldOrder==OrderBuy)
		{
		...
		}
	else
		{
		...
		}
}
 
rigonich:


Le problème est le suivant : comme vous n'avez pas OrderSelect() dans cette fonction, il semble qu'elle soit utilisée quelque part dans la boucle avec une recherche des commandes. Si cette boucle organise la recherche de l'ordre zéro au dernier, alors après la modification du premier ordre, ou si un ordre a déjà été enterré sur ce tic, lors du prochain appel deOrderSelect(), la séquence des ordres change et la fonction peut sélectionner un ordre qui a déjà été modifié. Par conséquent, nous devons vérifier si la valeur de l'ordre StopLoss est égale à celle que nous envoyons à la fonction OrderModify()


Non, le problème de changer le numéro de l'ordre de position quand l'un d'entre eux est fermé a été résolu, j'ai vérifié plus d'une fois en pensant qu'il pouvait y avoir une erreur, mais tout est OK, l'ordre requis est sélectionné et le stoploss est calculé correctement pour lui, mais l'ordre ne veut pas être modifié...
Raison: