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

 
Seric29:

Est-il nécessaire d'écriretempl(T1) devant chaque fonctionpour qu'elle prenne une variable ou l'argument requis ? Pourquoitempl(T) est déclaréettempl(T1) appelé, dois-je ajouter un nombre avant chaque fonction(templ(T1)templ(T2)templ(T3)) ou dois-je écriretempl(T1) partout ?Et si plusieurs paramètres sont notés danstemplate<typename T>alors comment cela se passerait-il, comme cecitemplate<typename T,typename P,typename Q>-templ(T,P,Q).

Oui, l'enregistrement se fait toujours avant chaque fonction, lorsque vous voulez transformer une fonction normale en modèle de fonction. C'est juste que ce disque est nettement plus court maintenant.
T1 est un nom qui désigne un certain type de données, qui sont stockées dans une variable portant son nom (a). Il n'est pas nécessaire d'ajouter un chiffre. Vous pouvez utiliser le même nom partout, même le même T sans numéro.
Le templ n'est pas appelé, mais est automatiquement remplacé par ce qui lui est ajouté en préambule dans #define. Il s'agit d'un simple remplacement d'un texte par un autre, mais vous pouvez écrire les paramètres d'entrée entre parenthèses, tout comme les fonctions.

#define  templ(T) template<typename T> // один входной параметр именуемый буквой "T" т. е. "T" это просто имя.

templ(T1) T1 Funct(T1 a) { return a;} // функция вернёт тот же тип, что и будет передан при вызове это функции

Au moment de la compilation, l'expression templ(T1) sera remplacée par template<typename T1> et vous obtiendrez ceci

template<typename T1>
T1 Funct(T1 a) { return a;}

Pour les paramètres multiples, oui, vous avez deviné correctement comment décrire.

Макроподстановка (#define) - Препроцессор - Основы языка - Справочник MQL4
Макроподстановка (#define) - Препроцессор - Основы языка - Справочник MQL4
  • docs.mql4.com
Директива #define подставляет expression вместо всех последующих найденных вхождений identifier в исходном тексте. identifier заменяется только в том случае, если он представляет собой отдельный токен. identifier не заменяется, если он является частью комментария, частью строки, или частью другого более длинного идентификатора. expression...
 
Ilya Prozumentov:

Je vois, merci pour l'information, j'ai déjà essayé - c'est pratique.

 
Vitaly Muzichenko:

J'ai cru comprendre que vous deviez sélectionner le commutateur et y entrer les noms.

Votre code imprime une valeur int, alors que vous devez sélectionner une chaîne de caractères.


J'utiliserais un tableau de constantes de chaîne pour sélectionner le nom de l'indicateur, c'est-à-dire que mon exemple vous donne le numéro de l'enregistrement lorsque l'utilisateur le sélectionne, et ce numéro peut être le numéro d'un élément (index) du tableau de chaînes, où vous stockeriez les noms de texte des indicateurs.

Désolé, je n'ai pas de terminal, je ne peux pas montrer l'exemple dans le code, mais je pense avoir expliqué l'idée.

PS :

#property strict
#property show_inputs
enum Eind {
 ind_1, // Indicator 1
 ind_2, // Indicator 2
 ind_3, // Indicator 3
 ind_4  // Indicator 4
};

input Eind param = ind_1;
const string IndicatorName[] = {"Moving Average","ADX","ZigZag","Fractals"};
//+------------------------------------------------------------------+
void OnStart()
  {
   Alert("Выбран :",param, " . Удаляю индикатор : ",IndicatorName[param]);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

J'utiliserais un tableau de constantes de chaînes de caractères pour sélectionner le nom de l'indicateur, c'est-à-dire que mon exemple vous donne le numéro de l'enregistrement lorsqu'il est sélectionné par l'utilisateur, et ce numéro peut être le numéro de l'élément (index) du tableau de chaînes de caractères où vous enregistrerez les noms des indicateurs.

Désolé, je n'ai pas de terminal, je ne peux pas montrer l'exemple dans le code, mais je pense avoir expliqué l'idée.

PS :

Merci, je l'ai fait, c'est assez pratique.

Et la version finale, c'est juste la bombe. Cela me manque depuis longtemps, car j'ai au moins 20 graphiques ouverts dans le terminal.

Delete Indicators
Delete Indicators
  • www.mql5.com
Удаляет выбранные индикаторы со всех графиков
 
Bonjour à tous. Aidez-nous, s'il vous plaît. Je veux que l'EA attende n heures après la clôture d'une transaction. Je peux aussi modifier cette fonction. Serait-il correct de changer Mode_Trades en Mode_Histoire ? Merci.
int BarsAfterOrderBuy()
{
datetime t=0;int i;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{if(t<OrderOpenTime())t=OrderOpenTime();}
return(iBarShift(Symbol(),0,t,true));
}
 
Carcass77:
Bonjour à tous. Aidez-nous, s'il vous plaît. Je veux que l'EA attende n heures après la clôture d' une transaction. Je peux aussi modifier cette fonction. Serait-il correct de changer Mode_Trades en Mode_Histoire ? Merci.

MODE_HISTORY - bien sûr, il est nécessaire, mais il y a un autre point : dans le texte "après la fermeture" et dans le codeOrderOpenTime

Et ne va pas dans les bars, ne rend pas le temps t et ne l'utilise pas d'une manière ou d'une autre :

if(TimeCurrent()>t+n*3600) {можно открывать}
 
Igor Zakharov:

MODE_HISTORY - bien sûr, il est nécessaire, mais il y a un autre point : dans le texte "après la fermeture" et dans le codeOrderOpenTime

Et ne va pas dans les bars, ne rend pas le temps t et ne l'utilise pas d'une manière ou d'une autre :


J'ai corrigé en Mode_Histoire, c'est comme ça que la chouette n'ouvre pas la première commande. Pouvez-vous préciser la solution ? Merci

 
Carcass77:

J'ai corrigé en Mode_Histoire, pour que la chouette n'ouvre pas la première commande. Pouvez-vous préciser la solution ? Merci

Jetez un coup d'oeil à ça.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после закрытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterCloseLastPos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(t<OrderCloseTime()) t=OrderCloseTime();
                    }
                 }
              }
           }
        }
     }
   return(TimeCurrent()-t);
  }
 
Alekseu Fedotov:

Jetez un coup d'oeil à ça.

Comment le premier ordre est-il résolu ?

 
Carcass77:

Et comment résoudre le premier ordre ?

Veuillez noter que la fonction a légèrement changé.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// здесь пофиг какой символ и какая позиция ... последняя позиция и все
  int ClosePos = SecondsAfterCloseLastPos();
  
  
// здесь по тек. символу и пофиг какая позиция 
//  int ClosePos = SecondsAfterCloseLastPos(Symbol());  

// здесь по тек. символу и OP_BUY позиция 
//  int ClosePos = SecondsAfterCloseLastPos(Symbol(),OP_BUY); 

// здесь по тек. символу , OP_BUY позиция , и магик  5 
//  int ClosePos = SecondsAfterCloseLastPos(Symbol(),OP_BUY,5);

// продажи,  вместо OP_BUY прописываем  OP_SELL.

   if(ClosePos > 3600 || ClosePos == 0 )  {/*можно открывать*/}
   
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после закрытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int SecondsAfterCloseLastPos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(t<OrderCloseTime()) t=OrderCloseTime();
                    }
                 }
              }
           }
        }
     }
  int CloseTime; 
     if(t==0)
        CloseTime=0;
     else 
        CloseTime = int(TimeCurrent()-t);
      
   return(CloseTime);
  }
//+----------------------------------------------------------------------------+