Questions des débutants MQL5 MT5 MetaTrader 5 - page 54

 
Mon grand frère est là. Je suppose que j'irai demain.
 
Merkulovv_Artem:

J'obtiens la valeur exacte, mais je n'arrive pas à faire en sorte que la valeur de "Obem_Pozic" soit de 1,00, afin que je puisse calculer le lot pour l'afficher, je ne veux pas le normaliser, il faut juste donner 4 décimales.

J'écris en MQL4.

Je pose la question du MQL4 sur le forum approprié, ici c'est un A.


Vous devriez utiliser DoubleToStr() pour afficher des valeurs plus précises à l'écran.

DoubleToStr - Документация на MQL4
  • docs.mql4.com
DoubleToStr - Документация на MQL4
 
Yedelkin:

Cette paire est probablement fournie par la borne, il suffit de la connecter. Si c'est manuellement, alors dans Market Watch. Et si vous êtes un adulte, vous devez utiliser SymbolSelect().

Dès que vous avez une erreur, les autres suivent. Les premières erreurs se trouvent au bas du terminal. Donc, nous devrions essayer d'éliminer les premières erreurs et ensuite nous verrons :)

Merci ! !! Très bien compris et magnifiquement écrit. J'ai bien SymbolSelect() dans mon EA. Je l'ai posté avec le code en pg. 53, si vous en avez besoin, vous pouvez le voir. J'ai vérifié avec l'aide - c'est correct ! !! Alors, si cette paire est fournie par le terminal, que dois-je penser ?

De plus, si les erreurs du First in line se trouvent au bas du terminal. Pourquoi les messages d'erreur de l'imprimante et les messages du terminal n'alternent-ils pas - non, ils sont regroupés ?

Peut-être que le terminal ne rapporte pas l'erreur de cette fonction ?

 
Apparemment pas celui-là ! !! Ou celui-là, mais pas comme ça. Au début, les messages du programme (imprimantes) et les messages du terminal alternent vraiment, et puis soudain - et 10-12 fois tout d'un coup l'erreur 4002 même apparaît !!!
 
Je devrais probablement encore regarder dans le code... où je pourrais avoir un indicateur
 
Dimka-novitsek: J'ai SymbolSelect() dans mon EA. Je l'ai affiché avec le code de la page 53. 53, si vous en avez besoin, vous pouvez le voir.

Oui, je peux voir ça. Essayons de cette façon :

ResetLastError();
if(SymbolSelect(a_symbol,true)) Print("Символ ",a_symbol," успешно выбран");
else Print("Неудача с выбором символа ",a_symbol,", error = ",_LastError);
 

Merci ! !! ! !

Pouvez-vous me dire à quoi doit ressembler l'impression à durée variable, peut-elle être numérique ? Je vois un, je veux dire le numéro un est affiché.

///////////////////////////////////////////////////////////////////////////////////////////////////////
 
 double  iMAf( string symbol, ENUM_TIMEFRAMES timeframe, int period, int mama_shift, ENUM_MA_METHOD mama_method, int applied_pricece, int shift){
 
    Print ( " iMAfsymbol  ",symbol,"    iMAftimeframe ",timeframe,"  iMAfperiod  ",period," iMAfmama_shift  ",mama_shift ,"  iMAfmama_method ",mama_method,
    "  iMAfapplied_pricece ", applied_pricece,"  iMAfshift ",shift);
 
                     MA_handle=iMA(symbol,timeframe,periodd(period),mama_shift, mama_method,applied_pricece);Sleep(2000);
                     //--- если не удалось создать хэндл
   if(MA_handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
     PrintFormat("Не удалось создать хэндл индикатора iMA для пары %s/%s, код ошибки %d",
                 symbol,
                  EnumToString(timeframe),
                  GetLastError()); ResetLastError();return (0.0);} 
                     
                    CopyBuffer( MA_handle,0,0,100,MA);
                    ArraySetAsSeries(MA,true);
                     if(shift>99) return(0);
    return( (MA[shift])); } 
                   
///////////////////////////////////////////////////////////////////////////////////////////////////////

Je demande pourquoi. C'est une fonction, elle a une ligne avec les empreintes. Le deuxième en partant du haut en conséquence.

Voici l'appel de la fonction.

/////////////////////////////////////////////////////////////////////
int Distance_from_MA(string symbb)
{
 double MAMA = iMAf( symbb, periodd(TFMA), periodMA, ma_shift, ma_method, applied_price, 0);
 
 int spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD));
 double point = SymbolInfoDouble(symbb,SYMBOL_POINT);
 
if(SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 3 || SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 5)
{spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD)/10);
point = SymbolInfoDouble(symbb,SYMBOL_POINT)*10;}
 
 if(iClose(symb,TF_Price,0)+(spread*point)+(Min_Distance_from_MA*point)<=MAMA) return(-1);
 if(iClose(symb,TF_Price,0)-(Min_Distance_from_MA*point)>=MAMA) return (1);
 
 
 return(0);
} 

////////////////////////////////////////////////////////////////////

Notez que j'utilise une autre fonction dans la ligne d'appel. Il est utilisé pour condamner le délai. Il en est ainsi parce que mon Expert Advisor a été pyrividé de 4. J'ai utilisé l'ouvre-boîte. Plus tard, juste au cas où, j'ai ajouté F à F4 timeframes pour l'utiliser davantage.

///////////////////////////////////////////////////////////////////////////////////////////////  
    
   ENUM_TIMEFRAMES  periodd(int per)
  {
   switch(per)
     {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);
      
      case 2: return(PERIOD_M2);
      case 3: return(PERIOD_M3);
      case 4: return(PERIOD_M4);      
      case 6: return(PERIOD_M6);
      case 10: return(PERIOD_M10);
      case 12: return(PERIOD_M12);
      case 16385: return(PERIOD_H1);
      case 16386: return(PERIOD_H2);
      case 16387: return(PERIOD_H3);
      case 16388: return(PERIOD_H4);
      case 16390: return(PERIOD_H6);
      case 16392: return(PERIOD_H8);
      case 16396: return(PERIOD_H12);
      case 16408: return(PERIOD_D1);
      case 32769: return(PERIOD_W1);
      case 49153: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
     }
  }  
  
  
  ///////////////////////////////////////////////////////////////////////////

Et voici ce que je vois

 
Dimka-novitsek: Dites-moi, s'il vous plaît, à quoi doit ressembler l'impression de la variable du délai, peut-elle être numérique ? Je vois un, je veux dire le numéro un est affiché.

Eh bien, juste en dessous dans ce code est utilisé

EnumToString(timeframe), 
 
Merci ! Je vais regarder à nouveau.
 
Dimka-novitsek: Merci ! Laissez-moi le regarder à nouveau.

Je pense que j'ai trouvé d'où peut venir le problème. Je vais la décrire maintenant.

Sur l'image, vous pouvez voir que l'EA fonctionne sur M1, timeframe==1, period==140. Est-ce correct ?

La valeur timeframe==1 indique très probablement que timeframe==M1. En même temps, l'entrée periodd(period) signifie periodd(140). Selon le code, la fonction periodd(140) doit retourner la valeur PERIOD_CURRENT. Il s'avère donc que periodd(140)==M1.
Et cela signifie que l'appel iMA ressemble à ceci : iMA(symbol,M1,M1...) Je ne sais pas s'il est acceptable, lors du calcul de iMA, que la valeur du deuxième argument coïncide avec la valeur du troisième argument (c'est-à-dire que la période coïncide avec la période de calcul de la moyenne), mais quelque chose me dit que c'est faux.