Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 125

 
Sepulca:

Je l'aurais fait de cette façon :


P.S. Répondu en même temps))))

Je ne comprends pas :

if(shift>0) shift=shift-1;

si ouvert sur la première barre, en regardant de zéro à zéro ?

 
artmedia70:

Je ne comprends pas :

si elle est ouverte sur la première barre, est-ce qu'on regarde de zéro à zéro ?


C'est une petite réassurance au cas où le prix d'ouverture de l'ordre est déjà beaucoup plus élevé que le Low au moment de l'ouverture. C'est-à-dire que nous n'utilisons pas la barre d'ouverture pour la recherche. C'est à cela que sert PERIOD_M1.
 
Sepulca:
Il s'agit d'une petite couverture dans le cas où le prix d'ouverture de l'ordre est déjà nettement supérieur au Low au moment de l'ouverture. C'est-à-dire que nous n'utilisons pas la barre d'ouverture pour la recherche. C'est à cela que sert PERIOD_M1.

Je le ferais d'une manière différente. En général, je ne commencerais à chercher que lorsque la position a duré plus d'une mesure. Après tout, le meilleur prix peut se trouver juste sur la barre d'ouverture, et nous le gaspillerons.
 
artmedia70:
Je le ferais différemment. En général, je ne commencerais à chercher que lorsque la position a duré plus d'une mesure. Après tout, le meilleur prix peut se trouver juste sur le bar d'ouverture, et nous allons le gaspiller...

Je suis d'accord. Il serait probablement plus efficace de se souvenir du prix minimum (ou maximum) pour chaque ordre ouvert dans le tableau à chaque tick, et de fermer les ordres lorsque la condition est atteinte, plutôt que de rechercher à nouveau le minimum à partir du moment où l'ordre a été ouvert, pour ainsi dire :

 ShortOrderTicket[i]=OrderSend(Symbol(),OP_SELL,......
 if(ShortOrderTicket[i]>=0) min[i]=Bid;
 //.....................................................
 //На каждом тике обновляем минимумы для каждого открытого ордера
 for(i=0;i<N;i++){
  if(ShortOrderTicket[i]>=0){
   min[i]=MathMin(min[i],Ask);
  }
// Если достигнуто условие, закрываем ордер
  if(Ask>min[i]+Delta) if(OrderClose(ShortOrderTicket[i],.....))ShortOrderTicket[i]=-1;
 }
Et en cas de problèmes tels que la perte de connexion, le redémarrage du conseiller, etc., nous devrions modifier de temps en temps le stoploss aux ordres.
 
artmedia70:
J'ai fait valoir que le tableau doit être passé ici par référence. Sinon, la fonction devra travailler avec un seul tableau strictement défini. Même si vous l'avez défini globalement.


Hmm. Cela dépend du tableau qui est passé à la fonction appelante. Si c'est un tableau spécifique, alors la fonction appelée fonctionnera avec lui... Parce que c'est...

Si, par exemple,

void FindOrders(int massive[])
{
   int oType;
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1;
   }
}

En l'appelant de cette façon :

FindOrders(OrdersMassive)

Il fonctionne avec le tableau OrdersMassive.

Et donc :

FindOrders(massiveOfOrders)

Avec le tableau massiveOfOrders.

 
Pouvez-vous me dire comment connaître le spread au moment de l'ouverture d'une transaction, ou mieux encore, comment le faire afficher dans le journal ?
 
Forexman77:
Pouvez-vous me dire comment connaître la taille du spread, au moment de l'ouverture d'une transaction, ou, mieux, comment l'afficher dans le journal ?

Si (spread) == une certaine valeur, alors... faites quelque chose... (Par exemple, ouvrir un ordre ou imprimer sa valeur dans le journal). Ou vice versa, s'il n'est pas égal ou supérieur (inférieur) à une certaine valeur, alors nous l'affichons dans le journal et faisons quelque chose. Vous pouvez faire ce que vous voulez.
 

Je vais répéter la question que j'ai posée hier. Je ne veux pas le poster dans un fil séparé. Si quelque chose n'est pas clair, je répondrai à toutes les questions.

J'ai toujours du mal à fermer les positions requises. La situation est la suivante :

1) La fermeture des postes fait l'objet d'un suivi.

2. Dès que la dernière position a été fermée à la ligne de prise... ...toutes les positions ouvertes et en attente doivent être fermées immédiatement. Tout est fermé et trié par lots, c'est-à-dire les grands lots d'un coup, puis les plus petits. Il s'agit uniquement d'acquérir de l'expérience en matière de commandes.

La mise en œuvre est la suivante :

Dans start() à chaque tick :

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

Nous sommes intéressés par la clôture des ordres de marché puisque l'ordre en attente est supprimé au besoin. Voici ce que nous avons :

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   pr ("Запустилась функция isCloseByTakeLastOpenPos");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         pr ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   
   return (true);
}

//+-------------------------------------------------------------------------------------+
//| Закрытие ордеров, отсортированных по размеру лотов                                  |
//+-------------------------------------------------------------------------------------+
void ClosePosBySortLots()
{
   double a[][2];
   int p = 0;
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() < 2)
      {
         p++;
         ArrayResize(a, p);
         a[p-1][0] = OrderLots();
         a[p-1][1] = OrderTicket();
      }
   }
   pr ("ClosePosBySortLots(): " + "p = " + p);
   if (p > 0)
   {
      ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);
      for(i=0; i<p; i++)
      {
         if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
         {
             if (OrderCloseTime() == 0) ClosePosBySelect();
         }
      }
   }
}
//+-------------------------------------------------------------------------------------+
//| Закрытие одного, предварительно выбранного ордера                                   |
//+-------------------------------------------------------------------------------------+
void ClosePosBySelect()
{
   bool   fc;
   color  clClose, clCloseBuy = Blue, clCloseSell = Red;
   double ll, pa, pb, pp;
   int    err, it, NumberOfTry = 3;

   if (OrderType() == OP_BUY || OrderType() == OP_SELL)
   {
       for (it=1; it<=NumberOfTry; it++)
       {
           while (!IsTradeAllowed()) Sleep(5000);
           RefreshRates();
           pa = MarketInfo(OrderSymbol(), MODE_ASK);
           pb = MarketInfo(OrderSymbol(), MODE_BID);
           if (OrderType() == OP_BUY)
           {
               pp = pb; clClose = clCloseBuy;
           }
           else
           {
               pp = pa; clClose = clCloseSell;
           }
           ll = OrderLots();
           fc = OrderClose(OrderTicket(), ll, pp, 30, clClose);
           if (fc)
           {
              break;
           }
           else
           {
               err = GetLastError();
           }
       }
   }
   else Print("Некорректная торговая операция. Close ");
}

Pour une raison quelconque, certaines des commandes ne sont pas fermées. J'imprime certains segments quand je les vois, je ne comprends rien. Voici un exemple :

Dans le commentaire, vous pouvez voir que lastOOTHist = 01:30:00, bien que cela ne soit pas réellement correct. Si nous vérifions lastOOTHist dans la fenêtre des résultats, nous verrons que

leurs heures de fermeture sont différentes...

Qu'est-ce qui ne va pas ici ?

 
hoz:


Hmm. Cela dépend du tableau qui est passé à la fonction appelante. Si c'est un tableau spécifique, alors la fonction appelée fonctionnera avec lui... Parce que c'est...

Si, par exemple,

En l'appelant de cette façon :

Il fonctionne avec le tableau OrdersMassive

Et donc :

Avec le tableau massiveOfOrders.


Lorsque vous passez une variable (tableau) à une fonction par valeur, une variable locale est créée dans la fonction et vous la déclarez dans l'en-tête : maFonction(int ma_var). De cette façon, les changements de cette variable ne peuvent pas être vus en dehors de la fonction. Et dans le cas d'un tableau, le compilateur vous le rappellera.

Si vous voulez que les changements de la valeur de la variable soient visibles à l'extérieur (en dehors de la fonction), passez les variables par référence : myFunct(int & my_var)

 
hoz:


Cela dépend du tableau qui est passé à la fonction appelante. S'il y a un certain tableau, alors la fonction appelée fonctionnera avec lui... C'est comme ça...

Si, par exemple,

En l'appelant comme ça :

Il fonctionne avec le tableau OrdersMassive

Et par là :

Avec le tableau massiveOfOrders

Exactement. C'est ce que je dis - pourquoi voudriez-vous qu'un tableau spécifique soit codé en dur dans la fonction elle-même, si vous pouvez lui passer n'importe quel tableau de la même taille et du même type.
Raison: