Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1252

 
ANDREY:
Bonne journée à vous tous !
Je teste cet algorithme dans le testeur MT4 en utilisant mql4. J'ai besoin de la fonction Print() pour afficher le prix de l'offre en log avec 5 (cinq) décimales. Mais il n'imprimerait que 4 (quatre) décimales. Veuillez me dire comment réparer mon erreur, si elle existe.
Voici mon code.
void OnTick()
{
Print("=======Bid ======= ",NormalizeDouble(Bid,Digits) ) ;

}


Dans le même temps, si j'imprime à l'aide de Print() le prix d'ouverture et de clôture de l'ordre ( par SL et TP), alors Print() imprime le prix avec 5 (cinq) chiffres.
Merci à tous pour votre aide.

DoubleToString(), pas NormalizeDouble()

 
Igor Makanu:

Je t'ai dit que je n'aimais pas ma décision ((()

Trop paresseux pour écrire à nouveau.

Google "array find repetitions" - Je pense que vous trouverez quelque chose.

enum EResult{Ok,AllocError};

template<typename T>
EResult GetRepeat(const T &arr[],T &ret[],uint count){
   int size=ArraySize(arr);
   if (ArrayResize(ret,size)!=size) return AllocError;
   int ii=0;
   for (int i=0;i<size;){
      T tmp=arr[i];
      uint repeatCount=1;
      while(++i<size&&arr[i]==tmp) ++repeatCount;
      if (repeatCount>=count) ret[ii++]=tmp;}
   return ArrayResize(ret,ii)==ii?Ok:AllocError;
}

void OnStart()
{
   int arr[]={1,2,4,4,4,55,55,7,7,7,7,7,8,9,77,66,66,66};
   int ret[];
   if (!GetRepeat(arr,ret,3)) ArrayPrint(ret);
} 
 
Artyom Trishkin:

DoubleToString(), et non NormalizeDouble()

Merci beaucoup pour votre soutien informatif.

 
Chers collègues, si cela ne vous dérange pas trop, veuillez examiner ma question.
https://www.mql5.com/ru/forum/160683/page1251#comment_18219493
Plus précisément, comment puis-je connaître la valeur de la minute à laquelle le poste est ouvert?
 
Aleksey Masterov:
Plus précisément, comment trouver la valeur de la minute à laquelle un poste est ouvert?

utiliser TimeToStruct()

https://www.mql5.com/ru/docs/dateandtime/timetostruct

 
Igor Makanu:

utiliser TimeToStruct()

https://www.mql5.com/ru/docs/dateandtime/timetostruct

Oui, je l'ai sur mt4
 
Aleksey Masterov:
Oui, je l'ai sur mt4

il fonctionne dans MT4

 
Igor Makanu:

il fonctionne dans MT4

Je ne comprends toujours pas comment je peux obtenir la valeur de la minute à laquelle uneposition a été ouverte à partir de cette structure...
 
Aleksey Masterov:
Je ne comprends pas comment je peux obtenir la valeur de la minute quandla position a été ouverte à partir de cette structure qui retourne la trompette...

datetime o_open = OrderOpenTime() ;

MqlDateTime dt_struct ;

TimeToStruct( o_open, dt_struct;)

int min = dt_struct.min ;

 

Si vous pouvez m'aider à comprendre ce qui ne va pas lorsque j'essaie de lire les données du tampon de l'indicateur.

Voici le code de l'EA :

      if (IsTesting())
         {
         Trend    = GlobalVariableGet(GV_tradesTrend);
         TrendUP  = iCustom(NULL,0,"Used\\# Once Trades Trend",3,0);
         TrendDN  = iCustom(NULL,0,"Used\\# Once Trades Trend",4,0);
         if (TrendUP>0) {Trend=1; GlobalVariableSet(GV_tradesTrend,1);}
         if (TrendDN>0) {Trend=-1;GlobalVariableSet(GV_tradesTrend,-1);}
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}
         }
      else
         {
         Trend = GetLastTrendChange();
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}
         }
//+----------------------------------------------------------------------------+
int GetLastTrendChange()
   {
   int   trendType=0;
   int   y=0;
   int   t=500;
   while (y<t)
      {
      if (iOpen(NULL,0,t)==y) {return(0);}
      trendType=FindTrendChange(y);
      if (trendType==1 || trendType==-1) {return(trendType);}
      y++;
      }
   return(0);
   }
//+----------------------------------------------------------------------------+
int FindTrendChange(int index)
   {
   double   trendUP,trendDN;
   int      trendType=0;
   trendUP = iCustom(NULL,0,"Used\\# Once Trades Trend",3,index);
   trendDN = iCustom(NULL,0,"Used\\# Once Trades Trend",4,index);
   if (trendUP>0) {trendType=1;}
   if (trendDN>0) {trendType=-1;}
   return (trendType);
   }
//+----------------------------------------------------------------------------+

Dans la réalité et dans les tests, la recherche de la dernière valeur par la fonction fonctionne, mais le test est catastrophiquement lent (un test de six mois s'étend sur plusieurs jours).

J'ai donc décidé d'utiliser le swap sur le test et de sauvegarder la dernière valeur dans la variable globale - le conseiller expert a cessé de voir les données de la mémoire tampon. Et même si les tampons vides sont à 0, pour une raison quelconque, les variables d'EA prennent des valeurs EMPTY_VALUE et ne changent pas.

comm

Mais lorsque je place le curseur sur la ligne du tampon dans la fenêtre de données, deux valeurs apparaissent dans l'infobulle, et la première valeur est 0, par exemple Valeur 5 ; 0.0000 ; 0.8855.

Je n'arrive pas à le trouver, même si je fouille dans le code de l'indicateur. La recherche sur Internet et la documentation n'ont pas aidé. Quelqu'un peut-il me dire pourquoi le test est si lent lorsque j'essaie d'utiliser cet indicateur ?

Aidez-moi, s'il vous plaît !

Dossiers :