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

 
rigonich:

Vous n'avez pas d'ordre sélectionné dans la fonction Trade ().

Au fait. Quel est l'intérêt de sélectionner un ordre dans la fonction Trade()? J'appelle la fonction OrdersModifying() où l'ordre est sélectionné et où il est modifié. C'est-à-dire que la variante initiale était correcte !
 
hoz:


Ça existe. Voici la solution.

Et la fonction de modification est ici :

Étrange Mais il n'y a pas d'arrêts et de prises sur la sortie à nouveau.



OrderSelect(g_ticket,SELECT_BY_TICKET) avant la ligne if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
 
TUNGUS:


History, History_Draw - ils fonctionnent comme des conseillers experts pendant les tests.

Vous avez besoin de quelque chose comme ceci pour surveiller les corrections dans l'historique par des paramètres donnés


Dans l'histoire ou sur la carte ? Voulez-vous voir les résultats dans une fenêtre graphique, dans une fenêtre séparée, imprimés dans un tableau, et si oui, quel type de données, sous forme de bougies de couleurs différentes, de lignes reliant le début et la fin du mouvement ?
 
rigonich:

OrderSelect(g_ticket,SELECT_BY_TICKET) avant la ligne if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)


C'est ce que j'ai fait :

bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

    if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}

Il n'y a pas d'arrêts et de prises de contrôle. Le journal indique l'erreur 130, disant que les arrêts sont incorrects. Je ne vois pas la raison.

 
hoz:


C'est ce que j'ai fait :

Il n'y a pas d'arrêts et de prises de contrôle. Le journal indique l'erreur 130, disant que les arrêts sont incorrects. Je ne vois pas la raison.


Sans ifs, il suffit deOrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) ;, et vous pouvez le laisser dans OrdersModifying()

//+------------------------------------------------------------------+

void OrdersModifying()

{

OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) ;

if(g_type == OP_BUY)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits) ; // Si le paramètre d'entrée stop loss n'est pas 0

// Obtenez la valeur du Stop Loss pour l'ordre sélectionné.

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits) ; // Si le paramètre d'entrée TakeProfit n'est pas égal à 0, alors...

// obtenir la valeur TakeProfit pour l'ordre sélectionné

}

if(g_type == OP_SELL)

{

if(i_sl != 0)sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits) ; // Si le paramètre d'entrée du stop loss n'est pas 0

// Obtenez la valeur du Stop Loss pour l'ordre sélectionné.

if(i_tp != 0)tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits) ; // Si le paramètre d'entrée TakeProfit n'est pas égal à 0, alors...

// obtenir la valeur TakeProfit pour l'ordre sélectionné

}

si(sl != 0 || tp != 0) // Si les valeurs obtenues de sl et tp ne sont pas égales à 0, alors..

{

OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime) ; // Modification de l'ordre

}

}


 
anton.veksler:

Problème avec Symbol() MT4 :

2 fonctions pour illustrer :

L'exécution du premier produit une chaîne vide :

Mais la deuxième fonction produit une chaîne ID "EURUSD" (enfin, cela dépend du graphique, mais produit, bien que selon la logique de la fonction, ce devrait être une chaîne vide) :

Aidez-moi à comprendre ce qui ne va pas. Merci.


Vous ne pouvez pas utiliser de noms réservés (valeur) lorsque vous déclarez vos variables, appelez _valeur
 
hoz:


C'est ce que j'ai fait :

Il n'y a pas d'arrêts et de prises de contrôle. Le journal indique l'erreur 130, disant que les arrêts sont incorrects. Je ne vois pas la raison.

Et ils ne le feront pas !

  double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!
 

Vitaly, j'ai fait comme vous l'avez dit, mais rien n'a changé. Apparemment le bug est enterré quelque part ailleurs.

Avant, j'avais tout (ouverture d'ordres - modification et transfert vers b.w. lorsque le niveau de prix fixé est atteint) et tout fonctionnait. C'était comme ça :

bool Trade (int signal)
{
  FindOrders();
  
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет...
    if(!OpenBuy())                                                           // открываем лимитный ордер на покупку
      return(false);
        
  if(signal == SIGNAL_SELL)                               // Если сигнал на продажу и открытых ордеров нет..
    if(!OpenSell())                                                          // Открываем лимитный ордер на продажу
      return(false);
  
  int total = OrdersTotal() - 1;
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }

  return(true);
}

Maintenant, comme j'ai tout décomposé en fonctions spécifiques et spécialisées, tout a cessé de fonctionner. J'ai essayé les deux façons, rien ne fonctionne. Aucun arrêt n'est fixé.

 
borilunad:

Et ils ne le feront pas !

 double sl = 0, tp = 0;                                           // тут присвоили по нулям
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)           // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!

Où est la logique là-dedans ? J'aimerais comprendre... Voici la fonction :

void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

Si les variables d'entrée i_sl et i_tp ne sont pas égales à zéro, nous obtenons les prix stop et take qui seront déjà dans l'ordre - sl ettp. Après cela, je vérifierai si nous avons calculé lessl ettp ici (si pour les shorts):

 if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }

Si les valeurs sont obtenues, alors elles ne peuvent pas être nulles... car elles seront modifiées ! Ce sont des variables que l'on obtient séquentiellement par contexte de code.

Et ici, j'ai vérifié si nous avons trouvé les valeurs de stop et take. Comment peuvent-ils être nuls après toutes les conditions ?

if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
 

Construisez d'abord votre logique au départ, puis les fonctions, les fichiers, etc.

Pourquoi se gratter la main gauche derrière l'oreille droite !

Raison: