Oscilador de equidade por MQL5 significa - página 4

 
joo:

Declarar duas arrays Equidade[] e Tempo[] a nível global na EA.

Escrever o valor da equidade e do tempo na matriz apropriada ao testar a EA.

Utilizar um guião para ler o ficheiro no final dos testes e traçar a equidade no gráfico requerido.

Esta é a melhor maneira para os seus objectivos, não compreendo porque precisa de um indicador.

Eh, se eu pudesse compreender clara e precisamente qual é a dificuldade no que já fiz, então seria mais fácil...

( Os valores em mudança no OnCalculated já lá estão, então o que mais é necessário? )

Já pensei em variáveis globais, mas por definição:

datetime  GlobalVariableSet(
   string  name,      // имя
   double  value      // устанавлимое значение
   );

E como escrever uma matriz ou pelo menos uma referência a Valor para poder recuperá-la mais tarde... Pergunta.

Quanto aos objectos, quero combinar duas coisas:

1. as linhas de negócio indicam em função do resultado (vermelho - todas não lucrativas, azul - todas lucrativas)

2. e no Indicador para construir um gráfico de retornos do depósito inicial no fundo.

Caso contrário, quando se utilizam objectos em pequena escala, mesmo os círculos de negócios impedem de ver a dinâmica dos preços (dos quais, a propósito, quero livrar-me, mas mais uma vez, não sei como).

Estou a falar de testar Expert Advisors em grandes prazos, onde exactamente esta combinação de curvas, tal como a entendo agora, dará a ideia mais completa da distribuição de negócios perdidos e lucrativos ao longo da história sem necessidade de comparação tradicional da direcção de abertura com a direcção de movimento para cada negócio.

 

sergey1294:
Даже не знаю как вам объяснить. AccountInfoDouble(ACCOUNT_EQUITY) хранит последнее значение эквити. После тестирования как сказал Ренат индикатор инициилизируется заново и пересчитывается. По этому данные эквити накопленные в буфере индикатора за время прогона стираются.

E isto - sobre apagamento - já está "quente"!

Mas o que impede de escrever estes valores no OnCalculated para outro conjunto de Indicadores estrangeiros e "não apagáveis", para restabelecer então sem procedimentos de escrita e leitura mais complicados e com maiores recursos?

Ou já é uma questão ao nível do sistema (de descarga automática forçada de matrizes, que não consigo contornar)?

Embora tenha lido que tal tipo de recursos (criação e eliminação de variáveis na memória) também pode ser gerido manualmente...

 
DV2010:

Eh, se eu pudesse compreender clara e precisamente qual é a dificuldade no que já fiz, então seria mais fácil pagar a fiança...

( Os valores em mudança no OnCalculated já lá estão, então o que mais é necessário? )

Já pensei em variáveis globais, mas por definição:

E como escrever uma matriz ou pelo menos uma referência a Valor para poder recuperá-la mais tarde... Pergunta.

Quanto aos objectos, quero combinar duas coisas:

1. as linhas de negócio indicam em função do resultado (vermelho - todas não lucrativas, azul - todas lucrativas)

2. e no Indicador para construir um gráfico de retornos do depósito inicial no fundo.

Caso contrário, quando se utilizam objectos em pequena escala, mesmo os círculos de negócios impedem de ver a dinâmica dos preços (dos quais, a propósito, quero livrar-me, mas mais uma vez, não sei como).

No meu caso estou a falar de testar Expert Advisors em grandes prazos, onde exactamente esta combinação de curvas, tal como a entendo agora, dará o quadro mais completo da distribuição de negócios perdidos e lucrativos ao longo da história sem necessidade de comparar a direcção de abertura tradicional com a direcção de movimento para cada negócio.

Referia-me às variáveis globais do programa, não do terminal.

Os objectos podem ser desenhados mesmo num gráfico de 1 minuto para se obter a máxima precisão (frequência). Depois, depois de ler os objectos do gráfico, pode traçar linhas com o indicador (se houver um desejo incrivelmente forte de o fazer com o indicador), pode mesmo introduzir um factor de correcção nas definições do indicador, para que possa ver o capital próprio de qualquer depósito inicial.

Mais uma vez, todas as linhas e diagramas podem também ser construídos por um guião.

 
joo:

Referia-me a variáveis de programa globais, não a variáveis terminais.

Os objectos podem ser traçados mesmo num gráfico de um minuto para máxima precisão (frequência). Depois, ao ler os objectos do gráfico, pode construir linhas usando o indicador. Pode mesmo introduzir o factor de correcção nas definições do indicador, para que possa ver o capital próprio de qualquer depósito inicial.

Relativamente às variáveis globais do programa - tal como o entendo, podem existir variáveis globais no código do Indicador e no código do Expert Advisor.

Uma destas variáveis é um conjunto de valores Indicadores dos quais são apagados após o teste por alguma razão (provavelmente de natureza do sistema).

Mas então compreendo correctamente que é necessário tomar os valores para exibir o histórico da Equidade, seja o histórico de variáveis globais, objectos ou de um ficheiro, em OnCalculated Indicator?

 
DV2010:

Mas então entendo correctamente, que é necessário tomar valores para mostrar o histórico do Equty a partir de variáveis globais, objectos ou de um ficheiro, apenas no OnCalculated Indicator?

Exactamente.
 
joo:
Exactamente.

Será possível utilizar as variáveis globais do programa neste caso?

Porque as variáveis globais do Expert Advisor não serão visíveis no indicador, e então temos de usar as variáveis globais do indicador, que, ao contrário do conjunto de valores do indicador, devem ser "indeléveis" após o trabalho do OnCalculated no modo Expert Advisor?

E outra pergunta, se possível, sobre os objectos do gráfico actual. Tentei descobrir como extrair a lista de objectos que lhe pertencem, mas ainda é difícil de encontrar. Poderia sugerir como fazê-lo de forma programática?

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
DV2010:

E também, se puder, uma pergunta sobre os objectos no calendário actual. Tentei descobrir como extrair a lista de objectos a ela pertencentes, mas ainda é difícil de encontrar. Pode dizer-me como fazê-lo de forma programática?

Utilize a função ObjectosTotal para obter o número de objectos no gráfico

int  ObjectsTotal(
   long  chart_id,     // идентификатор графика
   int   nwin=-1,      // индекс окна
   int   type=-1       // тип объекта     
   );
Obter o ID do gráfico usando ChartID
 

Mais ou menos assim:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2010, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int TradeHistoy=10000;

//Глобальные пременные
double   Equity[];
datetime EquityTime[];
int      cnt;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArrayResize(Equity,TradeHistoy);ArrayInitialize(Equity,0.0);
   ArrayResize(EquityTime,TradeHistoy);ArrayInitialize(Equity,1);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

//Записать накопленные данные в файл
   D_ArrayToCsv("DATA",Equity,TradeHistoy,";");
   D_ArrayToCsv("TIME",Equity,TradeHistoy,";");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

//В нужном месте эксперта проверить значение эквити
//записать эквити и время замера 
   if(cnt<TradeHistoy)
     {
      Equity[cnt]=AccountInfoDouble(ACCOUNT_EQUITY);
      EquityTime[cnt]=TimeTradeServer();
     }

  }
//+------------------------------------------------------------------+

void D_ArrayToCsv(string filename,double &mass[],int line,string Separator)
  {
// запись массива в файл
   string str;
   int handle=FileOpen(filename,FILE_CSV|FILE_WRITE,Separator);
//Цикл записи строчек в файл
   for(int l=0;l<line;l++)
     {
      str=DoubleToString(mass[l],8);
      FileWrite(handle,str);
     }
   FileClose(handle);
  }
//+------------------------------------------------------------------+
Depois pode fazer o que quiser com os ficheiros que criou.
 

Obrigado, Rosh, pela dica sobre os objectos, penso que posso tratar desta parte da minha tarefa agora.

...Mas com operações de arquivo, que acabei de tentar dominar, é um pouco mais complicado (do que eu na verdade tinha medo!).

: )

Algumas surpresas de uma só vez:

1. Arquivo gravável em laço por alguma razão escreve apenas um valor em vez de vários.

2. Embora a operação FileWriteArrayreceba com sucessoum ponteiro e verifique se a matriz que está a ser passada não está vazia, a

o número de artigos escritos é igual a -1.

3.A documentação diz que durante os testes as operações de abertura são realizadas na pasta de arquivos MQL5\tester, e durante a operação principal - em MQL5/files, e portanto a questão imediatamente surgiu quanto a como o Indicador poderia receber os dados registados durante a fase de teste, durante o trabalho principal (e o caminho para a pasta não é simples e muito provavelmente pode mudar com o tempo - {\i1}agente-127}.0.0.1-3000MQL5\Files )

 
DV2010:


3.A documentação diz que durante a fase de teste as operações de abertura são realizadas na pasta de arquivos MQL5\tester e durante a fase de operação principal - em MQL5/files, e portanto a questão levantada foi a de como o Indicador poderia receber os dados registados durante a fase de teste, durante o trabalho principal (e o caminho para a pasta não é simples e muito provavelmente pode mudar com o tempo - {\i1}agente-1270.0.1-3000MQL5\Files )

Tem de se transferir à mão.

Aqui está o seu código para ler a partir do ficheiro:

void CsvTo1D_Array(string nameFile,double &array[],int line,string Separator)
{
        int end=0;
        int handle=FileOpen(nameFile,FILE_CSV|FILE_READ,Separator);

        if (handle!=1)
        {
                Alert("Файл ",nameFile," не найден!");
        }
        else
        {
                for (int l=0;l<line;l++)
                {
                        array[l]=StringToDouble(FileReadString(handle));
                }
                FileClose(handle);
        }
}
//+------------------------------------------------------------------+