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

 
Trendy:

Merci beaucoup ! J'en avais besoin pour comparer les caractéristiques des bougies (plus, moins, etc.) Je l'ai vissé - ça marche. Seulement, je ne comprends pas comment il compare le type de données chaîne de caractères ? ou double à chaîne de caractères ne traduit pas nombre à chaîne de caractères ? :-D


PS. Cela ne fonctionne pas dans l'indicateur - seulement dans le script... Lorsque j'appelle High[i] - je n'obtiens que 4 décimales dans celui-ci.

Je suis en train d'écrire :

Alert ("doubletostr High = ", DoubleToStr(High[1],5)) ;
if (DoubleToStr(High[2],5)>(DoubleToStr(High[3],5))
{
Alert ("More") ;
}
si (DoubleToStr(High[2],5)<(DoubleToStr(High[3],5))
{
Alerte ("Plus petit") ;

}

Fonctionne, il écrit le résultat avec cinq chiffres, les comptes plus/moins. Le problème est que dans l'indicateur, le tableau de chaînes n'apparaît pas sur le graphique. Par conséquent...

...l'écriture :

Alert ("Normalized Double High = ", NormalizeDouble(High[1],5)) ;

Cela ne fonctionne pas - le résultat est > 1,1234

Je ne comprends pas les développeurs - pourquoi ont-ils dû compliquer les choses à ce point ? Pourquoi, s'il affiche autant de chiffres sur le graphique, il ne raye pas la fonction appelée avec cinq chiffres ? Peut-être existe-t-il une solution simple ?


Cela devient encore plus intéressant :

traduire

Alert ("iFractals doubletostr= ", DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits)) ;

Ecritures : 1,32169 - OK.

Reconvertir en valeur numérique à l'aide de StrToDouble :

Alert ("iFractals StrToDoubledoubletostr= ", StrToDouble(DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits)) ;

Résultat : 1.3217

Il devrait y avoir un mème avec Jackie Chan où il ne comprend pas la puce).

 
hoz:

Et que produit réellement Alert ?

C'est écrit 0,01 mais c'est en fait 0...0100.
 
Trendy:

Cela devient encore plus intéressant :

traduire

Alert ("iFractals doubletostr= ", DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits)) ;

Ecritures : 1,32169 - OK.

Reconvertir en valeur numérique à l'aide de StrToDouble :

Alert ("iFractals StrToDoubledoubletostr= ", StrToDouble(DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits)) ;

Résultat : 1.3217

Il devrait y avoir un mème avec Jackie Chan où il comprend mal la puce).


DoubleToStr() est utilisé pour sortir les messages avec la précision que vous souhaitez. Les fonctions standard Print(), Alert(), etc., impriment en 4 chiffres.

Lorsque vous voulez voir un nombre avec la précision que vous souhaitez, utilisez DoubleToStr() à ce moment-là, pas dans les calculs.

Vous n'avez pas besoin de traduire quoi que ce soit dans un sens ou dans l'autre... ;)

 
semiromid:

Il indique 0.01 mais la valeur réelle est 0...0100.


Sortie alors 100 * point = 100 * 0,00001 = 0,001pp (si pour cinq chiffres)

La valeur de lBUY a été modifiée ci-dessus. Par conséquent, comme je le vois, la condition:

if(lBUY==0.01)

Ne sera pas atteint. Et donc la valeur de lBUY restera la même.

 
artmedia70:
La variable j doit être initialisée explicitement au début de la fonction avec une valeur négative. Essayez-le. Je n'ai pas encore cherché plus loin.


Hmm. Jusqu'à présent, c'est la même chose. Ici, nous avons :

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = 0,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   
   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;
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
      Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      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);
}
 
artmedia70:

DoubleToStr() est utilisé pour sortir les messages avec la précision que vous souhaitez. Les fonctions standard Print(), Alert(), etc. imprimeront 4 chiffres.

Lorsque vous voulez voir un nombre avec la précision que vous souhaitez, c'est là que vous utilisez DoubleToStr(), pas dans les calculs.

Vous n'avez pas besoin de traduire quoi que ce soit dans les deux sens... ;)


C'est compréhensible... maintenant...) Mais le fait est que j'ai besoin de trouver un cinquième chiffre pour les calculs(

Si DoubleToStr() ne lui convient pas, alors ce langage ne dispose pas d'une telle fonctionnalité ? Les développeurs n'ont-ils pas prévu cela ?

 
hoz:


Hmm. C'est la même chose jusqu'à présent. Nous y sommes :

Ça ne devrait pas être la même chose ? ;)
 
Trendy:

C'est compréhensible... maintenant...) Mais le fait est que j'ai besoin de trouver un cinquième chiffre pour les calculs(

Si DoubleToStr() ne lui convient pas, alors ce langage ne dispose pas d'une telle fonctionnalité ? Les développeurs n'ont-ils pas prévu cela ?


Les calculs utilisent encore plus de chiffres que vous ne le pensez. Si vous voulez voir avec la précision voulue, utilisez DoubleToStr(). Vous ne le verrez pas d'une autre manière.
 

Messieurs les programmeurs ! Comment combiner un EA avec un indicateur ?

Par exemple, j'ai pris un simple bot mo_bidir.mq4 qui trade en utilisant son propre algorithme et je veux qu'il continue à ouvrir des trades en utilisant son propre algorithme mais après le signal de 3 МА.

Par exemple sur un signal - Trois moyennes mobiles:

FastEMA>MediumEMA>SlowEMA (tendance up) - bot achète

FastEMA<MediumEMA<SlowEMA (tendance down) - bot vend

Inp_Signal_TroisEMA_FastPeriod = 8 ;

Inp_Signal_TroisEMA_MediumPeriod = 38 ;

Inp_Signal_TroisEMA_SlowPeriod = 48 ;

Ce dont j'ai besoin, c'est que le conseiller expert continue à négocier sur 5 minutes et que l'indicateur donne des signaux sur l'échelle de temps quotidienne ou de 4 heures. Je veux pouvoir changer d'échelle de temps dans les paramètres du robot.

 
Bonne journée à tous les commerçants. Peut-être que cette question a déjà été discutée, mais certaines EA de la base de code ne se compilent pas dans les nouvelles constructions, le compilateur jure que c'est une version décompilée. Mais cela semble absurde, les versions n'ont jamais été décompilées.
Raison: