Fonctions utiles de KimIV - page 86

 

Igor, tu peux me donner un indice ? Quelque chose de l'indicateur(iMA) dans l'EA les valeurs viennent avec 4 décimales, alors que j'ai besoin de 5 pour le travail ! J'ai essayé NormalizeDouble(iMA,Digits) - il y a toujours 4 décimales. Est-il nécessaire de réécrire l'ensemble de l'indicateur en sous-programme-fonction de l'Expert Advisor pour obtenir 5 chiffres ?

 

Aide : Alert(), Comment(), Print()

Les données de type double sont éditées avec 4 chiffres décimaux après le point.

Utilisez DoubleToStr() pour sortir des nombres avec une plus grande précision.

 

Bonsoir,

Je ne peux pas faire face à la fermeture correcte des positions. Il y a deux conditions pour la clôture : 1. si une position est ouverte ; 2. si deux positions (ou plus) sont ouvertes. Dans les deux cas, le volume du lot = 0,03. Dans le premier cas, le lot est fermé séparément par 0,01 (calculé dans les posts ci-dessus). Dans le second cas, deux lots doivent être fermés, tous deux de 0,03 :

if (OrderType()==OP_BUY && BuyTotalOp==1)

alors la première variante de la fermeture et si :

if (OrderType()==OP_BUY && BuyTotalOp>1)

puis l'autre (dans ma variante (préliminaire) si la somme des profits des deux positions > 0, alors les deux positions doivent être fermées). Ça ressemble à ça :

   extern double Lots=0.03;           // Жестко заданное колич. лотов
.................................
   // Учёт количества имеющихся ордеров
   Symb=Symbol();                               // Название фин.инстр.
   BuyTotalOp=0;                                // Количество Buy ордеров
   SellTotalOp=0;                               // Количество Sell ордеров
   for (int i=1; i<=OrdersTotal(); i++)         // Цикл перебора ордер
      {
      if (OrderSelect( i-1, SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!= Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (OrderType()==OP_BUY)
           {
            BuyTotalOp++;                         // Счётчик ордеров Buy
......................................
   //Проверка если открыто несколько БАЙ-позиций
   if (OrderType()==OP_BUY && BuyTotalOp>1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия нескольких лотов БАЙ
      if ( BuyOrdProf>0)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
         if ( Ans==true)                             // Получилось :)
           { 
            Alert ("Закрыт ордер Buy ", TicketCl);
            break;                                  // Выход из цикла закр
           }
         if ( Fun_Error(GetLastError())==1)          // Обработка ошибок
            continue;                               // Повторная попытка
         return;                                    // Выход из start()
        }
     }
//.........................................
   //Проверка если открыта одна БАЙ-позиция
   if (OrderType()==OP_BUY && BuyTotalOp==1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия одного лота БАЙ
      if ( BUYCLOSE_1PART && BuyClLot== Lots)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy
         if ( Ans==true)                             // Получилось :)
           { 
            Alert ("Закрыт ордер Buy ", TicketCl);
            break;                                  // Выход из цикла закр
           }
         if ( Fun_Error(GetLastError())==1)          // Обработка ошибок
            continue;                               // Повторная попытка
         return;                                    // Выход из start()
        }
 

En fait, il s'avère que lorsque les conditions de fermeture des deux lots apparaissent, le premier lot se ferme complètement, tandis que le second lot "reprend" les conditions de fermeture BuyTotalOp==1 et se ferme selon ses propres conditions.

Veuillez m'indiquer ce qui ne va pas dans les conditions de clôture et comment faire pour que les deux lots soient clôturés en même temps. Merci d'avance.

 
J'ai essayé à la fois OrderTicket() et Lots counting and plusing dans la boucle de commande - en vain... Peut-être, comme toujours, "la vérité est quelque part proche", mais elle n'accroche pas...
 

Séparer les mouches des côtelettes... écrire quelques fonctions utiles...

Par exemple, compter le nombre d'ordres ouverts par type d'ordre, les ordres fermés par type d'ordre, etc...

alors tout sera plus facile...

if ( ordersTotal( SYMBOL,OP_BUY)==1) closeAllOrders( SLIPPAGE, TRY, TRADESLEEP, SHOWERRORS, SYMBOL,OP_BUY);
if ( ordersTotal( SYMBOL,OP_BUY) > 1) closeAllOrders( SLIPPAGE, TRY, TRADESLEEP, SHOWERRORS, SYMBOL,OP_BUY);

...parce que vous avez un } manquant quelque part, et il n'est pas clair ce qui est fait exactement... peut-être que vous essayez de compter temporairement le nombre d'ordres et de les supprimer immédiatement, ou quoi ? les ordres en attente pourraient être mieux ignorés et ne pas être interrompus quand ils existent ?

Une bonne option serait une fonction qui, en fonction de conditions données, formerait un tableau avec les paramètres des ordres ouverts que vous pouvez parcourir et fermer ... en général, travailler sur la structure ...

 

Merci keekkenen, j'ai juste pensé à créer un tableau dernièrement. C'est juste que je n'ai jamais travaillé avec et que j'espérais qu'il y avait une solution plus simple, que j'ai déjà un œil "fermé", et que quelqu'un avec des yeux neufs le regardera et dira "bon sang, où est votre comptage untel...". Eh bien, tous les ordres d'achat dans la boucle ont été calculés :

   // Учёт количества имеющихся ордеров от начала к концу
   Symb=Symbol();                               // Название фин.инстр.
   BuyTotalOp=0;                                // Количество Buy ордеров
   SellTotalOp=0;                               // Количество Sell ордеров
   for (int i=1; i<=OrdersTotal(); i++)         // Цикл перебора ордер
      {
      if (OrderSelect( i-1, SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!= Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (OrderType()==OP_BUY)
           {
            BuyTotalOp++;                         // Счётчик ордеров Buy
....................................

et OrderClose ne les compte pas...

   //Проверка если открыто несколько БАЙ-позиций
   if (OrderType()==OP_BUY && BuyTotalOp>1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия нескольких лотов БАЙ
      if ( BuyOrdProf>0)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, BuyTotalOp,Bid,0,Red);          // Закрытие Buy
...................................................................
eh bien, oui, c'est évident "overkill" .......
 

et franchement, je ne comprends pas ça.

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy

et celui-ci, surtout la division du lot par 3 ? l'ordre est fermé avec le même lot qu'il a été ouvert...

Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy

pourquoi pas dans les deux cas ?

Ans=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);          // Закрытие Buy
 

pourquoi pas dans les deux cas ?

Ans=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);          // Закрытие Buy

CloseTicketCl = OrderTicket () en général, vous pouvez faire ceci...

et ceci, surtout en divisant le lot par 3 ? ? l'ordre est fermé avec le même lot qu'il est ouvert...

Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy

pas le même

.

Un tiers du lot est fermé (selon l'une des conditions - disons que le prix a atteint +150 pips). Le deuxième tiers fermera, disons, lorsque +300 pips de l'ouverture, etc...

et franchement je ne comprends pas ce

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
ici Lots et OrderLots() oui, la même chose.
 
hope >> Pas la même chose. Un tiers du lot sera fermé (selon l'une des conditions - supposons que le prix ait atteint +150 points). Le deuxième tiers fermera, disons, lorsque +300 pips de l'ouverture, etc.

Non, cela ne fonctionne pas. Un ordre - un lot, si vous avez ouvert un ordre avec 3 lots, vous ne pouvez pas diviser le lot de quelque manière que ce soit - d'abord 1, puis 1 et ensuite 1 - l'ordre ferme le lot entier, c'est-à-dire que l'ordre se ferme avec le même lot qu'il a été ouvert, vous ne pouvez pas fermer les ordres en partie...

Raison: