Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 785

 
Seric29:

¿Es necesario escribirtempl(T1) delante de cada funcióny que ésta tome una variable o el argumento requerido? ¿Por qué se declaratempl(T) y se llamatempl(T1), debo añadir un número antes de cada función(templ(T1)templ(T2)templ(T3)) o debo escribirtempl(T1) en todas partes?Y si se anotan varios parámetros entemplate<typename T>entonces cómo sería, como estetemplate<typename T,typename P,typename Q>-templ(T,P,Q).

Sí, el registro se sigue haciendo antes de cada función, cuando se quiere convertir una función normal en una plantilla de función. Es que este disco es notablemente más corto ahora.
T1 es un nombre que denota algún tipo de dato, que se almacena en una variable con su nombre (a). No es necesario añadir un número. Puede utilizar el mismo nombre en todas partes, incluso la misma T sin número.
No se llama a la plantilla, sino que se sustituye automáticamente por lo que se le antepone en #define. Se trata de una simple sustitución de un texto por otro, pero se pueden escribir los parámetros de entrada entre paréntesis, al igual que las funciones.

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

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

En tiempo de compilación la expresión templ(T1) será reemplazada por template<typename T1> y obtendrá esto

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

En el caso de los parámetros múltiples, sí, ha acertado en la descripción.

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

Ya veo, gracias por la información, ya lo he probado, es práctico.

 
Vitaly Muzichenko:

Entiendo que hay que seleccionar a través del interruptor, e introducir los nombres allí

Su código imprime un valor int, mientras que usted necesita seleccionar una cadena


Yo utilizaría una matriz de constantes de cadena para seleccionar el nombre del indicador, es decir, mi ejemplo le da el número del registro cuando el usuario lo selecciona, y este número puede ser el número de un elemento (índice) de la matriz de cadenas, donde almacenaría los nombres de texto de los indicadores

lo siento no tengo un terminal, no puedo mostrar el ejemplo en el código, pero creo que he explicado la idea

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:

Yo utilizaría un array de constantes de cadena para seleccionar el nombre del indicador, es decir, mi ejemplo te da el número del registro cuando es seleccionado por el usuario, y este número puede ser el número del elemento (índice) del array de cadenas donde guardarás los nombres de texto de los indicadores

lo siento no tengo un terminal, no puedo mostrar el ejemplo en el código, pero creo que he explicado la idea

PS:

Gracias, lo hice, es bastante útil.

Y la versión final, es la bomba. Llevo mucho tiempo sin ver esto, ya que tengo al menos 20 gráficos abiertos en el terminal

Delete Indicators
Delete Indicators
  • www.mql5.com
Удаляет выбранные индикаторы со всех графиков
 
Hola a todos. Ayuda, por favor. Quiero que el EA espere n horas después de cerrar una operación. También puedo modificar esta función. ¿Sería correcto cambiar Mode_Trades por Mode_History? Gracias
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:
Hola a todos. Ayuda, por favor. Quiero que el EA espere n horas después de cerrar una operación. También puedo modificar esta función. ¿Sería correcto cambiar Mode_Trades por Mode_History? Gracias

MODE_HISTORY - por supuesto que es necesario, pero hay otro punto: en el texto "después de cerrar" y en el códigoOrderOpenTime

Y no vayas a los bares, devuelve el tiempo t y luego úsalo de alguna manera:

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

MODE_HISTORY - por supuesto que es necesario, pero hay otro punto: en el texto "después de cerrar" y en el códigoOrderOpenTime

Y no vayas a los bares, devuelve el tiempo t y luego úsalo de alguna manera:


He corregido a Mode_History, así es como el búho no abre la primera orden. ¿Puede detallar la solución? Gracias

 
Carcass77:

He corregido a Mode_History, para que el búho no abra la primera orden. ¿Puede explicar la solución? Gracias

Mira esto.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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:

Echa un vistazo a esto.

¿Cómo se resuelve el primer pedido?

 
Carcass77:

¿Y cómo se resuelve la primera orden?

Tenga en cuenta que la función ha cambiado ligeramente.

//+------------------------------------------------------------------+
//| 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);
  }
//+----------------------------------------------------------------------------+  
Razón de la queja: