Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 785

 
Seric29:

É necessário escrevermodelos (T1) em frente a cada funçãoe será preciso uma variável ou o argumento necessário? Por que ostemplates(T) são declaradose ostemplates(T1) chamados, devo adicionar um número antes de cada função(templates(T1)templates(T2)templates(T3)) ou devo escrevertemplates(T1) em todos os lugares?E se vários parâmetros são pontuados notemplate<digite o nome T>então como seria, como estetemplate<digite o nome T,digite o nome P,digite o nome Q>-templates(T,P,Q).

Sim, o registro ainda é feito antes de cada função, onde você quer transformar uma função normal em um modelo de função. É que este recorde é visivelmente mais curto agora.
T1 é um nome que denota algum tipo de dado, que é armazenado em uma variável com seu nome (a). Não é necessário acrescentar um número. Você pode usar o mesmo nome em qualquer lugar, até mesmo o mesmo T sem um número.
Os modelos não são chamados, mas são automaticamente substituídos com o que está preparado para ele em #define. Esta é uma simples substituição de um texto por outro, mas você pode escrever os parâmetros de entrada entre parênteses, da mesma forma que as funções.

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

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

Em tempo de compilação de modelos(T1) a expressão será substituída por template<typename T1> e você receberá isto

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

Para múltiplos parâmetros, sim, você adivinhou corretamente como descrever.

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

Vejo, obrigado pela informação, já experimentei - é útil.

 
Vitaly Muzichenko:

Eu entendo que você precisa selecionar via switch, e digitar os nomes lá

Seu código imprime um valor int, enquanto você precisa selecionar uma corda


Eu usaria uma matriz de constantes de string para selecionar o nome do indicador, ou seja, meu exemplo dá o número do registro quando o usuário o seleciona, e este número pode ser o número de um elemento (índice) da matriz de string, onde você armazenaria os nomes de texto dos indicadores

Desculpe não ter um terminal, não posso mostrar o exemplo no código, mas acho que já expliquei a idéia

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:

Eu usaria um array de constantes de string para selecionar o nome do indicador, ou seja, meu exemplo dá o número do registro quando selecionado pelo usuário, e este número pode ser o número do elemento (índice) do array de string onde você salvará os nomes dos textos dos indicadores

Desculpe não ter um terminal, não posso mostrar o exemplo no código, mas acho que já expliquei a idéia

PS:

Obrigado, eu fiz, é bastante útil.

E a versão final, esta é apenas a bomba. Há muito tempo que sinto falta disto, pois tenho pelo menos 20 gráficos abertos no terminal

Delete Indicators
Delete Indicators
  • www.mql5.com
Удаляет выбранные индикаторы со всех графиков
 
Olá a todos. Ajude, por favor. Quero que a EA espere por n horas depois de fechar uma negociação. Posso também ajustar esta função. Seria correto mudar Mode_Trades para Mode_History? Obrigado
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:
Olá a todos. Ajude, por favor. Quero que a EA espere por n horas depois de fechar uma negociação. Posso também ajustar esta função. Seria correto mudar Mode_Trades para Mode_History? Obrigado

MODE_HISTÓRIA - é claro que é necessário, mas há outro ponto: no texto "após o fechamento" e no códigoOrderOpenTime

E não vá a bares, devolva o tempo t e depois use-o de alguma forma:

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

MODE_HISTÓRIA - é claro que é necessário, mas há outro ponto: no texto "após o fechamento" e no códigoOrderOpenTime

E não vá a bares, devolva o tempo t e depois use-o de alguma forma:


Eu corrigi para Mode_History, é assim que a coruja não abre o primeiro pedido. Você pode elaborar a solução? Obrigado

 
Carcass77:

Eu corrigi para Mode_History, para que a coruja não abra o primeiro pedido. Você pode, por favor, elaborar a solução? Obrigado

Dê uma olhada nisto.

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

Dê uma olhada nisto.

Como o primeiro pedido é resolvido?

 
Carcass77:

E como você resolve a primeira encomenda?

Observe que a função foi ligeiramente alterada.

//+------------------------------------------------------------------+
//| 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ão: