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

 
Alexey Viktorov:
Ajuste a cor do display para clrNONE.

Então você só pode emitir o buffer, mas não a variável separadamente?

 
psyman:

Então você só pode emitir o buffer, mas não a variável separadamente?

Sim, essa é a única maneira. E mais um truque que pode ser útil, se você definir SetIndexLabel(0, ""); então estes valores não serão exibidos na janela de dados. E mesmo a função iCustom() não estará disponível.
 
Igor Makanu:

Obrigado por responder.

Então o que eu entendo é criar um buffer e depois preenchê-lo com

com valores RSI e depois alimentar este buffer comiMAOnArray().

Alguém já fez isso para a EA e ele será exibido ao testar a EA na sub janela?

Normalmente os testes da EA através do iCustom são lentos.

 

Eu peguei o código do exemplo em https://www.mql5.com/ru/docs/strings/stringadd e o colei no roteiro. O resultado é o mesmo na MQL4 e MQL5:


HE      0       22:42:49.015    Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH      0       22:42:50.187    Test Script (EURUSD,H1) time for 'StringAdd(a,b)' = 1156 milliseconds, i = 1000000
EP      0       22:42:50.781    Test Script (EURUSD,H1) time for 'StringConcatenate(c,a,b)' = 594 milliseconds, i = 1000000


Pensei que StringAdd() e StringConcatenate() deveriam correr mais rápido que "+". Por que não é assim?

 
Northwest:

O iCustom geralmente retarda os testes do Expert Advisor.

não é verdade, geralmente é o contrário, porque a alocação de memória para os buffers do indicador é feita pelo terminal, não pelo script MQL, geralmente estes problemas são o problema de cálculo não otimizado no indicador, muitos novatos em uma chamada do indicador - tick, calcular todo o comprimento dos dados históricos

Se você entendeu o básico da MQL, leia os artigos, está tudo escrito.

https://www.mql5.com/ru/articles/4602


Noroeste:

Quem fez isso para uma EA e ela será exibida ao testar a EA em uma sub janela?

ninguém tem, leia qual é a diferença entre um EA e um indicador, quem tem e quem não tem indicadores, quem tem funções comerciais e quem faz....

ZZY: uma subjanela só pode criar um indicador. Se você criar uma subjanela, então você pode adicionar objetos gráficos a esta subjanela usando o Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object

ZSYZZ: a sub-janela pode ser obtida aplicando um modelo, houve um tópico há alguns meses, mas acho que você tem um problema com outras coisas até agora

Как перенести расчетную часть любого индикатора в код эксперта
Как перенести расчетную часть любого индикатора в код эксперта
  • www.mql5.com
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
 
Igor Makanu:

não é verdade, geralmente é o contrário, porque a alocação de memória para buffers indicadores é feita pelo terminal, não pelo script MQL, geralmente esses problemas são o problema de cálculo não otimizado no indicador, muitos novatos em uma chamada de indicador - tick, eles calculam toda a extensão dos dados históricos

Se você já entendeu o básico da MQL, leia os artigos, já foi escrito há muito tempo.

https://www.mql5.com/ru/articles/4602


ninguém tem, leia qual é a diferença entre um Consultor Especialista e um indicador, quem tem buffers de indicador e quem não tem, quem tem funções comerciais e quem faz ....

ZZY: uma subjanela só pode criar um indicador, se você criar uma subjanela, então você pode adicionar objetos gráficos a esta subjanela usando o Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object

ZSYZZ: a sub-janela pode ser obtida aplicando um modelo, foi um tópico há alguns meses, mas acho que você tem um problema com outra coisa até agora

Desculpe. Talvez eu não tenha dito bem, mas

Não pretendo usá-lo para testes, mas não pretendo executá-lo.

Quanto à visualização na tabela de indicadores durante os testes, se você usar

Quando você usa funções indicadoras em linha, elas são desenhadas no gráfico no processo de teste

É exatamente isso que eu quero dizer.

Mas se você usar algum tipo de código personalizado de cálculo de indicador que está integrado no código da EA, então este indicador

não serão exibidos no processo de teste da EA.

Quanto ao iCustom, quando você o utiliza no processo de teste, a EA será exibida no gráfico

qualquer indicador e o código do indicador pode ser compilado com a EA em um ex4, mas eu não preciso dele.

Só queria saber se existe uma maneira de contornar o iCustom neste assunto, mas se não, também não é um problema.

Muito obrigado pela resposta abrangente.

 

Artem afixou aqui um modelo indicador, aqui está a parte daOnCalculate

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }

Estou usando-o, mas tenho uma pergunta)

Por que eu usolimit=taxas_total-1 para o cálculo do histórico completo enãolimit=taxas_total?

 
psyman:

Por quelimit=rates_total-1 é usado para o cálculo do histórico completo enãolimit=rates_total?

Tente verificá-lo, você estará imediatamente "fora de alcance " - numeração das barras de zero a ... Total -1 , uma situação comum na programação - a numeração começa com 0. Como um exemplo óbvio, declare array duplo x[5] e tente escrever algo no último elemento x[5] = 100;

ZS: respondendo à pergunta que você ainda não fez.... OrderTotal() também números de zero a OrderTotal()-1 ;)

 
Igor Makanu:

ZS: respondendo a uma pergunta que ainda não foi feita.... OrderTotal() muito numerado de zero a OrderTotal()-1 ;)

A propósito, a questão surgiu, agora eu não posso ganhar uma média na matriz, embora o faça em cinco, mas em que tema escrever, eu não sei, que esteja aqui.

O indicador calcula a diferença de abertura e fechamento e constrói МА sobre ela. Eu escolhi MA=2 para depuração mas usando SimpleMAOnBuffer e iMAOnArray eu recebo mudanças de linha inexplicáveis e iMAOnArray mostra valor zero na última barra.


//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <MovingAverages.mqh>

#property indicator_buffers 4
#property indicator_plots   2
//--- plot OC
#property indicator_label1  "OC"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrSteelBlue, clrRed,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "MA1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBrown
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1


//--- indicator buffers
double   OC[], OC_color[], MA1_buf[];
input int MA1=2;

int OnInit()
  {
  
   IndicatorSetString(INDICATOR_SHORTNAME,"t1");
   
   SetIndexBuffer(0,OC,INDICATOR_DATA);
   SetIndexBuffer(1,OC_color,INDICATOR_COLOR_INDEX);
   
   SetIndexBuffer(2, MA1_buf,INDICATOR_DATA); 
   //PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);

     
//--- indicator buffers mapping

   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   //if(limit>1) 
   
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
     limit=rates_total-1;
           // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     
     OC[i]=fmax(open[i],close[i])-fmin(open[i],close[i]);
     if(OC[i]>0.001)
      {   OC_color[i]=1;
      }
      }  
   
 /*  for(int k=limit; k>=0 && !IsStopped(); k--)
     {
   
     MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
     }
*/
      SimpleMAOnBuffer(rates_total,prev_calculated,0,MA1,OC,MA1_buf);

//--- return value of prev_calculated for next call
   return(rates_total);
  }




double iMAOnArray(double &array[],
                      int total,
                      int period,
                      int ma_shift,
                      int ma_method,
                      int shift)
  {
   double buf[],arr[];
   if(total==0) total=ArraySize(array);
   if(total>0 && total<=period) return(0);
   if(shift>total-period-ma_shift) return(0);
   switch(ma_method)
     {
      case MODE_SMA :
        {
         total=ArrayCopy(arr,array,0,shift+ma_shift,period);
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,pos=total-1;
         for(i=1;i<period;i++,pos--)
            sum+=arr[pos];
         while(pos>=0)
           {
            sum+=arr[pos];
            buf[pos]=sum/period;
            sum-=arr[pos+period-1];
            pos--;
           }
         return(buf[0]);
        }
      case MODE_EMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double pr=2.0/(period+1);
         int    pos=total-2;
         while(pos>=0)
           {
            if(pos==total-2) buf[pos+1]=array[pos+1];
            buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_SMMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,k,pos;
         pos=total-period;
         while(pos>=0)
           {
            if(pos==total-period)
              {
               for(i=0,k=pos;i<period;i++,k++)
                 {
                  sum+=array[k];
                  buf[k]=0;
                 }
              }
            else sum=buf[pos+1]*(period-1)+array[pos];
            buf[pos]=sum/period;
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_LWMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0.0,lsum=0.0;
         double price;
         int    i,weight=0,pos=total-1;
         for(i=1;i<=period;i++,pos--)
           {
            price=array[pos];
            sum+=price*i;
            lsum+=price;
            weight+=i;
           }
         pos++;
         i=pos+period;
         while(pos>=0)
           {
            buf[pos]=sum/weight;
            if(pos==0) break;
            pos--;
            i--;
            price=array[pos];
            sum=sum-lsum+price*period;
            lsum-=array[i];
            lsum+=price;
           }
         return(buf[shift+ma_shift]);
        }
      default: return(0);
     }
   return(0);
  }
 
psyman:

Tenho uma pergunta relacionada, ainda estou lutando com a média da matriz, embora o esteja fazendo em 5, mas não sei em que assunto escrevê-la, deixe-a estar aqui.

Tenho a sensação de que na MQL5 os buffers indicadores e as séries temporais estão "desdobrados" da forma oposta, por padrão a barra mais à esquerda na MT5 é a barra 0 e na MT4 a barra mais à direita é a barra 0 e os buffers indicadores têm a mesma numeração

ZS: infelizmente, não quero me envolver com o MT5, o MT4 é suficiente para eu verificar minhas idéias, só olho para os preparativos no MT5, se eu escrever alguma coisa usando o MT5 eu nunca o mostro a ninguém ))))