Oscilador de equidade por MQL5 significa - página 5

 
joo:

Aqui está o código a ler a partir de um ficheiro:

PorquêFileReadString() ?

Pode usarFileReadArray(), depois não precisa de fazer um loop.

 
Serj_Che:

PorquêFileReadString() ?

Não seria melhor usarFileReadArray(), então não há necessidade de fazer um loop.

Talvez seja melhor. Estou habituado a isso. :)
 

Rosh:
Escrever valores de equidade num ficheiro. Em seguida, construir indicador por estes valores. Contudo, o ficheiro de dados tem de ser movido manualmente porque durante os testes os ficheiros são escritos na pasta Agent_name/MQL5/Files.

Só agora é que percebi como tudo é complicado.

Mas manualmente não é claramente a solução para esta questão, uma vez que estamos a falar de centenas de testes.

E parece: no início há dados disponíveis, mas - oh, Milagre! - o programa é concebido de tal forma, que não há possibilidade de os salvar de alguma forma e em algum lugar até que sejam extraídos e utilizados de forma programática!

Não sou um programador profissional, mas esta situação é difícil de compreender.

Enorme documentação..., vastas possibilidades de construção, ao que parece, tudo e mais alguma coisa..., gestão da memória, OOP, e aqui, de forma fundamentalmente simples e criticamente necessária (que, espero, já expliquei) - um impasse.

...E no entanto... Pergunta!

Não há possibilidade de escrever em modo de teste em algumas matrizes de programas de seta forçada, que posteriormente poderiam ser utilizadas para a construção de um indicador?

Incluindo a possibilidade de passar através de uma variável global um ponteiro para uma tal matriz?

E qual é o problema do armazenamento e transferência de dados entre a fase de teste e o momento do trabalho principal, não em termos de implementação actual, mas em princípio?

Renat mencionou centenas de megabytes de dados, mas, em primeiro lugar, porque devemos sempre recarregar dados quando podemos prever tal possibilidade apenas a pedido explícito do programador e, em segundo lugar, a quantidade de dados em termos da tarefa em mãos é muito menor e ascende a alguns milhares de dígitos.

Mais uma vez declaro que do ponto de vista de um utilizador, a opção de transferência manual de ficheiros durante testes múltiplos (e o mercado, devido à sua complexidade, requer testes múltiplos) é absolutamente inconveniente e pouco promissor, enquanto que estou pronto a argumentar com qualquer pessoa que a dinâmica dos indicadores de conta na sua correlação directa com a dinâmica dos preços na história dos testes é uma das mais importantes em geral.

Qual é a questão de estender a visibilidade no modo principal de operações de abertura de ficheiros em modo de leitura à pasta dos ficheiros de teste? O que seria mesmo uma ameaça hipotética neste caso?

E qual é a questão de não poder forçar o armazenamento dos dados necessários entre o modo principal e o modo de teste na RAM?

 

Utilize dll para escrever e ler ficheiros a partir de pastas arbitrárias em disco. Basta mover as funções de escrita e leitura do ficheiro para a dll e pronto.

 
DV2010:

...E no entanto... Pergunta!

Não há possibilidade de escrever no modo de teste em algumas matrizes de programas de seta forçada, que subsequentemente poderiam ser usadas para construir um indicador?


Tente colocar a bandeira FILE_COMMON ao abrir o ficheiro - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Identificador

Valor

Descrição

FILE_COMMON

4096

Localização de um ficheiro na pasta partilhada de todos os terminais dos clientes. Esta bandeira é utilizada ao abrir ficheiros (FileOpen()), copiar ficheiros (FileCopy(), FileMove()) e verificar a existência de ficheiros (FileIsExist())

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов - Документация по MQL5
 
Rosh:

Tente especificar a bandeira FILE_COMMON ao abrir um ficheiro - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Execute este guião e veja onde ele escreve

//+------------------------------------------------------------------+
//|                                             Demo_File_Common.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input string   filename="file_common.txt";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }

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

joo, Rash, obrigado!

A opção pasta partilhada parece mais... integrado.

A única coisa que surpreende é que ao executar este código, uma mensagem sobre a escrita mal sucedida é exibida dentro do indicador, embora a escrita em si ainda esteja feita. Mais - ainda uma questão em aberto, como e quando é exactamente melhor escrever os dados (separadamente para cada tick, mas é de recursos intensivos, ou mesmo no final - todo o array, mas com o array a escrever algo ainda não está bem claro e, além disso, é difícil de entender como o OnCalculated irá funcionar neste caso para a sua extracção - no segundo, acontece a passagem já depois dos testes?)

E outra questão, um pouco fora de tópico, mas sobre a questão já abordada ontem.

Inserido em OnTick e em OnCalculated:

Print("ObjectsTotal =", ObjectsTotal(ChartID()));
mas após a conclusão do teste apesar da presença de objectos relacionados com posições de abertura e fecho (setas e linhas - visíveis no Terminal: Gráficos>Objectos>Objectos Lista de Objectos), o valor de retorno é 0 por alguma razão.
 

É melhor escrever para o ficheiro o mais raramente possível, por isso é melhor fazê-lo como uma matriz inteira. Os valores devem ser medidos não mais do que uma vez por minuto, caso contrário, haverá problemas com a sua exibição no gráfico (além disso, será uma utilização excessiva de recursos). Ou seja, no final da corrida. Mas também é possível:

O algoritmo é o seguinte:

1) Dirigir o perito no testador.

2) Medido o valor de interesse.

3) Registado o valor no ficheiro.

4) Escrever fiel a um ficheiro separado, o que significa que registámos um novo valor.

5) Iniciar um loop infinito, a condição de saída é falsa no ficheiro da bandeira.

6) Num gráfico separado, o script lê o ficheiro com a bandeira, se houver um novo valor, desenha um risco no gráfico, escreve em falso no ficheiro.


Este é, grosso modo, o modo visual de teste no testador.

Espere um pouco, o concurso terá terminado, talvez sejam apresentadas soluções mais elegantes e bonitas.

Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
DV2010:

joo, Rash, obrigado!

A opção pasta partilhada parece mais... integrado.

A única coisa surpreendente é que ao executar este código dentro do indicador exibe uma mensagem de escrita falhada, embora a própria escrita seja feita.

Não recebo qualquer resultado desse tipo. Experimente:

//+------------------------------------------------------------------+
//|                                   Demo_File_Common_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red

double buffer[];
input string   filename="file_common.txt";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,buffer,INDICATOR_DATA);

   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }
//---
   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[])
  {
//---

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

Rosh:

Não percebo nada disso. Deve experimentar:

Rosh

Não consigo compreender qual é a razão, mas ao contrário dos meus indicadores, quando começo com os seus, recebo uma mensagem:

2011.01.21 13:52:53     Core 1  2011.01.14 00:00:00   Expert removed because indicator 43 cannot load [4002]

Agora fiz um Expert Advisor simples semelhante, baseado no vosso código, que deve escrever todos os valores de Equidade em ficheiro (alterei apenas a saída de todos os valores, incluindo zero bytes escritos, tornei as variáveis globais, e dividi a abertura e escrita do ficheiro em OnInit e OnTick), mas embora não seja escrito nenhum erro e o ficheiro seja criado, os registos e o ficheiro estão vazios.

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

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;
int handle;
string common_folder;
string filename;

void OnInit(){
   Expert1.Init();
   //--
   filename="equity.txt";
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
}
void OnTick(){
   Expert1.OnTick();
   //---
   if(handle!=INVALID_HANDLE){
      uint written=FileWrite(handle, AccountInfoDouble(ACCOUNT_EQUITY),common_folder);
      PrintFormat("Expert OnTick: Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
   }
   else{
      Print("Expert OnTick: Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
   }  
}
void OnDeinit(const int reason){
   Expert1.Deinit();
   //---
   FileClose(filename);
}

2011.01.21 14:00:46     Core 1  connect closed
2011.01.21 14:00:46     Core 1  log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110121.log" written
2011.01.21 14:00:46     Core 1  EURUSD,H1: 5516 ticks (23 bars) generated within 47 ms (total bars in history 6419, total time 3093 ms)
2011.01.21 14:00:46     Core 1  OnTester result 0
2011.01.21 14:00:46     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.21 14:00:46     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.21 14:00:46     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.21 14:00:46     Core 1  2011.01.14 22:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
2011.01.21 14:00:46     Core 1  2011.01.14 21:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common