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

 
Vladimir Pastushak:

Como posso saber o tipo de parâmetro de entrada?

o próprio compilador substitui os tipos no momento da chamada de função modelo, se tal chamada ainda não estava no código, então o compilador criará outra cópia de função e definirá os próprios tipos - bem, como se logicamente - um modelo


se a questão é sobre como definir o tipo em tal função, use

typename

UPD: adicionado ao exemplo acima o tipo de parâmetro impressoras:

#define  PRINT(VAL) Print(#VAL," = ",VAL, ", typename = ", typename(VAL))
template<typename T1, typename T2>
int myfunc(T1 val1=0, T2 val2=0)
{
   Print(__FUNCSIG__);
   PRINT(val1);
   PRINT(val2);
   return((int) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart()
{
   int i1 = 2, i2 = 3;
   Print(myfunc(i1, i2));
   double d1 = 10.0, d2 = 30.0;
   Print(myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, nome datilografia = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, nome datilografia = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, nome datilografia = duplo

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, nome datilografia = duplo

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD: adicionado__FUNCSIG__ a este exemplo

 

Boa tarde.
Estou diante de algo estranho ao escrever um indicador em MQL5 (indicador em uma subjanela separada, 4 linhas).

As descrições iniciais do buffer são as seguintes:

//------------------------------------------------------------------
#property indicator_buffers   6
#property indicator_plots     4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3   DRAW_COLOR_LINE
#property indicator_color3  clrWhite, clrBlack
#property indicator_style3  STYLE_SOLID
#property indicator_width3  3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4   DRAW_COLOR_LINE
#property indicator_color4  clrYellow, clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//------------------------------------------------------------------
//--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double      RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double      MAr1_fast[];                                                   // буфер под быструю МА
double      MAr2_slow[];                                                   // буфер под медленную МА
double      MAr2_slowColor[];                                              // буфер под цвета медленной МА
//--------------------------------------------------------------------
double      MAr3_slow_glob[];                                              // буфер под глобальную медленную МА
double      MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

A seguir, no OnInit:

   //--------------------------------------------------------------------
   SetIndexBuffer       (0,   RSI,                 INDICATOR_DATA);
   ArraySetAsSeries     (     RSI,                 true);
   PlotIndexSetString   (0,   PLOT_LABEL,          "RSI(" + IntegerToString(RSI_per) + ")");
   PlotIndexSetInteger  (0,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (0,   PLOT_DRAW_BEGIN,     RSI_per);
   PlotIndexSetDouble   (0,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (1,   MAr1_fast,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr1_fast,           true);
   PlotIndexSetString   (1,   PLOT_LABEL,          "MA (" + IntegerToString(MA_fast_period) + "), EMA");
   PlotIndexSetInteger  (1,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (1,   PLOT_DRAW_BEGIN,     MA_fast_period);
   PlotIndexSetDouble   (1,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (2,   MAr2_slow,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr2_slow,           true);
   PlotIndexSetString   (2,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_period) + "), SMA");
   PlotIndexSetInteger  (2,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (2,   PLOT_DRAW_BEGIN,     MA_slow_period);
   PlotIndexSetDouble   (2,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (3,   MAr2_slowColor,      INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr2_slowColor,      true);
   PlotIndexSetDouble   (3,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (4,   MAr3_slow_glob,      INDICATOR_DATA);
   ArraySetAsSeries     (     MAr3_slow_glob,      true);
   PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
   PlotIndexSetInteger  (4,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (4,   PLOT_DRAW_BEGIN,     MA_slow_glob_period);
   PlotIndexSetDouble   (4,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (5,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr3_slow_globColor, true);
   PlotIndexSetDouble   (5,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------

Essencialmente: o indicador desenha 4 linhas: as duas primeiras são apenas de uma cor, as duas seguintes são bicolores (elas mudam de cor nas dobras).

Bicolor deve-se à forma de desenhar DRAW_COLOR_LINE.

Pergunta: a primeira linha (buffers 2 e 3 no código acima) está perfeitamente desenhada e todos os códigos escritos para ela no OnInit funcionam;
a segunda linha aparece por alguma razão, por exemplo, a linha não funciona:

PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Isto é, ao invés do texto que eu defino na janela de dados, apenas o nome do indicador é exibido no lugar do buffer. Embora a linha em si seja traçada, e é, como deveria ser, multicolorida.
Eu acho que o truque está na mudança de numeração? Por exemplo, não tenho certeza por que na parte superior do código, quando declaro a última linha com a diretiva #propriedade, o índice deve ser 4 e não 5, já que 4 buffers já foram usados antes. Existe alguma relação entre numeração de linhas ao declarar com #propriedade e numeração tampão ao ligar com arrays no OnInit?

Por favor, informe o que está errado no código acima. Talvez alguém possa encontrar um exemplo de indicador onde pelo menos duas linhas são desenhadas usando o método de desenho DRAW_COLOR_LINE....

Mais uma pergunta relacionada: como os amortecedores de linha coloridos ficam amarrados juntos? Quero dizer, como o código compilado sabe que se eu colocar um valor em um buffer de cor, essa cor deve ser usada para colorir uma linha de algum outro buffer?

 
satorifx:

Boa tarde.
Estou diante de algo estranho ao escrever um indicador em MQL5 (indicador em uma subjanela separada, 4 linhas).

As descrições iniciais do buffer são as seguintes:

A seguir, no OnInit:

Essencialmente: o indicador desenha 4 linhas: as duas primeiras são apenas de uma cor, as duas seguintes são bicolores (elas mudam de cor nas dobras).

Bicolor deve-se à forma de desenhar DRAW_COLOR_LINE.

Pergunta: a primeira linha (buffers 2 e 3 no código acima) está perfeitamente desenhada e todos os códigos escritos para ela no OnInit funcionam;
a segunda linha aparece por alguma razão, por exemplo, a linha não funciona:

Isto é, ao invés do texto que eu defino na janela de dados, apenas o nome do indicador é exibido no lugar do buffer. Embora a linha em si seja traçada, e é, como deveria ser, multicolorida.
Eu acho que o truque está na mudança de numeração? Por exemplo, não tenho certeza por que na parte superior do código, quando declaro a última linha com a diretiva #propriedade, o índice deve ser 4 e não 5, já que 4 buffers já foram usados antes. Existe alguma relação entre numeração de linhas ao declarar com #propriedade e numeração tampão ao ligar com arrays no OnInit?

Por favor, informe o que está errado no código acima. Talvez alguém possa encontrar um exemplo de indicador onde pelo menos duas linhas são desenhadas usando o método de desenho DRAW_COLOR_LINE

Mais uma pergunta relacionada: como os amortecedores de linha coloridos ficam amarrados juntos? Quero dizer, como o código compilado sabe que se eu colocar um valor em um buffer de cor, essa cor deve ser usada para colorir uma linha de algum outro buffer?

Os mapeamentos são numerados de forma diferente dos tampões.

PlotIndexSetString   (3,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");

Isto deve funcionar.

 

Boa tarde a todos!

Fiz uma função para modificar a perda de carga. Mas quando funciona, dá EURUSD,H1: OrderModify error 130.

E o preço está longe do local onde deve ser fixado o stoploss.

Aqui está a função:

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
Bom dia. Quero escrever um EA baseado na medição do ângulo de inclinação de uma média móvel (ou melhor, um conjunto delas, ou seja, o Jacaré), para que o EA dê um alerta sobre um forte impulso de preço, de preferência com um pequeno atraso. Por favor, informe como medir o ângulo do MA ou "diga ao EA" que o pulso ocorreu. Talvez já existam maneiras conhecidas de se fazer isso. Ou, por exemplo, um indicador livre baseado no cálculo do impulso?
 

Escreveu uma função para encontrar o número de barra de um fractal em 3 barras. No gráfico online parece encontrá-lo corretamente. Mas, durante os testes visuais no testador, ele mente. Algum dos profissionais pode dar uma olhada no código e encontrar alguns erros?

Eu ficaria muito grato.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
 if(sy=="" || sy=="0") sy=Symbol();
 int nlext=0,k=iBars(sy,tf);
 nlext=0;
 if(mode==MODE_UPPER)
   {
    for (int i=2; i<=k; i++)
     {
      if(High[i]>High[i+1] && High[i]>High[i-1])
        {
         nlext++;
         
         if(nlext>ne) return(i);
        }
     }    
   }        
 if(mode==MODE_LOWER)
   {
    for (i=2; i<=k; i++)
     {
      if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
        {
         nlext++;
         if(nlext>ne) 
           {
            //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
            return(i); 
           }
        }
     }    
   }       
    Print("Бар локального экстремума не найден");
    return(-1);     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

Boa tarde. QUE CÓDIGO DEVO ACRESCENTAR PARA QUE O INDICADOR DEIXE DE FUNCIONAR NO TESTADOR APÓS UM MÊS? OU SEJA, EU ESCREVI TUDO OK ! MAS QUANDO EU FAÇO UM BACKTEST FUNCIONA NOVAMENTE. (mgl4)

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  datetime data=D'2020.09.16 20:07';  // Time Block
    if(TimeCurrent()>data)  
      {
       Print("Демонстрационный период закончился, покупайте индикатор :)");
       Alert("Демонстрационный период закончился, покупайте индикатор :)");
       return(INIT_FAILED);
     } 
  
  
  if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
    Comment("Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)");
    return(0);
}    
     
Arquivos anexados:
 

Olá!

Eu queria colocar uma condição no ciclo de fechamento do pedido nodia da abertura, para que os pedidos que fossem abertos na sexta-feira não fossem fechados.

while (OrdersTotal()>0)
    { 
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 
 
Tabazhan_Dajhiov:

Boa tarde. QUE CÓDIGO DEVO ACRESCENTAR PARA QUE O INDICADOR DEIXE DE FUNCIONAR NO TESTADOR APÓS UM MÊS? OU SEJA, EU ESCREVI TUDO OK ! MAS QUANDO EU FAÇO UM BACKTEST FUNCIONA NOVAMENTE. (mgl4)

Você precisa escrever este código não no OnInit, mas no OnTick().

 
Yerkin Sagandykov:

Olá!

Eu queria colocar uma condição no ciclo de fechamento do pedido nodia de abertura do pedido, para que os que fossem abertos na sexta-feira não fossem fechados.

Tente desta forma:

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 

Razão: