[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 347

 
hoz:

Hmm. Oui, il n'y a aucun problème pour trouver l'ordre en attente approprié 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.

Ensuite, déterminez le fait de déclencher un ordre en attente et supprimez l'ordre opposé le plus éloigné.

Tout cela n'est fait que pour un seul fait et un seul ordre en attente à un moment donné . Il n'est pas nécessaire de créer un nombre de déclenchés et un nombre de supprimés, comme vous essayez de le faire. Vous saisirez le fait de la transformation des ordres en attente sur un tick. Tous les autres déclencheurs (s'il y en a) seront déterminés par le prochain tick.

 
Pouvez-vous me dire qui sait ? Pourquoi le résultat du test est-il différent un jour de semaine et un week-end ? Alpari
 

berezhnuy à cause de l'écart, qui est plusieurs fois plus important le week-end.

 

Chers programmeurs, voici le code pour compter les ordres d'achat et de vente afin de n'ouvrir qu'un seul ordre d'achat ou de vente :

int CountBuy()
{
int count = 0 ;
for(int trade = OrdersTotal()-1 ; trade >= 0 ; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) ;
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY)
count++ ;
}

}
return(count)
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0 ;
for(int trade = OrdersTotal()-1 ; trade >= 0 ; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) ;
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_SELL)
count++ ;
}

}
return(count) ;
}

Et tout semble fonctionner, mais dans mon EA, il y a des conditions pour acheter et vendre sur certains modèles de chandeliers en utilisant le TP et le SL. Mais lorsque cette condition est remplie et que le TP est déclenché, alors à la formation de la bougie 0, les conditions d'ouverture des ordres restent vraies et de nouveaux ordres sont ouverts, ce qui ne devrait pas être fait à ce moment-là. Pourriez-vous nous dire quel code utiliser pour désactiver l'ouverture d'autres commandes ? L'EE elle-même est jointe.

Dossiers :
expert.mq4  4 kb
 
artmedia70:

Ensuite, déterminez le fait d'un ordre en attente déclenché et supprimez celui qui est le plus opposé.

Tout cela n'est fait que pour un seul fait et pour un seul moment. Il n'est pas nécessaire de créer un nombre de déclenchés et un nombre de supprimés, comme vous essayez de le faire. Vous saisirez le fait de la transformation des ordres en attente sur un tick. Tous les autres déclencheurs (s'il y en a) seront déterminés par le prochain tick.



Et s'il y en a plus que ça par tic ? Si, par exemple, l'écart entre les ordres est très faible, plusieurs ordres peuvent être déclenchés. Bien sûr, nous ne serons pas en mesure d'effectuer les actions nécessaires à temps.
 
hoz:

Que se passe-t-il si plus d'une tique passe ? Si, par exemple, l'écart entre les ordres est très faible, plusieurs ordres peuvent être déclenchés. Bien sûr, nous ne serons pas en mesure d'effectuer les actions requises à temps.
Une boucle sur les positions ouvertes à la recherche d'ordres déclenchés sur la barre courante et supprimer les ordres en attente dans la même boucle.
 
artmedia70:
La boucle sur les positions ouvertes à la recherche d'ordres déclenchés sur la barre courante et la suppression des positions dans la même boucle.


Eh bien, cette boucle sera répétée et tout sera supprimé à nouveau. J'ai également une condition dans la variante que j'ai en ce moment :

 while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
   {
      OrderDelete(s_ticket,Black);
      ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления на 1, т.к. строкой выше..
                                               // .. один отложенник уже удалили
   }

C'est-à-dire qu'il doit supprimer jusqu'à ce que le nombre d'ordres à supprimer soit égal à zéro. Mais ça détruit tout. Cela semble élémentaire, mais il y a des indignations. Il n'y a rien du tout sur de tels moments dans un tutoriel sans valeur. J'ai déjà essayé les deux façons et je l'ai réécrit de différentes manières, ça n'a pas fonctionné comme je le voulais.

 

Réécrit différemment :

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

   double OOP = 20.0;                                 // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);               // Если ничего удалять не нужно, выйдем из функции

   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;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          np = i;
      }
   }
   if (OrderSelect(np,SELECT_BY_POS))
   {
      s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      OrderDelete(s_ticket,Black);
   }
   
   return (0);
}

Kim, je cherche aussi la même chose. A trouvé un ordre avec un prix d'ouverture minimum, a défini sa position, et a sélectionné cet ordre, a défini son ticket et l'a supprimé. Mais il n'est pas supprimé.

 
Pourquoi ne retenez-vous pas le ticket de l'ordre et non sa position ? Et que se passe-t-il lors d'un transfert direct s'il n'y a pas d'ordre de ce type ? allez-vous supprimer l'ordre zéro ?
 
FAQ:
Pourquoi ne pas se souvenir du ticket de l'ordre et non de sa position. Et que se passe-t-il lors d'un transfert direct s'il n'y a pas d'ordre de ce type ? allez-vous supprimer l'ordre zéro ?


J'ai déjà essayé. Cela ne fonctionne pas non plus :

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

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   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;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      }
   }
   if (s_ticket != -1)
   {
      OrderDelete(s_ticket,Black);
   }
   return (0);
}