[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 346

 
FAQ:

Je pense qu'il est inutile d'argumenter davantage. J'ai tout expliqué en détail, étape par étape. Continuez à faire ce que vous avez fait.

Quel genre de discussion peut-il y avoir ? Nous devons clôturer l'ordre avec l'écart de prix maximum. Ce qui signifie que nous sommes intéressés par le prix... C'est-à-dire que nous devrions trouver un ordre en attente extrême (avec le prix ouvert maximum ou minimum ). Si vous n'êtes pas d'accord, vous pouvez argumenter. Sinon, j'ai raison après tout ! Je sais exactement ce que je dis.
 

Le code supprime ST et TP. J'ajoute une condition pour la suppression sélective

Qu'est-ce qui n'est pas écrit correctement ? Continue à tout effacer :(

 #property show_inputs
extern bool   StopLoss     = True;    // Удалить только StopLoss
extern bool   TakeProfit   = True;    // Удалить только TakeProfit
extern bool   ALL          = True;    // Удалить все
void start()
   {
   bool   fm;
   int     i;
   double SL=OrderStopLoss();
   double TP=OrderTakeProfit();

      if (StopLoss)   SL=0;
      if (TakeProfit) TP=0;
      if (ALL)       {SL=0; TP=0;}
     
      for (i=0; i<OrdersTotal(); i++)
         {
           if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {
                  if (OrderType()==OP_BUY)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
                  if (OrderType()==OP_SELL)
                     {
                        fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
                     }
               }
         }
   }

Ou bien n'y a-t-il pas d'autre solution et faut-il écrire le code de suppression pour chaque condition ?

#property show_inputs
#include <WinUser32.mqh>
extern bool   StopLoss     = False;    // Удалить только StopLoss
extern bool   TakeProfit   = False;    // Удалить только TakeProfit
extern bool   ALL          = False;    // Удалить все
void start()
   {
   bool   fm;
   int     i;

    if (StopLoss)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (TakeProfit)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
      if (ALL)
         {
            for (i=0; i<OrdersTotal(); i++)
               {
                 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                        if (OrderType()==OP_BUY)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                        if (OrderType()==OP_SELL)
                           {
                              fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
                           }
                     }
               }
           return(0);
         }
   }             

 
hoz:


Vadim, pourquoi créer à nouveau l'objet quand on peut utiliser ObjectSet() ?

Dans ce cas, il y avait une fonction où l'objet graphique était entièrement créé et configuré. La fonction de création y est optimisée. Si l'objet existe déjà, il n'est pas créé. Vérifiez vous-même. Mesurez le temps nécessaire pour créer des objets, puis pour en modifier les propriétés. Le deuxième appel sera beaucoup plus court. C'est-à-dire que rien n'est recréé.

En conséquence, nous disposons d'une fonction universelle qui non seulement crée un objet, mais peut également le personnaliser en modifiant les propriétés de l'objet sans beaucoup de temps.

 
Pouvez-vous suggérer un script à un EA pour déterminer la tendance du marché ?
 

J'ai écrit une fonction qui supprimerales ordres de vente ayant les prix les plus bas.Le nombre d'ordres courts à clôturer est égal aunombre d'ordres d'achat qui se sont déclenchés, c'est-à-dire qui sont devenus des ordres au marché.

Ainsi, si un ordre d'achat est déclenché, nous fermons un ordre de vente, si deux ordres d'achat sont déclenchés, nous fermons deux ordres de vente.

Voici le code :

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,
       s_ticket;
   amountOfCurrPendingBuys = 0;
   amountOfCurrPendingSells = 0;
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);
   int n = 0;
   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (n < ordersToDelete)
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();
             s_ticket = OrderTicket();
             ordersToDelete--;
         }
      }
   }
}

amountOfCurrPending - montant des ordres d' achat en attente.

Niveau- nombre d'ordres en attente initialement envoyés à chaque côté.

OOP- prix ouvert de l'ordre en attente, j'ai pris toute valeur inaccessible.

Notre condition est la suivante : si le compteur est inférieur auxordresToDelete, nous supprimons l'ordre en attente avec le prix le plus bas. Mais toutes les positions courtes sont supprimées. Qu'est-ce qui ne va pas chez moi ?

 
hoz:

J'ai écrit une fonction qui supprimerales ordres de vente ayant les prix les plus bas.Le nombre d'ordres courts à clôturer est égal aunombre d'ordres d'achat qui se sont déclenchés, c'est-à-dire qui sont devenus des ordres au marché.

Ainsi, si un ordre d'achat est déclenché, nous fermons un ordre de vente, si deux ordres d'achat sont déclenchés, nous fermons deux ordres de vente.

Voici le code :

amountOfCurrPending - montant des ordres d'achat en attente.

Niveau- nombre d'ordres en attente initialement envoyés à chaque côté.

OOP- prix ouvert de l'ordre en attente, j'ai pris toute valeur inaccessible.

Notre condition est la suivante : si le compteur est inférieur auxordresToDelete, nous supprimons l'ordre en attente avec le prix le plus bas. Mais toutes les positions courtes sont supprimées. Qu'est-ce qui ne va pas chez moi ?

Je ne comprends pas votre logique. Pourquoi pas : l'ordre a été transformé en position de marché - l'ordre en attente le plus opposé a été supprimé.
C'est tout. Ou bien avez-vous plusieurs commandes pour un seul prix ?
 
artmedia70:

C'est tout. Ou avez-vous un paquet de commandes à un prix unique ?


Non, les commandes par tranches...
artmedia70:
Je ne comprends pas votre logique... Pourquoi pas : l'ordre a été converti en position de marché - l'ordre en attente le plus opposé a été supprimé.

C'est ainsi que je supprime la position la plus opposée, c'est-à-dire que, comme il s'agit d'une position courte, cela signifie la position dont le prix d'ouverture est le plus bas. Ici j'ai réécrit la fonction, tout devrait être clair ici. J'ai enlevé les empreintes et supprimé une variable supplémentaire.

La variableamountOfCurrPending transfère le nombre de transactions restantes en achat. C'est-à-dire que si le montant initial est le niveau et queamountOfCurrPending est le montant actuel des ordres, alors en soustrayant le montant initial des ordres du montant actuel, nous obtiendrons la différence et c'est le montant nécessaire pour supprimer les shorts. Vous voyez ?

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("DeletePendingSells: level = ", level);
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 2.0;
   Print("функция сноса отложек DeletePendingSells");
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;
      
      while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
      {
         if (OOP > OrderOpenPrice())
         {
             Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
             OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
             s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия

             Print("DeletePendingSells: s_ticket = ", s_ticket);
             Print("DeletePendingSells: OOP = ", OOP);
             OrderDelete(s_ticket,Black); // Тут нужно закрыть найденный ордер, и видимо проверить, что он закрыт. И счётчик уменьшить!
             ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления
         }
      }
   }
   Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}
Y a-t-il une erreur là où j'ai marqué en rouge ? Comment le résoudre ?
 
hoz:

Non, les commandes se font par tranches.

C'est ainsi que je supprime la position la plus éloignée, c'est-à-dire que, comme il s'agit d'une position courte, cela signifie la position dont le prix d'ouverture est le plus bas. Ici j'ai réécrit la fonction, elle devrait être claire. J'ai enlevé les empreintes et supprimé une variable supplémentaire.

La variableamountOfCurrPending transfère le nombre de transactions restantes en achat. C'est-à-dire que si le montant initial est le niveau et queamountOfCurrPending est le montant actuel des ordres, alors en soustrayant le montant initial des ordres du montant actuel, nous obtiendrons la différence et c'est le montant nécessaire pour supprimer les shorts. Vous voyez ?

Y a-t-il une erreur là où j'ai marqué en rouge ? Comment mieux le résoudre ?
 Ищется ордер, с минимальной ценой открытия

Je préciserais dans le commentaire d'un ordre en attente son numéro d'ordre dans la grille et j'écrirais le même numéro dans l'ordre en attente opposé correspondant. Ensuite, lorsqu'une position de marché est trouvée, après avoir lu le numéro dans son commentaire, la position opposée correspondante peut être trouvée avec un numéro identique dans son commentaire. Puisque les magiks sont utilisés pour autre chose.

ZS. Je n'ai pas encore le temps de lire/parser votre code

 
artmedia70:

J'écrirais dans le commentaire de la position en attente son numéro d'ordre dans la grille et j'écrirais le même numéro dans la position en attente opposée correspondante. Ensuite, lorsqu'une position de marché est trouvée, après avoir lu le numéro dans son commentaire, la position en attente opposée correspondante peut être trouvée sans aucun problème par un numéro identique dans son commentaire. Puisque vous utilisez les magiciens pour autre chose.

ZS. Je n'ai pas encore le temps de lire/parser votre code



Hmm. Oui, il n'y a aucun problème pour trouver l'ordre en attente correspondant de cette façon, si le nombre d'ordres en attente dans chaque direction est le même. Et si c'est différent, alors cela ne fonctionnera pas comme je le comprends.
 

Bonjour, j'ai une question. Comment puis-je écrire dans le code pour n'effectuer une opération que sur une fractale fixe ?

Si la fractale est fixe, c'est .....

ma fractale

int start()
  {
//----
    double CenBuy = High[isFractalUp()];
     double CenSell = Low[isFractalDn()];

   return(0);
}

int isFractalUp()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_UPPER, i)!= NULL) return(i);
 }
 return(-1);
}
 
int isFractalDn()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_LOWER, i)!= NULL) return(i);
 }
 return(-1);
}
Raison: