Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 485

 
-Aleks-:

Por favor, ajudem-me a compreender!

Preciso de encontrar o levantamento máximo em cada (deixe estar) dia (a escrita no ficheiro acontece uma vez por dia) - terminal MT4.

O levantamento máximo é a distância no gráfico desde o pico até ao levantamento actual dos fundos e o levantamento de fundos é a perda actual.

Escrevi o seguinte código

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Mas é correcto em alguns gráficos e anormal em outros.

Aparentemente cometi um erro no código ou na lógica, mas não consigo descobrir qual deles.

Tanto quanto sei, devemos contar desde o pico da Equidade até ao poço da Equidade, e não do saldo, o que faz com que os drawdowns pareçam muito melhores!

E por favor use o botão SRC, não outro botão qualquer, para que o seu código não seja repetido na resposta, desorganizando o site!

 
Boris:

Tanto quanto sei, é preciso contar desde o pico da Equidade até ao poço da Equidade, não a partir do equilíbrio, o que suaviza realmente o quadro de desenho!

E por favor use o botão SRC, não outro botão qualquer, para que o seu código não seja repetido na resposta, desorganizando o site!

Mudança de saldo para fundos - ainda não se soma com o testador - o valor no testador é maior.ACCOUNT_PROFIT é na verdade um delta entre o saldo e os fundos, talvez seja esse o ponto...Por outro lado, a tarefa é descobrir quanto dinheiro é necessário para a EA trabalhar, e não faz sentido ter em conta o montante máximo de fundos, parece-me...

Não sei o que é o SRC e é por isso que não o utilizo.

 
-Aleks-:

ACCOUNT_PROFIT é na verdade um delta entre o equilíbrio e os fundos, talvez seja só isso... Por outro lado, a tarefa é descobrir quanto dinheiro é necessário para a EA trabalhar, e não faz sentido ter em conta o montante máximo de fundos, parece-me...

Não sei o que é o SRC e é por isso que não o utilizo.

Esse botão à esquerda da câmara de vídeo (ver acima) é para inserção de código!

Sobre a equidade! Se substituir saldo por Equidade, deve excluirACCOUNT_PROFIT, porque Equidade = saldo + lucro. No entanto, no terminal vemos sempre a equidade a mudar e os relatórios de teste fixam a equidade e os drawdowns em posições próximas, pelo que os drawdowns provisórios não são fixados pelo testador. Como resultado, a situação do mercado é melhor no testador do que na realidade. Recentemente tenho estado a imprimir no testador, em demonstração e real toda a informação que preciso para cada acção de um EA, abertura, modificação, encerramento, etc., a fim de evitar tretas, que não posso tolerar nem de mim próprio nem dos outros! Mas provavelmente já reparou nisso. ;)

 

Boa noite, poderia dizer-me, por favor, sobre a classe CTrailingFixedPips da biblioteca padrão, qual é o significado de "trailing" TakeProfit nível? Nunca será alcançado, pois não? Ou não compreendo alguma coisa, ou o código ou o significado.

A partir da documentação:

"Se a indentação do preço for superior ao nível Stop Loss, é sugerido um novo preço Stop Loss da posição.Se a condição de modificação de Stop Loss for cumprida e o nível de Take Profit não for zero, sugere-se que se estabeleça um novo preço Take Profit para a posição."

<Expert\Trailing\CTrailingFixedPips.mqh>

//+------------------------------------------------------------------+
//| Checking trailing stop and/or profit for long position.          |
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
...
...   
   delta=m_stop_level*m_adjusted_point;
   if(price-base>delta)
     {
      sl=price-delta;
      if(m_profit_level!=0) tp=price+m_profit_level*m_adjusted_point;
     }
...
  }
 
Hexen:

Boa noite, poderia dizer-me, por favor, sobre a classe CTrailingFixedPips da biblioteca padrão, qual é o significado de "trailing" TakeProfit nível? Nunca será alcançado, pois não? Ou não compreendo alguma coisa, ou o código ou o significado.

A partir da documentação:

"Se a indentação do preço for superior ao nível Stop Loss, é sugerido um novo preço Stop Loss da posição.Se a condição de modificação de Stop Loss for cumprida e o nível de Take Profit não for zero,sugere-se que se estabeleça um novo preço Take Profit para a posição."

<Expert\Trailing\CTrailingFixedPips.mqh>

Isto é muito provavelmente um erro de impressão. Deve ser Stop Loss.
 
Hexen:

Boa noite, poderia dizer-me, por favor, sobre a classe CTrailingFixedPips da biblioteca padrão, qual é o significado de "trailing" TakeProfit nível? Nunca será alcançado, pois não? Ou não compreendo alguma coisa, ou o código ou o significado.

A partir da documentação:

"Se a indentação do preço for superior ao nível Stop Loss, é sugerido um novo preço Stop Loss da posição.Se a condição de modificação de Stop Loss for cumprida e o nível de Take Profit não for zero, sugere-se que se estabeleça um novo preço Take Profit para a posição."

<Expert\Trailing\CTrailingFixedPips.mqh>

A julgar pelo código acima, TP move-se em sincronia com SL. Parafusar uma parada de reboque deste tipo)
 
Boris:

Este botão à esquerda da câmara de vídeo (ver acima) destina-se à inserção de código!

Há um estilo "Código" para código - é seleccionado a partir do menu - é o que eu uso.

Boris:

Sobre a equidade! Se substituir saldo por Equidade, deve excluirACCOUNT_PROFIT, porque Equidade = saldo + lucro. No entanto, no terminal vemos sempre a equidade a mudar e os relatórios de teste fixam a equidade e os drawdowns em posições próximas, pelo que os drawdowns provisórios não são fixados pelo testador. Como resultado, a situação do mercado é mais atractiva no testador do que na realidade. Recentemente tenho estado a imprimir no testador, em demonstração e real toda a informação que preciso para cada acção de um EA, abertura, modificação, encerramento, etc., a fim de evitar tretas, que não posso tolerar nem de mim próprio nem dos outros! Mas provavelmente já reparou nisso. ;)

Se a fixação de saque no testador do relatório estivesse apenas no fechamento da posição, não haveria saque quando se utilizasse uma ordem no mercado, o que não é o caso ;)

ACCOUNT_PROFIT = Saldo de fundos, por isso não vejo razão para não utilizar este indicador nos cálculos...

 
-Aleks-:

Por favor, ajudem-me a compreender!

Preciso de encontrar o levantamento máximo em cada (deixe estar) dia (a escrita no ficheiro acontece uma vez por dia) - terminal MT4.

O levantamento máximo é a distância no gráfico desde o pico até ao levantamento actual dos fundos e o levantamento de fundos é a perda actual.

Escrevi o seguinte código

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew== AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Mas aparece correctamente em alguns gráficos e não em outros. Ao mesmo tempo, os gráficos são visualmente os mesmos.

Aparentemente, cometi um erro no código ou lógica, mas não consigo perceber de que tipo.

Encontrei um erro no código - um sinal extra de igualdade deve ser

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

No entanto, mesmo isso não me levou muito mais perto de resolver a causa da diferença entre o cálculo poético e o resultado no testador.

Verifiquei a teoria de Boris com cálculos de equidade e o resultado também foi negativo.

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

A propósito, não é claro como a equidade e o equilíbrio estão dessincronizados no gráfico do testador quando apenas um lote é negociado.

 
-Aleks-:

Encontrei um erro no código - um sinal extra de igualdade deve ser assim

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

No entanto, mesmo isto não me levou mais perto de resolver a razão da diferença entre as acções calculadas e o resultado no testador.

Verifiquei a teoria de Boris com cálculos de equidade e o resultado também foi negativo.

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

A propósito, não é claro como a equidade e o equilíbrio estão dessincronizados no testador no gráfico se apenas um lote for comercializado.

Para compreender "como a equidade e o equilíbrio estão dessincronizados", precisamos de compreender o que é o equilíbrio e o que é a equidade.

Saldo - o montante de capital próprio na conta.

Equidade - a quantia corrente e variável de dinheiro na conta.

A mesma função está presente no seu testador, fixa o sorteio, mas não da forma que deseja.

Resumindo, a fim de calcular o levantamento máximo, é necessário declarar a variável estática ou global para armazenar o valor, e depois reescrever esta variável, tal como no seu código.

Isto é o que escreveu agora...

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

É preciso fazer duas variáveis max e min e escrever valores nelas.

E aqui está um pensamento em voz alta: É melhor escrever no ficheiro não para o dia, mas ao fechar a ordem e reescrever as variáveis. Nesse momento a equidade é igual a equilíbrio e devemos zerar a variável onde se escreve o máximo e o mínimo.

 
Alexey Viktorov:

Para compreender "como a equidade e o equilíbrio estão dessincronizados" é necessário compreender o que é um equilíbrio e o que é a equidade.

O saldo é o montante fixo de fundos na conta.

Equidade - a quantia corrente e variável de dinheiro na conta.

A mesma função está presente no testador que está a escrever agora e fixa o sorteio, mas não da forma que deseja.

Resumindo, a fim de calcular o levantamento máximo, é necessário declarar a variável estática ou global para armazenar o valor, e depois reescrever esta variável, tal como no seu código.

É o que escreveu agora...

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

É preciso fazer duas variáveis max e min e escrever valores nelas.

E aqui está um pensamento em voz alta: É melhor escrever no ficheiro não para o dia, mas ao fechar a ordem e reescrever as variáveis. Nesse momento a equidade é igual a equilíbrio e devemos zerar a variável onde se escreve o máximo e o mínimo.

Obrigado por responder ao pedido de ajuda!

A variável global é relevante para a actividade real do mercado - preciso de informação de teste, é por isso que não me preocupei com ela.

O que é equidade e equilíbrio - claro que sei, mas não consegui calcular o levantamento. As minhas amostras de código mostram que tentei tomar tanto o equilíbrio e os fundos como um máximo e o equilíbrio e os fundos como um mínimo.

Porque pensa que a desigualdadese (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax; nunca é satisfeita? Só não é cumprido na barra quando o novo saldo máximo é atingido (ou equidade - ainda não é verdade), mas nesse momento eu fixo o levantamento de lucrosProfitMin=ProfitNew.

O registo do ficheiro do dia é mais relevante uma vez que o levantamento máximo não é normalmente atingido no momento do encerramento de uma encomenda e o objectivo é calcular a quantidade média de dinheiro necessária para o trabalho do Consultor Especialista.