Apprendre et écrire ensemble en MQL5 - page 13

 
Yedelkin:

Étrange. Vous avez besoin du code pour MQL5, qui devrait déjà être sur le site web. Vous n'avez qu'à vous renseigner. C'est exactement ce dont je parle.

Mais c'est à vous de voir.

C'est une recherche très fastidieuse, peut-être que quelqu'un vous le dira.

A propos, j'ai refait ce code pour mql5. Peut-être que quelqu'un pourrait l'utiliser.

input double risk=0.01;
   double lot_min =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   double lot_max =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double lot_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   double contract=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   double free_margin=AccountInfoDouble(ACCOUNT_FREEMARGIN);
   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
   double lot;
   
     lot=NormalizeDouble(free_margin*risk*leverage/contract,2);
     lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;
 
Messieurs.
veuillez commenter :

ENUM_TRADE_RETURN_CODES
Code ID Description
10004 TRADE_RETCODE_REQUOTE Demande rejetée
10006 TRADE_RETCODE_REJECT Demande rejetée
...
pas de code 10005. N'est-ce pas une erreur ?
Respectueusement ...
 

Question. Il existe une fonction appelée GetTickCount () - ellerenvoie le nombre de millisecondes écoulées depuis le démarrage du système. La note précise que "lecomptage est limité par la résolution de la minuterie du système. Comme l'heure est stockée sous la forme d'un nombre entier non signé, elle déborde tous les 49,7 jours lorsque l'ordinateur fonctionne en continu".

Et que se passe-t-il lorsque le compteur déborde ? Est-ce qu'il se réinitialise et commence un nouveau compte à rebours, ou est-ce que le système se fige ?

 

Yedelkin:

Que se passe-t-il lorsque le compteur déborde ? Est-ce qu'il se réinitialise et recommence un nouveau comptage, ou est-ce que le système se fige ?

Il déborde et repart de zéro.
 
Renat:
Il déborde et recommence à zéro.
OK, je l'ai !
 

Question. La description de switch(expression){...} indique que "l'expression de l'opérateur switch doit être de type entier". J'ai vu la description de cet opérateur avec des expressions d'autres types sur Internet. L'utilisation de l'opérateur de commutation sera-t-elle étendue en ajoutant des expressions de type chaîne de caractères ?

 
Yedelkin:

Question. La description de switch(expression){...} indique que "l'expression de l'opérateur switch doit être de type entier". J'ai vu la description de cet opérateur avec des expressions d'autres types sur Internet. Allons-nous étendre l'utilisation de l'opérateur switch en ajoutant des expressions de type chaîne de caractères ?

Non, malheureusement, ce ne sera pas le cas. Pour les types de chaînes de caractères, seulement si ... sinon si ... autre .

L'utilisation de types entiers dans switch accélérera l'opérateur de switch plusieurs fois plus que si

Документация по MQL5: Основы языка / Типы данных / Целые типы
Документация по MQL5: Основы языка / Типы данных / Целые типы
  • www.mql5.com
Основы языка / Типы данных / Целые типы - Документация по MQL5
 
stringo:

Non, malheureusement, ce ne sera pas le cas. Pour les types de chaînes de caractères, seulement si ... sinon si ... sinon

L'utilisation de types entiers dans le switch accélérera le code plusieurs fois plus que si

OK, merci pour le conseil !
 

Question. La description de la fonction StringConcatenate() indique que "StringConcatenate() fonctionne plus rapidement et plus économiquement en mémoire que la liaison de chaînes de caractères au moyen d'opérations d'addition, car les variables temporaires de type chaîne de caractères ne sont pas utilisées". J'ai utilisé les exemples du manuel de référence, en les modifiant légèrement :

   string a="a",b="b",c;
   uint   start,stop;
   long   i,length=10000000;
//--- первый способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      c=a+b;
     }
   stop=GetTickCount();
   Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);


//--- второй способ
   a="a"; // заново инициализируем переменную a
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(a,b);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd(a,b)' = ",(stop-start)," milliseconds, i = ",i);

//--- третий способ
   a="a";c="";  
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      int k=StringConcatenate(c,a,b);
      //c="";   //с такой строчкой работает ещё дольше.          
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(c,a,b)' = ",(stop-start)," milliseconds, i = ",i);
La sortie est :

DR 0 DoubleToString (EURGBP,M1) 22:15:55  time for 'c = a + b'              = 2359 milliseconds, i = 10000000
QE 0 DoubleToString (EURGBP,M1) 22:15:56  time for 'StringAdd(a,b)'          = 1031 milliseconds, i = 10000000
FE 0 DoubleToString (EURGBP,M1) 22:16:00  time for 'StringConcatenate(c,a,b)' = 3891 milliseconds, i = 10000000

Il s'avère que StringConcatenate fonctionne plus lentement que la liaison de chaînes de caractères utilisant des opérations d'addition. Quel est le problème ?

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Yedelkin:

Question. La description de la fonction StringConcatenate() indique que "StringConcatenate() fonctionne plus rapidement et plus économiquement en mémoire que la liaison de chaînes de caractères au moyen d'opérations d'addition, car les variables temporaires de type chaîne de caractères ne sont pas utilisées". J'ai utilisé des exemples de la Référence, en les modifiant un peu :

J'ai obtenu le résultat :

Il s'avère que StringConcatenate fonctionne plus lentement que la liaison de chaînes de caractères utilisant des opérations d'addition. Quel est le problème ?

C'est un peu un terme impropre pour vérifier (si je comprends bien). L'astuce de la fonction est autre chose...

Approximativement ce code

////////////////////////////////////////////////////////////////////////////////
//             Global variables, used in working the trade system             //
////////////////////////////////////////////////////////////////////////////////
string a="Пример";
double b=1.26,c = 1.27;
string d;

uint   start,stop;

long   i,length=10000000;
////////////////////////////////////////////////////////////////////////////////
void OnStart()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

start=GetTickCount();
   
  for(i=0;i<length;i++)
  {
  d=a+(string)b+(string)c;
  }

stop=GetTickCount();

Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  StringAdd(d,a);
  StringAdd(d,(string)b);
  StringAdd(d,(string)c);
  }
stop=GetTickCount();

Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  int k=StringConcatenate(d,a,b,c);
  }

stop=GetTickCount();

Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);
//----------------------------------------------------------------------------//   
}
////////////////////////////////////////////////////////////////////////////////

Et ce résultat

2011.04.15 15:28:58     123 (EURUSD,D1) time for 'd = a + b + c' = 81094 milliseconds, i = 10000000
2011.04.15 15:30:24     123 (EURUSD,D1) time for 'StringAdd()' = 85828 milliseconds, i = 10000000
2011.04.15 15:31:46     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 81812 milliseconds, i = 10000000
2011.04.15 15:33:36     123 (EURUSD,D1) time for 'd = a + b + c' = 82938 milliseconds, i = 10000000
2011.04.15 15:35:00     123 (EURUSD,D1) time for 'StringAdd()' = 83859 milliseconds, i = 10000000
2011.04.15 15:36:21     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 80719 milliseconds, i = 10000000

PS

Très probablement, la ligne d= "" aurait dû être placée dans la boucle for, mais je ne pense pas que ce bogue ait beaucoup d'effet sur le résultat.

Raison: