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

 

delf:

Le dernier ordre doit être clôturé dans n'importe quelle direction et l'ordre suivant doit s'ouvrir dans l'autre direction (lorsque les conditions sont remplies, respectivement).

Option plus stricte

#define OrderBuy  0
#define OrderSell 1
int NewOrder;
int RezultatSend; 

int start()
{
... 
... 

if(OrdersTotal()==0)
{
if(NewOrder==OrderBuy)
   {
   if(/*Условие для Buy*/)
      { RezultatSend=OrderSend(/*...buy*/);     //Ставим Buy
        if(RezultatSend!=-1)NewOrder=OrderSell; //Если ставка прошла
      }
   }
 else
   {
   if(/*Условие для Sell*/)
      { RezultatSend=OrderSend(/*...*/);       //Ставим Sell
        if(RezultatSend!=-1)NewOrder=OrderBuy; //Если ставка прошла
      }
   }
}

...
...

}  
 

abeiks:

Depuis un certain temps, , j'essaie de retravailler 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 ?

Il est plus facile et plus pratique de créer une fonction (bloc) pour fermer une dernière position. Et exécutez-le deux fois. En boucle, ou juste en ligne.
 
abeiks:

Depuis un certain temps, , j'essaie de retravailler 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 ?

Il y a quelque temps, je vous ai donné un algorithme de solution pour trouver les dernières positions. Et puis ce qu'il faut en faire est IMPORTANT : compter, supprimer, modifier les STOP. Si vous n'êtes pas capable d'écrire du code au moins "à l'image et à la ressemblance", ce n'est pas le vôtre (programmation)...
 
rigonich:



Merci !

 
peshihod:
Il est plus facile, et plus pratique, de faire une fonction (bloc) pour fermer une dernière position. Et exécutez-le deux fois. En boucle, ou juste en ligne.

Merci, c'est une bonne option que je vais essayer aussi.

 
delf:

Je dois l'avoir mal formulé :(

Il existe un algorithme pour l'ouverture des ordres.

J'ai besoin, qu'à n'importe quelle variante de fermeture du dernier ordre, le suivant a été ouvert dans l'autre direction (quand les conditions en conséquence apparaissent).

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.


C'est probablement le cas quelque part. Mais s'il y a beaucoup d'ordres dans l'historique, il est préférable d'utiliser votre propre carnet d'ordres. https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390
//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void CloseOrder(string signal)
   {
   int      i,Ticket=-1,error; 
   double   Price;
   datetime time=0;
   for (i=0;i<OrdersHistoryTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ", error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if(OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if(!OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error=GetLastError();Print("Ошибка OrderSelect() = ",error);
   }
   if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL&&signal=="CloseSELL")return;
   if(signal=="CloseBUY")Price=NormalizeDouble(Bid,Digits);
   if(signal=="CloseSELL")Price=NormalizeDouble(Ask,Digits);
   for (i=0;i<OrdersTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ",error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic)
         {
         if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL||signal=="CloseSELL")
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price,0,CLR_NONE);
         }
      }
      if(Ticket<0)
         {
         error=GetLastError();Print("Ошибка = ",error);
      }
   }
   return;
}
       
 
peshihod:

Une option plus stricte

Merci beaucoup à tous ceux qui ont répondu, résultat obtenu, juste ce dont j'avais besoin.
 
delf:

Je dois l'avoir mal formulé :(

Il existe un algorithme pour l'ouverture des ordres.

J'ai besoin, qu'à n'importe quelle variante de fermeture du dernier ordre, le suivant a été ouvert dans l'autre direction (quand les conditions en conséquence apparaissent).

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.

Si vous voulez apprendre à programmer, vous pouvez soit regarder le code des autres (c'est à cela que sert CodaBase), soit partir de l'algorithme de la solution du problème. Demander d'écrire du code pour vous est la façon la plus désespérée d'apprendre. Le plus souvent, vous obtiendrez une solution mal codée à votre problème, un peu comme si (de façon allégorique) votre voisin vous appelait à la porte toutes les minutes pour vous demander "quel est votre nom" - il s'agit de calculs inutiles (superflus).

L'algorithme pour résoudre votre problème peut être le suivant. Tout d'abord, vous devez vous assurer que vous n'avez pas "vos" commandes. Ce problème, si ce n'est pour le testeur (où nous pouvons limiter la solution à la condition if (OrdersTotal() == 0), est résolu par des recherches d'ordres en utilisant des filtres pour faire correspondre OrderMagicNumber() et Symbol(). Ensuite, vous vérifiez la condition (selon votre stratégie) pour ouvrir l'ordre. S'il y a un signal, alors en utilisant la recherche de OrdersHistoryTotal() (généralement c'est le dernier de la liste), calculez le OrderType() du dernier ordre clôturé. Si le signal d'ouverture de l'ordre et le type du dernier ordre clôturé ne coïncident pas, ouvrez l'ordre en fonction du signal.

Cette approche implique un minimum de calculs et réduit considérablement le temps d 'optimisation du conseiller expert dans le testeur.

 
TarasBY:
Il y a quelque temps, je vous ai donné l'algorithme permettant de résoudre la recherche des dernières positions. Et ensuite, ce qu'il faut en faire n'a pas d'importance : compter, supprimer, modifier STOP. Si vous n'êtes pas capable d'écrire du code au moins "à l'image et à la ressemblance", ce n'est pas le vôtre (programmation)...


Oui, je suis d'accord, la programmation n'est pas mon truc, donc j'apprends et je pose des questions ici. J'ai essayé d'ajouter la fermeture de position à votre algorithme mais cela a échoué (toutes les positions d'achat se fermaient) donc j'ai décidé d'aborder le problème sous un autre angle et de voir la solution de fermer les deux dernières positions d'achat sur un bloc de fermeture prêt à l'emploi qui m'a été fourni et offert.

Je vous serais très reconnaissant si vous pouviez me montrer comment fermer les deux dernières positions d'achat. Je comprendrai où j'ai fait une erreur.

double profits_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    double pr_buy = 0;
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (0.0);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        pr_buy += OrderProfit();
        ordercount++;
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: pr_buy2 = ", pr_buy);   
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (pr_buy);   
}

 
TarasBY:

Si vous voulez apprendre à programmer, vous pouvez soit analyser le code d'autres personnes (CodaBase est là pour ça), soit procéder à partir de l'algorithme pour la tâche à accomplir. Demander d'écrire du code pour vous est la façon la plus désespérée d'apprendre. Le plus souvent, vous n'obtiendrez pas le meilleur code pour votre tâche, un peu comme (allégoriquement) lorsque votre voisin sonne à votre porte toutes les minutes et vous demande "quel est votre nom" - il s'agit de calculs inutiles (superflus).

Je suis tout à fait d'accord avec vous. Vous avez tout à fait raison. C'est la bonne méthode et j'ai essayé de la suivre. Cependant, étudier MQL4 sans les manuels et lire sans raison n'a mené à rien. J'ai dû analyser le code de quelqu'un d'autre de toute façon, puisque je ne pouvais pas mettre mes propres idées folles dans le programme pour la plupart. J'ai commencé à construire la stratégie en ....excel (c'est plus proche de moi et plus compréhensible). En ce qui concerne les bases de la stratégie, elle a été très réussie et claire (sur l'histoire, bien sûr). Mais en outre, je dois tenir compte des particularités du trading : spread flottant, swap, particularités des maisons de courtage, il est difficile de faire rentrer tout cela dans des formules exel. J'ai donc décidé d'analyser la différence entre le profit dans excel et MQL. Franchement, la différence est trop importante et ne joue pas en ma faveur. Je ne sais pas encore, je vais analyser chaque position, peut-être que le conseiller expert a fait une erreur, mais cela dépend de moi.

Quoi qu'il en soit, les bonnes personnes de ce forum m'ont aidé à résoudre un problème spécifique, quel grand merci humain.