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

 
GygaByte:


C'est exact, mais comme la pratique l'a montré - pas toujours.

Si la cinquième décimale = 5 (1,xxxx5), la valeur est encore déformée :

la question est toujours valable...

P.S. En général, j'ai besoin d'attribuer une valeur de prix à MagicNumber... Et tapez MagicNumber - int, ici et essayez de convertir par

Qui d'autre peut me donner des conseils ?

Merci.

Vous produisez des résultats avec des arrondis différents - vous ne voyez donc pas le nombre complet - et vous pensez que quelque chose est déformé. Par défaut, lors de la sortie de nombres réels, la sortie est arrondie au 4ème chiffre. Pour les nombres à 5 chiffres, vous devez arrondir la sortie de manière explicite :

Alert ("bid= ",bid," bid_minus= ",DoubleToStr(bid_minus,Digits)," bid_plus= ",DoubleToStr(bid_plus,Digits), " Bid = ",DoubleToStr(Bid,Digits));

Regardez votre propre image - l'offre de sortie sans DoubleToStr() et avec DoubleToStr().

 
hoz:

Artyom et Boris, merci d'avoir "mâché" ma question. Il y a des périodes où je peux rester bloqué sur des choses assez simples, comme ce fut le cas cette fois-ci...

Maintenant, il y a une nouvelle question.

J'ai ajouté à la fonction qui calcule le montant des ordres ouverts t, recherche les ordres d'un type spécifié avec des profits spécifiés et compare leurs profits avec une certaine valeur spécifiée (actuellement 0). De plus, s'il n'y a pas d'ordres ouverts, 2 drapeaux avec la valeur True sont retournés avec les paramètres de la fonction FindOrders(), cela signifie que vous pouvez envoyer un ordre, mais s'il y a des ordres, le profit est vérifié pour s'assurer qu'il est supérieur à la valeur fixée, s'il est inférieur à la valeur fixée, 2 drapeaux avec la valeur False sont retournés avec les paramètres de la fonction FindOrders(), ainsi quand il y a des ordres perdants dans une certaine direction, il n'y aura pas d'investissements dans la direction perdante.

Après cela, j'appelle la fonction FindOrders() dans la fonction signal :

Les commandes n'ont pas été ouvertes du tout. La logique semble être correcte. Peut-être, pouvez-vous voir où j'ai fait une erreur ?

Je comprends que tout peut être fait plus facilement avec une fonction séparée et je peux le faire. Mais je veux comprendre pourquoi cela ne fonctionne pas dans cette version.

Victor, je ne peux pas comprendre entièrement votre algorithme, mais je peux vous donner quelques conseils ! Cela m'arrive aussi lorsqu'il y a une erreur dans la logique. Le programme s'arrête s'il s'avère être ambigu ou mutuellement exclusif dans vos conditions. Vous savez peut-être ce que vous voulez, mais vous n'arrivez pas à construire la logique du code correctement. Recherchez ces problèmes et écrivez tout l'ordre dans lequel vous voulez que les conditions soient exécutées, une par une sur une feuille de papier avec des flèches pour plus de clarté ! Bonne chance !
 
borilunad:
Victor, je ne peux pas comprendre entièrement votre algorithme, mais je peux vous donner quelques conseils ! Cela m'arrive aussi lorsqu'il y a une erreur de logique. Le programme s'arrête s'il s'avère être ambigu ou mutuellement exclusif dans vos conditions. Vous savez peut-être ce que vous voulez, mais vous n'arrivez pas à construire la logique du code correctement. Recherchez ces problèmes et écrivez tout l'ordre dans lequel vous voulez que les conditions soient exécutées, une par une sur une feuille de papier avec des flèches pour plus de clarté ! Bonne chance !


Il y a donc une logique simple. S'il n'y a pas d'ordres ouverts, les ordres seront ouverts par le signal.

Et s'il y a des ordres ouverts, alors les ordres doivent être ouverts par un signal spécifique, si le profit des ordres dans une direction donnée (achat ou vente) est supérieur à une certaine valeur, c'est-à-dire au moins pas en moins. (J'ai mis 0 pour le test).

J'ai trouvé une erreur logique. Voici ce qui en est ressorti :

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   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 (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         long = false;              // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         short = false;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 3)
       return (-1);

   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }

   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

Maintenant, les ordres de vente s'ouvrent correctement sur le site, mais les ordres longs ne s'ouvrent pas du tout. Bien que le drapeau ait la valeur des deux variables 1, c'est-à-dire vrai.

 

J'ai ce problème avec mt4.

Avec le lancement du logiciel de courtage mt4 (à savoir les 3 que j'utilise depuis une semaine) sur mon ordinateur, j'obtiens une fenêtre "Exécuter en tant qu'utilisateur" sur mon ordinateur (comme avec "exécuter en tant qu'utilisateur"). Avec toute sélection d'action, mt4 s'ouvre normalement.

Comment faire pour que mt4.eh fonctionne à nouveau sans cette fenêtre ? Peut-être qui sait ou comprend ce qui ne va pas...

 

Bonjour, j'ai rencontré le besoin d'annuler rapidement toutes les commandes en cours. OrderClose ignore les ordres en cours. Quel opérateur est le plus pratique à utiliser, et cette option est-elle disponible ?

 
Notter:

Bonjour, j'ai rencontré le besoin d'annuler rapidement toutes les commandes en cours. OrderClose ignore les ordres en cours. Quel opérateur est le plus pratique à utiliser, et cette option est-elle disponible ?


Vous ne pouvez fermer que les ordres au marché et vous avez besoin de l'opérateur OrderDelete pour supprimer les ordres en attente.
 

hoz

Merci !

 
hoz:


Ainsi, tout est simple dans sa logique. Nous avons besoin que s'il n'y a pas d'ordres ouverts, les ordres seront ouverts par le signal.

Et s'il y a des ordres ouverts, alors les ordres doivent être ouverts par un signal spécifique, si le profit des ordres dans une direction donnée (achat ou vente) est supérieur à une certaine valeur, c'est-à-dire au moins pas en moins. (J'ai mis 0 pour le test).

J'ai trouvé une erreur logique. Voici ce qui en est ressorti :

Maintenant, les ordres de vente s'ouvrent correctement sur le site, mais les ordres longs ne s'ouvrent pas du tout. Bien que le drapeau ait la valeur des deux variables 1, c'est-à-dire vrai.

Victor, fais des recherches ! En commentant le long-buy, regardez dans le log pour voir comment fonctionne le short-sell ! Et vice versa, puis voyez quelle est la différence et découvrez pourquoi cela ne fonctionne pas !
 
borilunad:
Victor, vérifions-le ! En commentant le côté long, vérifiez comment le côté court fonctionne dans le journal ! Et vice versa, puis voyez quelle est la différence et trouvez pourquoi cela ne fonctionne pas !


Boris, si vous commentez l'une des conditions dans int GetGeneralSignal(), l'ouverture est claire.

Je l'ai suivi. Le drapeau ne change pas de valeur lorsque la rentabilité des ordres actuellement ouverts est en moins. Voici la fonction réécrite qui doit mettre les valeurs des drapeaux short et long à false, c'est-à-dire nous interdire d'ouvrir une position s'il y a des ordres négatifs :

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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;
                 }

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

Voici la fonction d'appel :

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 15)
       return (SIGNAL_NO);

   Print("long = ", long);
   Print("short = ", short);
      
   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }
           
   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}
 
hoz:


Boris, si vous commentez l'une des conditions dans int GetGeneralSignal(), l'ouverture est claire.

J'ai retrouvé sa trace. Le drapeau ne change pas de valeur lorsque la rentabilité des ordres actuellement ouverts est en moins. Voici la fonction réécrite qui doit mettre les drapeaux court et long à faux, c'est-à-dire interdire l'ouverture d'une position s'il y a des ordres négatifs :

La fonction d'appel est la suivante :

Peut-être que les conditions pour le bey sont plus appropriées ? Il est vrai que je n'ai que des ventes ouvertes aujourd'hui en raison d'une très faible baisse de l'euro, mais tout de même, quelque chose vaut mieux que rien !
Raison: