Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 785

 
Seric29:

È necessario scriveretempl(T1) davanti ad ogni funzionee prenderà una variabile o l'argomento richiesto? Perché è dichiaratotempl(T) e chiamatotempl(T1), devo aggiungere un numero prima di ogni funzione(templ(T1)templ(T2)templ(T3)) o devo scriveretempl(T1) ovunque?E se diversi parametri sono segnati intemplate<typename T>allora come sarebbe, come questotemplate<typename T,typename P,typename Q>-templ(T,P,Q).

Sì, la registrazione è ancora fatta prima di ogni funzione, dove si vuole trasformare una funzione normale in un modello di funzione. È solo che questo disco è notevolmente più corto ora.
T1 è un nome che denota un certo tipo di dati, che vengono memorizzati in una variabile con il suo nome (a). Non è necessario aggiungere un numero. Puoi usare lo stesso nome ovunque, anche la stessa T senza numero.
Il templ non viene chiamato, ma viene automaticamente sostituito con ciò che gli viene anteposto in #define. Questa è una semplice sostituzione di un testo con un altro, ma potete scrivere i parametri di input tra parentesi, proprio come le funzioni.

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

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

A tempo di compilazione l'espressione templ(T1) sarà sostituita con template<typename T1> e otterrete questo

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

Per i parametri multipli, sì, avete indovinato come descrivere.

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

Capisco, grazie per l'informazione, l'ho già provato - è utile.

 
Vitaly Muzichenko:

Capisco che bisogna selezionare tramite interruttore, e inserire i nomi lì

Il tuo codice stampa un valore int, mentre tu hai bisogno di selezionare una stringa


Userei un array di costanti di stringhe per selezionare il nome dell'indicatore, cioè il mio esempio vi dà il numero del record quando l'utente lo seleziona, e questo numero può essere il numero di un elemento (indice) dell'array di stringhe, dove memorizzereste i nomi di testo degli indicatori

Mi dispiace di non avere un terminale, non posso mostrare l'esempio nel codice, ma penso di aver spiegato l'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:

Io userei un array di costanti di stringa per selezionare il nome dell'indicatore, cioè il mio esempio vi dà il numero del record quando viene selezionato dall'utente, e questo numero può essere il numero dell'elemento (indice) dell'array di stringhe dove salverete i nomi testuali degli indicatori

Mi dispiace di non avere un terminale, non posso mostrare l'esempio nel codice, ma penso di aver spiegato l'idea

PS:

Grazie, l'ho fatto, è abbastanza utile.

E la versione finale, questa è solo una bomba. Mi mancava da molto tempo, dato che ho almeno 20 grafici aperti nel terminale

Delete Indicators
Delete Indicators
  • www.mql5.com
Удаляет выбранные индикаторы со всех графиков
 
Ciao a tutti. Aiuto, per favore. Voglio che l'EA aspetti n ore dopo aver chiuso un trade. Posso anche modificare questa funzione. Sarebbe corretto cambiare Mode_Trades in Mode_History? Grazie
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:
Ciao a tutti. Aiuto, per favore. Voglio che l'EA aspetti n ore dopo aver chiuso un trade. Posso anche modificare questa funzione. Sarebbe corretto cambiare Mode_Trades in Mode_History? Grazie

MODE_HISTORY - naturalmente è necessario, ma c'è un altro punto: nel testo "dopo la chiusura" e nel codiceOrderOpenTime

E non andare nei bar, restituire il tempo t e poi usarlo in qualche modo:

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

MODE_HISTORY - naturalmente è necessario, ma c'è un altro punto: nel testo "dopo la chiusura" e nel codiceOrderOpenTime

E non andare nei bar, restituire il tempo t e poi usarlo in qualche modo:


Ho corretto a Mode_History, è così che il gufo non apre il primo ordine. Puoi approfondire la soluzione? Grazie

 
Carcass77:

Ho corretto in Mode_History, così il gufo non apre il primo ordine. Puoi per favore elaborare la soluzione? Grazie

Date un'occhiata a questo.

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

Date un'occhiata a questo.

Come si risolve il primo ordine?

 
Carcass77:

E come si risolve il primo ordine?

Si prega di notare che la funzione è cambiata leggermente.

//+------------------------------------------------------------------+
//| 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);
  }
//+----------------------------------------------------------------------------+