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

 

Comment vider les valeurs hautes et basses de l'indicateur ? Par exemple, si je fixe un maximum de 100 et un minimum de 0, et que j'ai besoin que l'indicateur visualise tout, comment dois-je organiser cela ? Le problème est que j'écris un indicateur avec plusieurs modes, dont l'un utilise max et min, mais après avoir changé le mode dans les paramètres d'entrée, le max reste 100, ainsi que le min 0.


MQL5

 
Alekseu Fedotov:

Vous avez déjà appelé et passé la valeur retournée parDeviation(Kanal) à la fonctionEnvelopes(........)

et dans la fonctionEnveloppes(........) elle-même, vous déclarez le dernier paramètre, qui prendra la valeur suivante


comme ceci

Merci, cela a plus de sens maintenant.

 

J'ai légèrement modifié le code pour MT5 selon vos conseils, il s'est avéré être comme ceci :

input  string Parametrs_Indicator       = "Настройки Индикатора";// Настройки Индикатора

input  ENUM_TIMEFRAMES   Time_Frames    = PERIOD_M5;             // Временной период
       int                Ma_Period     = 120;                   // Период
       int                Ma_Shift      = 0;                     // Cдвиг средней
       ENUM_MA_METHOD     Ma_Method     = MODE_SMMA;             // Mетод усреднения
       ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE;           // Tип цены
//************************************************************************************************/
void OnTick()
{
//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------
}
//************************************************************************************************/
double Envelopes(int buff, double _Deviation)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TimeFrames, Ma_Period, Ma_Shift, Ma_Method, Applied_Price, _Deviation);
   if(handle<0)
   {
    Print("Failed to create handle iEnvelopes, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,buff,0,1,buf)<0)
    {
     Print("Failed to copy data from the indicator iEnvelopes, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Seulement maintenant je ne comprends pas pourquoi à chaque tick la première valeur calculée est écrite partout.

Calculs

Pouvez-vous me dire comment le réparer ?
 
Alexander Layzerevich:

J'ai légèrement modifié le code pour MT5 selon vos conseils, il s'est avéré être comme ceci :

Seulement maintenant je ne comprends pas pourquoi à chaque tick une valeur calculée est écrite partout.

//---------------------------------------------------
   double Signal_Sell = Envelopes(0, Deviation(1)); // Сигнал на Продажу
   Print ("Signal_Sell = ", Signal_Sell);
    if (Signal_Sell < 0) { Print("Signal_Sell error #",GetLastError()); }
   double  Signal_Buy = Envelopes(1, Deviation(1));  // Сигнал на Покупку
   Print ("Signal_Buy = ", Signal_Sell);
     if (Signal_Buy < 0) { Print("Signal_Buy error #",GetLastError()); }
//---------------------------------------------------
   double Signal_Sell_2 = Envelopes(0, Deviation(2));
   Print ("Signal_Sell_2 = ", Signal_Sell);
      if (Signal_Sell_2 < 0) { Print("Signal_Sell_2 error #",GetLastError()); }
   double  Signal_Buy_2 = Envelopes(1, Deviation(2));
   Print ("Signal_Buy_2 = ", Signal_Sell);
       if (Signal_Buy_2 < 0) { Print("Signal_Buy_2 error #",GetLastError()); }
//---------------------------------------------------

C'est immédiatement évident. Même sans être mis en évidence.

 
Artyom Trishkin:

Il attire immédiatement l'attention. Même sans le surlignage.

Merci.

 

Toutes les questions des débutants sur MQL4, aide et discussion sur les algorithmes et les codes

WinProject, 2019.05.07 18:38

Pouvez-vous me dire pourquoi le même code fonctionne dans MT4 mais ne fonctionne pas dans MT5 ? Dans MT5, la variable strNum est toujours égale à 1, mais dans MT4, le compteur ++ fonctionne comme il le devrait et strNum = nombre de lignes dans le fichier.

int strNum;
void OnStart()
  {
 FileNum();
 Alert1();
  } 

  void FileNum()
{
      int handle=FileOpen("File.csv",FILE_CSV|FILE_READ,';');
      strNum=0; 
      while(!FileIsEnding(handle))
{
      FileReadString(handle);
      strNum++;
      if(FileIsEnding(handle)==true)
      break;
}
      FileClose(handle);
}

      void Alert1()
{
      Alert (strNum);
}

Je me réponds à moi-même, cela peut être utile pour ceux qui n'ont pas de boucle dans MT5 lors de l'ouverture ou de la lecture d'un fichier dans un tableau ou une structure. Dans MT5, contrairement à MT4, lors de la lecture d'un fichier .csv, vous devez en plusactiver l'indicateur d'ouverture de fichier FILE_ANSI.

Par exemple, dans MT5, la ligne devrait ressembler à ceci :

int handle=FileOpen("File.csv",FILE_READ|FILE_ANSI|FILE_CSV,";");

Pourquoi, je ne sais pas, peut-être que quelqu'un le sait ?

 
Si le journal de l'EA affiche une notification sous ce format - uninit reason 3 (la notification est due à la commutation du TM), mais que le robot n'est pas supprimé du graphique, les valeurs des variables et tous les calculs qui ont été reçus sont-ils conservés ?
 

J'obtiens "OrderSend error 130" pour une raison inconnue, le programme est exécuté dans le testeur de stratégie sur le compte de démonstration, il ne peut donc pas y avoir de restrictions de la part du courtier d'après ce que je comprends, Niveau des arrêts = 30. Je reçois cette erreur à intervalles réguliers pendant les tests et le stop est fixé en pourcentage de l'ATR pour toutes les transactions mais certains ordres sont placés avec succès alors que d'autres ne le sont pas.

      Print("!!!long level = ", level, ", stop = ", NormalizeDouble(level - stop, Digits));
      if(Bid < level) {
         tickets[orders] = OrderSend(symbol, OP_BUYSTOP, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                                                                           
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;          
         firstTouchTimes[orders] = firstTouchTime;
         orders++;                   
      }       
      else { 
         tickets[orders] = OrderSend(symbol, OP_BUYLIMIT, volume, level, 5, NormalizeDouble(level - stop, Digits), 
                            NormalizeDouble(level + take, Digits), NULL, magicNum, TimeLocal() - TimeLocal() % 1800 + 7200, clrBlue);                
         orderLevels[orders] = level;
         directions[orders] = true;
         orderIsTheLast[orders] = lastOrder;
         firstTouchTimes[orders] = firstTouchTime;
         orders++;    
      }

Il arrive qu'une commande soit rejetée plusieurs fois, puis passe...



 

Comment puis-je publier le même code dans CodeBase pour des publics de langues différentes (par exemple, comment puis-je remplir un formulaire sur la place de marché pour la langue correspondante) ?


J'ai déjà vu cela dans CodeBase, voici un exemple


Comment puis-je faire de même ?

 

Par exemple, lorsque vous réduisez à la limite la taille de l'échelle des chandeliers avec la souris, les lectures de l'indicateur changent, bien qu'aucun des milliers de chandeliers dans le code de l'indicateur ne dise quoi que ce soit sur le changement de taille des chandeliers. Par exemple, à 4 heures, les volumes dans une forme réduite montrent une valeur, mais si vous augmentez légèrement l'échelle des chandeliers, alors un autre réglage sera considéré comme le bon.