Oscilador de equidade por MQL5 significa - página 2

 
DV2010: mas porque é que um valor de Equidade em mudança não é mostrado no Indicador, embora os valores em mudança (verificados!) sejam escritos na matriz do Indicador?

Nada está aí escrito, o laço não é chamado. Verifique você mesmo.
 

A questão é essa: o laço é chamado em todas as carraças!

Veja por si mesmo! Coloco a saída no corpo do laço de propósito:

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[]){
   for (int i = prev_calculated; i <= rates_total-1; ++i){
      Print("Equity - OnCalculate - Cycle: prev_calculated=",prev_calculated,"   rates_total=",rates_total);
      Print("Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=", AccountInfoDouble(ACCOUNT_EQUITY));
      Values[i] = AccountInfoDouble(ACCOUNT_EQUITY);
   }
   return rates_total;
}

E aqui está o resultado final:

2011.01.20 13:58:56     Core 1  OnTester result 0
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9949.299999999999
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: prev_calculated=6418   rates_total=6419
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionOpen: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #12 buy 0.15 EURUSD at 1.33593 done (based on order #12)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionClose: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #11 buy 0.15 EURUSD at 1.33593 done (based on order #11)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9929.65
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: prev_calculated=6417   rates_total=6418
 
DV2010:

A questão é essa: o laço é chamado em todas as carraças!

Veja por si mesmo! Coloco a saída no corpo do laço de propósito:

E aqui está o resultado final:

O que é que os testes têm a ver com isto? Execute o indicador no gráfico e verá. Só não se esqueça de fazer as minhas edições.
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

A razão para testar aqui é que preciso de ver a mudança de Equidade dentro do período testado na história.

Fiz as vossas correcções, corri o indicador tanto em modo de teste como arrastando-o para um novo gráfico.

O indicador funciona durante todo o período, até às cotações actuais, bem como para qualquer período de tempo (ou o que significa exactamente "verá tudo"?)

No entanto, o valor da Equidade permanece constante, embora a saída para o registo mostre que muda.

( Caso contrário, como podemos saber se o laço está a funcionar ou não, a não ser através da impressão? )

...Só por precaução, aqui está o "esqueleto" do Conselheiro Especialista com indicador anexado:

#property copyright "Copyright 2010, Pavlov Sergei"
#property link      ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;

int Equity1=0;
void OnInit(){
   Equity1 = iCustom(NULL,0,"Equity",
                          5,          // Период
                          0,          // Смещение
                          MODE_SMA,   // Метод рассчета
                          PRICE_CLOSE // считаем по ценам закрытия)
                          );
   Expert1.Init();
}
void OnTick(){
   Expert1.OnTick();
}
void OnDeinit(const int reason){
   Expert1.Deinit();
}
 
DV2010:

A razão para testar aqui é que preciso de ver a mudança de Equidade dentro do período testado na história.

Fiz as vossas correcções, corri o indicador tanto em modo de teste como arrastando-o e largando-o sobre um novo gráfico.

O indicador funciona durante todo o período, até às cotações actuais, bem como para qualquer período de tempo (ou o que significa exactamente "verá tudo"?)

No entanto, o valor da Equidade permanece constante, embora a saída para o registo mostre que muda.

( Caso contrário, como podemos saber se o laço está a funcionar ou não, a não ser através da impressão? )

...Só por precaução, aqui está o "esqueleto" do Conselheiro Especialista com indicador anexado:

Não vale a pena colocar o indicador errado num EA, isso não o tornará melhor. Ainda não marcou a minha opção?
 

Talvez eu esteja enganado, mas não comparam a aparência do indicador no gráfico após a conclusão dos testes com os cálculos feitos durante os testes?

A questão é que os resultados (matrizes de cálculo) do indicador personalizado do testador não são de modo algum transferidos para o gráfico, mas o indicador especificado é simplesmente lançado num novo cálculo no gráfico.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

Execute este indicador num gráfico de minutos (se tiver uma posição aberta) e após 10-15 minutos obterá uma imagem como esta.


Código:

//+------------------------------------------------------------------+
//|                                             Equity_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double Values[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Values,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,100);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(Values,false);
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {


   Print("prev_calculated=",prev_calculated,"   rates_total=",rates_total);
   int limit=prev_calculated;
   if(limit>0) limit--;

//---Блок заполнения Индикатора и журнала сообщений значениями
   for(int i=limit; i<rates_total;++i)
     {
      Values[i]=AccountInfoDouble(ACCOUNT_EQUITY);
     }
   return rates_total;
  }
//+------------------------------------------------------------------+
 

Roche, já lhe perguntei qual é o meu indicador errado, e também lhe escrevi sobre a forma como verifiquei a sua variante. E tentei explicar-lhe o mais detalhadamente possível, enquanto escrevia apenas brevemente sobre "o laço não funciona" e "vai ver por si próprio"...

...Renat, segundo sei, o indicador será exibido no gráfico após a conclusão do teste, com base nos cálculos efectuados durante o teste e no preenchimento do conjunto de indicadores. Mas o que significa que os resultados do testador não são transferidos do testador para um gráfico indicador personalizado?

Então para que precisam e porque é que a linha indicadora desaparece imediatamente, quando eu retiro a atribuição de valores a uma matriz do código (mesmo que seja uma linha horizontal constante, desaparece)?

Pensei que a correspondência entre o conjunto de valores indicadores que são preenchidos na OnCalculated e os valores indicadores no gráfico é inequívoca, caso contrário como é que os valores indicadores podem ser inicializados?

É difícil de compreender... Parece ser uma tarefa trivial, mas tenho-me debatido com ela há vários dias, e é difícil encontrar alguém que possa pelo menos insinuar como pode ser resolvida de forma diferente na história e se é resolvida de todo.

Mais uma vez, como o entendo (corrijam-me se estiver errado, se não se importam).

1.especifico um período de teste no testador e selecciono um Expert Advisor com o meu indicador anexado.

2. Aprimeira chamada OnCalculated é chamada com parâmetros pré_calculados =0 e rates_total = número de tick (bar) correspondente ao início dos testes. Dentro deste período, o valor de equilíbrio permanece ao nível inicial e constante.

Aschamadas subsequentes da OnCalculated by bar dentro do período de teste, ocorrem para cada barra individual, e aqui podemos inicializar um conjunto de valores indicadores com aqueles dados que mudam (por exemplo, duplicar o preço, que, como escrevi, funcionou, mas então porque não inicializar o Equidade com valores que mudam em vez de mudar os preços ?)

E de qualquer forma, é um profissional. Espero que esta simples tarefa seja resolvida, ou que MetaTraderainda não tenha atingido tais "alturas"? :)))

Ofereci a minha solução simples para este problema, mas ela recusa-se a trabalhar.

Então como pode ser implementado - um gráfico de equidade abaixo do gráfico de preços com base nos resultados dos testes sobre o histórico?

 
Vou dizer-vos uma coisa, não será fácil resolver o vosso problema até que o modo de visualização seja lançado. Existe uma solução: escrever os dados de equidade num ficheiro durante o teste. Em seguida, escrever os dados do ficheiro no buffer de indicadores e traçar o gráfico de equidade.
 

Rosh, a variante para online já foi publicada, mas como alguém que trabalha principalmente com História, preciso de uma variante que funcione com dados históricos. E ainda tenho dificuldade em compreender qual pode ser a principal dificuldade.

O comerciante tem uma ideia sobre o gráfico de balanço online devido a um número menor de negócios (a menos que seja um extracalper que mal tem tempo para pressionar Comprar e Vender).

De facto, a dinâmica da Equidade torna-se crítica numa longa história com centenas ou mesmo milhares de negócios, mas o gráfico no testador não fornece uma simples comparação destas dinâmicas com a dinâmica dos preços em princípio (a menos, claro, que a MetaQuote considere o principal para os programadores como uma eliminação rápida de peritos já preparados sem a análise de séries separadas de posições fracas e fortes).