Errori, bug, domande - pagina 214

 
Ashes:

Vi ricordo che il risultato è stato ottenuto con un semplice Expert Advisor, che praticamente non dedica tempo a nessuna analisi e non usa indicatori, cioè i risultati sarebbero stati ancora più tristi con un EA funzionante.

Si prega di postare il codice dell'EA.
 
Ashes:

Vi ricordo che il risultato è stato ottenuto con un semplice Expert Advisor, che praticamente non dedica tempo a nessuna analisi e non usa indicatori, cioè i risultati sarebbero stati ancora più tristi con un EA funzionante.

Per il confronto:

L'esecuzione di questo test con 10000 scambi su una macchina Windows 7, Intel Pentium Dual-Core E5400 @ 2.70 GHz, 2038 MB (PR111) ha richiesto 472866ms.

Alla luce di quanto sopra, c'è una certa probabilità che alcuni dei candidati per il Campionato 2010 potrebbero essere stati ingiustamente squalificati a causa della barriera dei 15 minuti e delle peculiarità del tester (se ci fossero molti accordi).

** - ci sono state diverse volte in cui il tester non è riuscito a visualizzare il grafico dei simboli con i trade visualizzati alla fine del test.

Non sono stato in grado di scrivere un "semplice EA" che mostrasse tali risultati. Ecco il mio codice:

//+------------------------------------------------------------------+
//|                                                  TimeOnDeals.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      deals=1000;
input double   lot=0.01;
uint start;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   start=GetTickCount();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   PrintFormat("deals=%d  time=%d",deals,(GetTickCount()-start));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
   return(GetTickCount()-start);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int done_deals=0;
//---
   if(done_deals<deals)
     {
      if(Buy(lot)) done_deals++;
      else Print("Не удалось выполнить Buy, ошибка ",GetLastError());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Buy(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_BUY;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool Sell(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_SELL;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));
  }
//+------------------------------------------------------------------+


Ecco i risultati dell'ottimizzazione, la colonna Risultato mostra il tempo di esecuzione in millisecondi.


 
Rosh:

Non sono stato in grado di scrivere un "semplice EA" che mostri questi risultati. Ecco il mio codice:

Ecco i risultati dell'ottimizzazione, la colonna Risultato mostra il tempo di esecuzione in millisecondi.

Interessante...

Alexander:
Il codice EA si prega di pubblicare.

L'Expert Advisor è basato sul modello dell'articolo Come scrivere rapidamente un Expert Advisor per l'Automated Trading Championship 2010.

La classe CExpertAdvisor viene utilizzata senza alcuna modifica. Forse questo è un effetto collaterale dell'uso delle classi? I risultati del test danno l'impressione che il rallentamento inizi dopo il superamento di una certa soglia. Forse è una tabella delle transazioni di una dimensione limitata, dopo la quale la riallocazione della memoria / raccolta dei rifiuti inizia ad avere effetto?

PS. Ancora una volta vorrei ricordarvi che l'Expert Advisor utilizza la funzione del conto Alpari-Demo (margine zero), altrimenti il numero di trade potrebbe cambiare.

File:
 
Rosh:

Non sono stato in grado di scrivere un "semplice EA" che mostri questi risultati. Ecco il mio codice:

Ecco i risultati dell'ottimizzazione, la colonna Risultato mostra il tempo di esecuzione in millisecondi.

Nessun problema nemmeno con l'output in XLSX?

 
Rosh:

Non sono stato in grado di scrivere un "semplice EA" che mostri questi risultati. Ecco il mio codice:

Ecco i risultati dell'ottimizzazione, la colonna Risultato mostra il tempo di esecuzione in millisecondi.

Tabella - Risultato dell'ottimizzatore: Registrazione OFF? Un effetto collaterale della registrazione?

 
Ashes:


Un EA basato sul modello dell'articolo Come scrivere un EA veloce per l'Automated Trading Championship 2010.

La classe CExpertAdvisor viene utilizzata senza alcuna modifica. Forse questo è un effetto collaterale dell'uso delle classi? I risultati del test danno l'impressione che il rallentamento inizi dopo il superamento di una certa soglia. Forse è una tabella delle transazioni di una dimensione limitata, dopo la quale la riallocazione della memoria / raccolta dei rifiuti inizia ad avere effetto?

PS. Ancora una volta vorrei ricordarvi che l'Expert Advisor utilizza una caratteristica del conto Alpari-Demo (margine zero), altrimenti il numero di trade potrebbe cambiare.

Questa classe contiene il metodo GetDealByOrder(ulong order)

ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки 
     }
   return(0);
  }

che viene chiamato in ogni scambio. Di conseguenza, ogni volta viene rivista l'intera storia degli scambi e c'è un rallentamento del tempo di prova che è proporzionale al quadrato del numero di scambi.

Queste cose è meglio non usarle in un Expert Advisor che deve essere ottimizzato o testato, perché le perdite di tempo sono inevitabili. È meglio sostituire queste chiamate in modo algoritmico per questi casi.

 
Rosh:

Questa classe contiene il metodo GetDealByOrder(ulong order)

che viene chiamato su ogni transazione. Di conseguenza, ogni volta l'intera storia delle compravendite viene cercata e c'è un rallentamento del tempo di prova, proporzionale al quadrato del numero di compravendite.

È meglio non usare queste cose nell'Expert Advisor che deve essere ottimizzato o testato, perché le perdite di tempo sono inevitabili. È meglio sostituire queste chiamate in modo algoritmico per questi casi.

Cioè, tutti quelli che hanno usato il modello di Expert Advisor sono "colpiti"...

E XLSX? Non ha niente a che fare con il codice dell'Expert Advisor, vero?

 
Rosh:

Questa classe contiene il metodo GetDealByOrder(ulong order)

 ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки
     }
   return(0);
  } 

che viene chiamato ad ogni transazione. Di conseguenza, in questo Expert Advisor in queste condizioni specificate l'intera storia delle transazioni viene cercata ogni volta, e il tempo di prova che è proporzionale al quadrato del numero di transazioni, sta rallentando.

Queste cose è meglio non usarle in un Expert Advisor che deve essere ottimizzato o testato, perché le perdite di tempo sono inevitabili. È meglio sostituire queste chiamate in modo algoritmico per questi casi.

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

Questo metodo cerca in tutta la storia e non solo in quella parte della storia che è associata a una posizione aperta? Se non ho più di 5 operazioni collegate a una posizione aperta, penso che sia meglio usare HistorySelectByPosition piuttosto che cercare nell'intera storia HistorySelect(0,TimeCurrent());

P.S. CExpertAdvisor non ha guardato

 
Konstantin83:

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

Questo metodo cerca in tutta la storia e non solo in quella parte della storia che è collegata a una posizione aperta? Se non ho più di 5 operazioni collegate a una posizione aperta, penso che sia meglio usare HistorySelectByPosition piuttosto che cercare nell'intera storia HistorySelect(0,TimeCurrent());

P.S. CExpertAdvisor non ha guardato

In questo caso, abbiamo migliaia di affari in una posizione, e tutti hanno lo stesso identificatore di posizione POSITION_IDENTIFIER. Quindi, la chiamata di HistorySelectByPosition in questo caso è equivalente alla chiamata diHistorySelect(0,TimeCurrent()), l'enumerazione di questi affari porta a una ricerca di tutti gli affari dalla storia.

Diciamo che è stato fatto un esempio sfortunato di utilizzo del modello dell'articolo. È come nella storia degli uomini siberiani e della motosega giapponese.

 
Ashes:

E XLSX? Il codice EA ha qualcosa a che fare con questo?

Questo posto sarà riparato. Gli sviluppatori ne sono consapevoli, grazie.