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

 
borilunad:
Peut-être les conditions sont-elles plus propices au bai ? Franchement, seules des ventes sont ouvertes aujourd'hui en raison de la très faible baisse de l'euro, mais de toute façon quelque chose vaut mieux que rien !


Non. Le signal est écrit dans int GetGeneralSignal() et fonctionne clairement. Le signal est primitif, je l'ai pris juste pour le test. Si le PCI a franchi la frontière supérieure - achetez, et si la frontière inférieure - vendez. Je n'utilise pas d'indices moi-même, mais j'ai décidé de le vérifier uniquement à titre expérimental.

Alors voilà. Sans les drapeaux, tout fonctionne parfaitement. Mais il n'en va pas de même pour les drapeaux. Lorsque la fonctionint FindOrders(bool&long,bool&short) contient un ordre du type donné et que son profit est inférieur à zéro, ma fonction, selon la référence à la fonction GetGeneralSignal(), doit passer la valeur false à un certain drapeau mais en fait les drapeaux montrent toujours true:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         long = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}  

Je peux le voir dans l'imprimante, mais je ne comprends pas pourquoi le drapeau ne change pas.

Au fait, j'ai montré la rentabilité des commandes dans le tirage :

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     pr("profitL =" + profitL);
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     pr("profitS =" + profitS);
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

Et dans l'impression de la valeur des drapeaux, c'est ce qui est montré :

C'est-à-dire qu'il est clair que lorsque la rentabilité est inférieure à zéro, le drapeau correspondant devrait être mis à faux, mais cela ne se produit pas... Tout semble être élémentaire, mais quelque chose ne va pas.

 
hoz:


Non. Il existe un signal dans la fonction int GetGeneralSignal() qui fonctionne bien. Le signal est primitif, je l'ai pris juste pour le test. Si le PCI a franchi la frontière supérieure - achetez, et si la frontière inférieure - vendez. Je n'utilise pas d'indices moi-même, et j'ai décidé de le vérifier uniquement à titre expérimental.

Alors voilà. Sans les drapeaux, tout fonctionne parfaitement. Mais il n'en va pas de même pour les drapeaux. Lorsque la fonctionint FindOrders(bool&long,bool&short) contient un ordre du type donné et que son bénéfice est inférieur à zéro, ma fonction, selon la référence à la fonction GetGeneralSignal(), doit passer la valeur false à un certain flag mais les flags contiennent toujours true:

Je le vois dans l'impression, mais je ne comprends pas pourquoi le drapeau ne change pas.
Regardez, vous avez écrit long=false dans les deux cas, alors comment cela va-t-il s'ouvrir ?
 
hoz:



Je peux le voir dans l'empreinte, mais la raison pour laquelle le drapeau ne change pas n'est pas claire.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false; /// ?????????????????????? 
                 }
                 t++;
              }
   }
   
   return (t);
}  
 

J'ai corrigé la faute de frappe.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         short = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}

Voici une capture d'écran :

Vous pouvez voir, sur le graphique, que le bai est négatif et que le drapeau = TRU de toute façon.

 
Bonsoir, pourriez-vous me dire comment faire pour que le formulaire d'alerte n'apparaisse qu'une seule fois lorsque la condition se produit et non pas chaque fois que la condition est remplie ?
 

Je suis désolé pour vous ! Je vous écrirai comment cela fonctionnera sans les boucles, qui sont ralenties par les fonctions ! Voici votre code, mais en quoi dois-je le changer ?

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
bool& long, bool& short)
double profitL,               // Профит лонговой позиции
       profitS;               // Профит шортовой позиции
 
// int start()
 
//.........................................


  
   if(ExistPositions() == false)
   {
      if(long == true)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(short == true)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
   if(ExistPositions() == true)
   {
      if(profitL > 0 && long == true && short == false)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(profitS > 0 && short == true && long == false)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
      


                     
Ce régime est exempt de crampes et fonctionne instantanément ! Supprimez les fonctions inutiles ! Vous pouvez trouver la fonction ExistPositions() dans les fonctions utiles de Dear Kim !
 
borilunad:

Je suis désolé pour vous ! Je vous écrirai comment cela fonctionnera sans les boucles, qui sont ralenties par les fonctions ! Voici votre code, mais en quoi dois-je le changer ?

Ce système est facile et fonctionne instantanément ! Supprimez les fonctions inutiles ! Vous pouvez trouver la fonction ExistPositions() dans les Fonctions utiles de Kim !


Boris, la fonctionExistPositions ala même boucle, sauf qu'elle a plus de vérifications inutiles, donc elle ne sera pas lente en cours de route. Votre logique est claire pour moi, mais la raison de l'inopérabilité de la version précédente n'a pas été divulguée, ce qui est étrange :)

Vous utilisez aussi ces drapeaux :

 if(profitL > 0 && long == true && short == false)

Et je démontrais qu'ils ne reviennent pas correctement.

Donc, encore une fois, si les variables profitL et profitS sont présentes dans cette fonction, les drapeaux ne sont pas nécessaires.

C'est comme ça que ça s'est passé :

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(double& profitL, double& profitS)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)              // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);      // Выводим профим через коммент на график
                     }
                 }
                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);     // Выводим профим через коммент на график
                         profitS = OrderProfit();
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
        
   if (FindOrders(profitL, profitS) > 30)
       return (SIGNAL_NO);

   if(ExistPositions() == false)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
      {
         if (GetRSI(0) > i_RSIToUpLimit)
         {
             return (SIGNAL_BUY);
         }
      }
       if (GetRSI(1) > i_RSIToDnLimit)
       {
         if (GetRSI(0) < i_RSIToDnLimit)
         {
             return (SIGNAL_SELL);
         }
      }
   }
   if(ExistPositions() == true)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
         if (GetRSI(0) > i_RSIToUpLimit)
         {
            if(profitL > 0)
               return (SIGNAL_BUY);
         }
      if (GetRSI(1) > i_RSIToDnLimit)
      {
         if (GetRSI(0) < i_RSIToDnLimit)
            if(profitS > 0)
               return (SIGNAL_SELL);
      }
   }
            
   return (SIGNAL_NO);
}

Encore une fois, ça ne s'ouvre pas sur le signal, ça s'ouvre sur n'importe quoi.

 
Bonjour à tous !
Je suis en train de faire un trail virtuel et j'ai rencontré un problème avec closelevel=profitpips-TrailingStop; c'est-à-dire que le trail et GlobalVariableSet("tral",0) sont activés comme ils devraient l'être, mais la variable
la variablecloselevel se voit attribuer la valeur de profitpips(c'est le profit actuel en pips) au lieu de profitpips-TrailingStop avec toutes les conséquences qui en découlent o_o



void Trailing()
   {
    if(!GlobalVariableCheck("tral")&&profitpips>=TrailingStart)
     {
      closelevel=profitpips-TrailingStop;
      GlobalVariableSet("tral",0);
      }
    if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;
    if(GlobalVariableCheck("tral")&&profitpips<=closelevel)
     {
      Print ("ВСЁ ОТЛИЧНО ЗАКРЫЛИСЬ ПО ТРАЛЛУ");
      for (int i=0; i<NumberOfTry; i++) 
        {
         CloseAll();
         Lot=LOT;
        }
      }  
     return;}

J'ai compris, la ligne
if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


l'a changé en...
if(GlobalVariableCheck("tral")&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



Maintenant,leniveau de fermeturen'est pas modifiélorsque le profit augmente...

J'ai déjà compris.



 
hoz:


Boris, la fonctionExistPositions a la mêmeboucle, mais il y a plus de vérifications inutiles, donc elle ne sera pas lente en cours de route. Votre logique est claire pour moi, mais la raison de l'inopérabilité de la version précédente n'a pas été divulguée, ce qui est étrange :)

Vous utilisez également ces drapeaux :

Et j'ai démontré qu'ils ne sont pas correctement rendus.

Donc, encore une fois, si les variables profitL et profitS sont présentes dans cette fonction, alors les drapeaux ne sont pas nécessaires.

C'est comme ça que ça s'est passé :

Encore une fois, il ne s'ouvre pas par un signal, mais par n'importe quoi.

Alors faites des recherches chez vous ! Vous avez une fonction pour chaque mot de votre code, et vous devez vous contenter de variables. C'est ce qui rend le code lourd. Il faut utiliser les fonctions quand on ne peut pas s'en passer ! J'ai commenté tout ce dont je n'ai pas besoin dans le code de Kim, et tout fonctionne très vite ! Rappelez-vous, j'ai demandé à tout le monde comment rendre le programme plus rapide dans de nombreuses conditions. Maintenant, le test fonctionne pendant un an sur toutes les tiques en 5 minutes ! J'ai passé au peigne fin toutes les conditions et fonctions et j'ai jeté tout ce qui était inutile.
 
borilunad:
Alors faites des recherches chez vous ! Vous avez une fonction pour chaque mot de votre code, et vous devez vous contenter de variables. C'est ce qui rend le code lourd. Il faut utiliser les fonctions quand on ne peut pas s'en passer ! J'ai commenté tout ce dont je n'ai pas besoin dans le code de Kim, et tout fonctionne très vite ! Rappelez-vous, j'ai demandé à tout le monde comment rendre le programme plus rapide dans de nombreuses conditions. Maintenant, le test fonctionne pendant un an sur toutes les tiques en 5 minutes ! J'ai passé au peigne fin toutes les conditions et fonctions et j'ai jeté tout ce qui était inutile.

Bien sûr que je m'en souviens. Je vais continuer pendant un moment. En fait, je dois changer mes habitudes. Ce n'est pas le premier programmeur à dire que mon code n'est pas facile à comprendre. Apparemment, c'est...