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

 
Northwest:

1. Coloque tudo de volta, não torture o computador .

Sinto muito, mas não se pode fazer isso, o indicador tem que contar da esquerda para a direita.

Não estou incomodando, estou usando-o para o fim a que se destina.

2.iBandsOnArray, iStdDevOnArray calculado usando dados armazenados na matriz

Sim, eles são calculados usando dados da matriz bbMacd[], então o que segue?

3. a matriz é preenchida em um loop.

Em um ou no primeiro?

Você está dizendo que, para preencher uma matriz, você precisa de um loop pessoal, no qual essa matriz seja preenchida

está cheia e nenhuma outra operação pode ser realizada?


É importante para mim descobrir por que o indicador abranda e como calcular os lugares onde ele acontece.

Tenho mais perguntas, mas não tenho respostas.

Infelizmente, você não ofereceu nenhuma pista.

Se algo é construído usando uma matriz, ele deve ser construído usando uma matriz já existente. Este é um ciclo de preparação de matriz e o segundo ciclo de desenho de um indicador por esta matriz. Este é um caso geral. Há alguns casos mais específicos, mas devem ser considerados separadamente - por exemplo, podemos criar funções, que retornam valores a partir de apenas uma barra calculada:

//+------------------------------------------------------------------+
//| BandsOnArray                                                     |
//+------------------------------------------------------------------+
double BandsOnArray(const int rates_total,const int index,const int period,const double deviation_bb,const double &array[],const int line,const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
   //--- calculate StdDev
   double dev=StdDevOnArray(rates_total,index,period,array);
   //--- base line
   double mid=0;              
   for(int i=0; i<period; i++)
      mid+=array[index+i];    
   mid/=period;               
   //--- upper line
   double top=mid+dev*deviation_bb;
   //--- lower line
   double btm=mid-dev*deviation_bb;
   return(line==UPPER_BAND ? top : line==LOWER_BAND ? btm : mid);
  }  
//+------------------------------------------------------------------+
//| StdDevOnArray                                                    |
//+------------------------------------------------------------------+
double StdDevOnArray(const int rates_total,const int index,const int period,const double &array[],const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
//--- calculate value
   double avg=0;              
   for(int i=0; i<period; i++)
      avg+=array[index+i];    
   avg/=period;               
   double sd=0;
   for(int i=0; i<period; i++)
      sd+=(avg-array[index+i])*(avg-array[index+i]);
   return(sqrt(sd/period));
  }  
//+------------------------------------------------------------------+

Mas eles também exigem uma matriz de dados já preparada como entrada, porque StdDevOnArray e BandsOnArray usam o Alisamento simples para o qual os dados preenchidos igual ao valor do Alisamento de período são necessários.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta para iniciantes em MQL4, ajuda e discussão sobre algoritmos e códigos

Artyom Trishkin, 2018.11.18 20:21

PlotIndexSetInteger(0,PLOT_ARROW,140);

Mas você precisa criar um número de amortecedores igual ao número de semanas. E para cada tampão você tem que dar um código de seta de 140 a 149 - 1,2,3,4,5,6,7,8,9,10 - é dez semanas suficientes para um ano? Isso são apenas 70 dias. Ou como você o queria?


É possível anular o SetIndexArrow via case?

Ou pelo menos exibir os números em um histograma?


Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta, ajuda e discussão sobre algoritmos e códigos para iniciantes da MQL4

Artyom Trishkin, 2018.11.18 20:02

O buffer é preenchido com o valor de uma hora. E se a hora for zero, o histograma não será sorteado. Portanto, devemos verificar se a hora é igual a zero (nós a ajustamos para buscar a hora zero nas configurações), e se for igual a zero, devemos inserir 0,1 ao invés do valor da hora (zero) no buffer - para mostrar a coluna do histograma. Isto mostrará um valor 0 ao invés de 0,1 na janela de dados, já que os dígitos indicadores estão definidos para zero.


Vejo isso agora, obrigado.

 
psyman:

O SetIndexArrow pode ser substituído por um caso?

Ou pelo menos exibir os números em um gráfico de barras?



Vejo isso agora, obrigado.

Ela atua sobre todo o buffer de uma só vez.

Você precisa colocar um ícone de um número de semana na barra encontrada, e deve haver o número de semanas em um ano. As setas numéricas estão claramente ausentes em Wingdings.

É possível sair com textos-objetos e marcar as barras com o valor do número da semana, mas definir o ícone para o buffer para 32 - um caractere vazio. O valor estará na barra, mas não será exibido. Então o valor pode ser o número da semana do ano, e no objeto escrever o que você quiser e o objeto será exibido na barra encontrada.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta para iniciantes sobre MQL4, ajuda e discussão sobre algoritmos e códigos

Artyom Trishkin, 2018.11.19 10:50 am

Ela atua sobre todo o buffer de uma só vez.

Você precisa colocar um ícone de número de semana na barra encontrada, e deve haver o número de semanas em um ano. As setas numéricas estão claramente ausentes em Wingdings.

Você pode sair usando textos-objetos e marcar as barras com os valores do número da semana, mas o ícone do buffer para definir 32 - um caractere vazio. O valor estará na barra, mas não será exibido. Então o valor pode ser o número da semana do ano, e no objeto escrever o que você quiser e o objeto será exibido na barra encontrada.


Eu escrevi sobre o dia da semana - Mon, Tue, Wed, não sobre o número. Você só precisa de 5 marcas diferentes na tabela.

 
psyman:

Eu escrevi sobre o dia da semana - Seg, Ter, Quar, não sobre o número. Você só precisa de cinco marcas diferentes na tabela.

Bem, então você precisa de cinco amortecedores, e atribuir um número de flecha diferente a cada um - de 140 a 144.

 
Artyom Trishkin:

Se algo é construído usando uma matriz, deve ser construído usando uma matriz já preparada. E este é um ciclo de preparação da matriz e o segundo ciclo de desenho do indicador por esta matriz. Este é um caso geral. Há alguns casos mais específicos, mas devem ser considerados separadamente - por exemplo, podemos criar funções, que retornam valores a partir de apenas uma barra calculada:

Mas eles também exigem uma matriz de dados já preparada como entrada, porque StdDevOnArray e BandsOnArray usam o Alisamento simples para o qual os dados preenchidos igual ao valor do Alisamento de período são necessários.

Obrigado por esclarecer a situação.
 

olá

Como faço uma janela pop-up com botões para confirmar/cancelar manualmente uma transação?

 
Andrey Sokolov:

olá

Como faço uma janela pop-up com botões para confirmar/cancelar manualmente uma transação?

MessageBox()
 
Artyom Trishkin:
MessageBox()

Obrigado

 

Olá a todos.

Como obter a porcentagem de saque máximo como no testador?

Aqui está o código:

double  MaxPeak,DD, MaxDD, DD2, MaxDD2;
--------------------------------------
--------------------------------------
это вывод:

 SM("Maximal drawdown        : " + DoubleToString(MaxDrawdown_Money(), 2)+ " (" + DoubleToString(MaxDrawdown_Protsent(), 2) +" %)");

-------------------------------------
-------------------------------------

//--------------------Рассчет % относительной просадки----------
double MaxDrawdown_Protsent()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD2 = NormalizeDouble((MaxPeak - AccountEquity())/MaxPeak*100,2);
}
if (MaxDD2< DD2)
{
MaxDD2 = DD2;
}
return (MaxDD2);
}
//---------------------Рассчет суммы максимальной просадки--------
double MaxDrawdown_Money()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD = NormalizeDouble(MaxPeak - AccountEquity(),2);
}
if (MaxDD< DD)
{
MaxDD = DD;
}
return (MaxDD);
}

A quantidade de saque máximo é a mesma que no testador, a porcentagem de saque relativo também é a mesma que no testador.

Como posso obter a porcentagem de saque máximo como no testador ?

Razão: