L'oscillatore di equità di MQL5 significa - pagina 5

 
joo:

Ecco il codice per leggere da un file:

PerchéFileReadString() ?

Potete usareFileReadArray(), allora non avete bisogno di fare un ciclo.

 
Serj_Che:

PerchéFileReadString()?

Non sarebbe meglio usareFileReadArray(), allora non c'è bisogno di fare un ciclo.

Forse è meglio. Ci sono solo abituato. :)
 

Rosh:
Scrivere i valori di equità in un file. Poi costruisci l'indicatore in base a questi valori. Tuttavia, il file di dati deve essere spostato manualmente perché durante i test i file vengono scritti nella cartella Agent_name/MQL5/Files.

Solo ora mi sono reso conto di quanto sia complicato tutto.

Ma manualmente non è chiaramente la soluzione a questo problema, dato che stiamo parlando di centinaia di test.

E sembrerebbe: all'inizio ci sono dati disponibili, ma - oh, miracolo! - il programma è progettato in modo tale che non c'è la possibilità di salvarli in qualche modo e da qualche parte fino a quando non vengono estratti e usati programmaticamente!

Non sono un programmatore professionista, ma questa situazione è difficile da comprendere.

Enorme documentazione..., vaste possibilità di costruire, sembrerebbe, tutto e tutto..., gestione della memoria, OOP, e qui, in modo fondamentalmente semplice e criticamente necessario (che, spero, ho già spiegato) - uno stallo.

...eppure... Domanda!

Non c'è la possibilità di scrivere in modalità test in alcuni array di programmi forzati e quasi cancellabili, che successivamente potrebbero essere usati per costruire un indicatore?

Compresa la possibilità di passare attraverso una variabile globale un puntatore a tale array?

E qual è il problema della memorizzazione e del trasferimento dei dati tra la fase di test e il momento del lavoro principale, non in termini di implementazione attuale, ma in linea di principio?

Renat ha menzionato centinaia di megabyte di dati, ma, in primo luogo, perché dovremmo sempre ricaricare i dati quando possiamo prevedere tale possibilità solo su esplicito desiderio del programmatore e, in secondo luogo, la quantità di dati in termini del compito in questione è molto più piccola e ammonta a qualche migliaia di cifre.

Ancora una volta dichiaro che dal punto di vista dell'utente, l'opzione di trasferimento manuale dei file durante i test multipli (e il mercato, per la sua complessità, richiede test multipli) è assolutamente scomoda e poco promettente, mentre sono pronto a sostenere con chiunque che la dinamica degli indicatori di conto in diretta correlazione con la dinamica dei prezzi nella storia dei test è una delle più importanti in generale.

Qual è la questione di estendere la visibilità nella modalità principale delle operazioni di apertura dei file in lettura alla cartella dei file del tester? Quale sarebbe anche solo un'ipotetica minaccia in questo?

E qual è il problema di non poter forzare la memorizzazione dei dati richiesti tra la modalità principale e quella di test nella RAM?

 

Usate la dll per scrivere e leggere file da cartelle arbitrarie sul disco. Basta spostare le funzioni di scrittura e lettura dei file nella dll e il gioco è fatto.

 
DV2010:

...eppure... Domanda!

Non c'è la possibilità di scrivere in modalità test in alcuni array di programmi forzati, che successivamente potrebbero essere usati per costruire un indicatore?


Prova a impostare il flag FILE_COMMON all'apertura del file - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Identificatore

Valore

Descrizione

FILE_COMMON

4096

Posizione di un file nella cartella condivisa di tutti i terminali client. Questo flag è usato quando si aprono i file (FileOpen()), si copiano i file (FileCopy(), FileMove()) e si verifica l'esistenza dei file (FileIsExist())

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

Prova a specificare il flag FILE_COMMON quando apri un file - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Esegui questo script e vedi dove scrive

//+------------------------------------------------------------------+
//|                                             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, grazie!

L'opzione della cartella condivisa sembra più... integrato.

L'unica cosa che sorprende è che quando si esegue questo codice, viene visualizzato un messaggio di scrittura non riuscita all'interno dell'indicatore, anche se la scrittura stessa viene ancora eseguita. Inoltre - ancora una questione aperta come e quando esattamente è meglio scrivere i dati (separatamente per ogni tick, ma è dispendioso in termini di risorse, o alla fine - l'intero array, ma con la scrittura dell'array qualcosa non è ancora del tutto chiaro e, inoltre, è difficile capire come OnCalculated funzionerà in questo caso per la sua estrazione - nel secondo, risulta il passaggio già dopo i test?)

E un'altra domanda, un po' fuori tema, ma sulla questione già toccata ieri.

Inserito in OnTick e in OnCalculated:

Print("ObjectsTotal =", ObjectsTotal(ChartID()));
ma dopo il completamento del test, nonostante la presenza di oggetti relativi alle posizioni di apertura e chiusura (frecce e linee - visibili in Terminal: Charts>Objects>Objects List), il valore di ritorno è 0 per qualche motivo.
 

È meglio scrivere sul file il più raramente possibile, quindi è meglio farlo come array di interi. I valori dovrebbero essere misurati non più spesso di una volta al minuto, altrimenti ci saranno problemi con la loro visualizzazione sul grafico (inoltre sarà irragionevolmente impegnativo in termini di risorse). Cioè, alla fine della corsa. Ma è anche possibile:

L'algoritmo emerge come segue:

1) Eseguire l'esperto nel tester.

2) Misurato il valore di interesse.

3) Registrato il valore nel file.

4) Scrivere true in un file separato, il che significa che abbiamo registrato un nuovo valore.

5) Inizia un ciclo infinito, la condizione di uscita è falsa nel file di flag.

6) In un grafico separato lo script legge il file con la bandiera, se c'è un nuovo valore, disegna un rischio sul grafico, scrive falso sul file.


Questo è all'incirca l'aspetto della modalità visiva dei test nel tester.

Aspettate un po', il concorso sarà finito, forse verranno presentate soluzioni più eleganti e belle.

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

joo, Rash, grazie!

L'opzione della cartella condivisa sembra più... integrato.

L'unica cosa sorprendente è che quando si esegue questo codice all'interno dell'indicatore viene visualizzato un messaggio di scrittura fallita, anche se la scrittura stessa viene eseguita.

Non ricevo nessuna di queste uscite. Fate una prova:

//+------------------------------------------------------------------+
//|                                   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:

Non capisco niente di tutto ciò. Dovresti provarlo:

Rosh

Non riesco a capire quale sia la ragione, ma a differenza dei miei indicatori, quando lo avvio con il tuo, ricevo un messaggio:

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

Ora ho fatto un semplice Expert Advisor simile, basato sul tuo codice, che dovrebbe scrivere tutti i valori di Equity nel file (ho cambiato solo l'output di tutti i valori, inclusi i byte zero scritti, reso le variabili globali, e diviso l'apertura e la scrittura del file in OnInit e OnTick), ma anche se nessun errore viene scritto e il file viene creato, i record e il file sono vuoti.

#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