Fehler, Irrtümer, Fragen - Seite 214

 
Ashes:

Ich möchte Sie daran erinnern, dass das Ergebnis mit einem einfachen Expert Advisor erzielt wurde, der praktisch keine Zeit für die Analyse aufwendet und keine Indikatoren verwendet, d.h. die Ergebnisse wären mit einem funktionierenden EA noch trauriger gewesen.

Bitte posten Sie den Code des EA.
 
Ashes:

Ich möchte Sie daran erinnern, dass das Ergebnis mit einem einfachen Expert Advisor erzielt wurde, der praktisch keine Zeit für die Analyse aufwendet und keine Indikatoren verwendet, d.h. die Ergebnisse wären mit einem funktionierenden EA noch trauriger gewesen.

Zum Vergleich:

Die Durchführung dieses Tests mit 10000 Trades auf einem Windows 7 Rechner, Intel Pentium Dual-Core E5400 @ 2.70 GHz, 2038 MB (PR111) dauerte 472866ms.

In Anbetracht der obigen Ausführungen besteht eine gewisse Wahrscheinlichkeit, dass einige der Kandidaten für die Meisterschaft 2010 aufgrund der 15-Minuten-Hürde und der Besonderheiten des Testers (wenn es viele Angebote gab) zu Unrecht disqualifiziert wurden.

** - Es kam mehrmals vor, dass das Testgerät den Symboldiagramm mit den am Ende des Tests angezeigten Geschäften nicht anzeigen konnte.

Ich war nicht in der Lage, einen "einfachen EA" zu schreiben, der solche Ergebnisse zeigen würde. Hier ist mein Code:

//+------------------------------------------------------------------+
//|                                                  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));
  }
//+------------------------------------------------------------------+


Hier sind die Optimierungsergebnisse, die Spalte Ergebnis zeigt die Laufzeit in Millisekunden.


 
Rosh:

Es ist mir nicht gelungen, einen "einfachen EA" zu schreiben, der diese Ergebnisse zeigt. Hier ist mein Code:

Hier sind die Optimierungsergebnisse, die Spalte Ergebnis zeigt die Laufzeit in Millisekunden.

Interessant...

Alexander:
EA-Code bitte posten Sie den Code.

Der Expert Advisor basiert auf der Vorlage aus dem Artikel How to quickly write an Expert Advisor for the Automated Trading Championship 2010.

Die Klasse CExpertAdvisor wird ohne Änderungen verwendet. Vielleicht ist dies ein Nebeneffekt der Verwendung von Klassen? Die Testergebnisse vermitteln den Eindruck, dass die Verlangsamung nach Überschreiten eines bestimmten Schwellenwerts einsetzt. Vielleicht handelt es sich um eine Transaktionstabelle mit einer begrenzten Größe, nach der die Neuzuweisung von Speicherplatz bzw. die Müllsammlung wirksam wird?

PS. Ich möchte Sie noch einmal daran erinnern, dass der Expert Advisor die Funktion des Alpari-Demokontos (Null Margin) nutzt, da sich sonst die Anzahl der Trades ändern kann.

Dateien:
 
Rosh:

Es ist mir nicht gelungen, einen "einfachen EA" zu schreiben, der diese Ergebnisse zeigt. Hier ist mein Code:

Hier sind die Optimierungsergebnisse, die Spalte Ergebnis zeigt die Laufzeit in Millisekunden.

Auch kein Problem mit der Ausgabe in XLSX?

 
Rosh:

Es ist mir nicht gelungen, einen "einfachen EA" zu schreiben, der diese Ergebnisse zeigt. Hier ist mein Code:

Hier sind die Optimierungsergebnisse, die Spalte Ergebnis zeigt die Laufzeit in Millisekunden.

Tabelle - Ergebnis des Optimierers: Protokollierung AUS? Ein Nebeneffekt des Protokollierens?

 
Ashes:


Ein EA basierend auf der Vorlage aus dem Artikel How to write a quick EA for the Automated Trading Championship 2010.

Die Klasse CExpertAdvisor wird ohne Änderungen verwendet. Vielleicht ist dies ein Nebeneffekt der Verwendung von Klassen? Die Testergebnisse vermitteln den Eindruck, dass die Verlangsamung nach Überschreiten eines bestimmten Schwellenwerts einsetzt. Vielleicht handelt es sich um eine Transaktionstabelle mit begrenzter Größe, nach der die Neuzuweisung des Speichers bzw. die Müllsammlung wirksam wird?

PS. Ich möchte Sie noch einmal daran erinnern, dass der Expert Advisor eine Funktion des Alpari-Demokontos nutzt (Null Margin), da sich sonst die Anzahl der Trades ändern kann.

Diese Klasse enthält die Methode 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);
  }

die bei jedem Geschäft aufgerufen wird. Dementsprechend wird jedes Mal die gesamte Historie der Abschlüsse überprüft, und die Prüfzeit verlangsamt sich proportional zum Quadrat der Anzahl der Abschlüsse.

Solche Dinge sollten besser nicht in einem Expert Advisor verwendet werden, der optimiert oder getestet werden muss, da die Zeitverluste unvermeidlich sind. In diesen Fällen ist es besser, diese Aufrufe algorithmisch zu ersetzen.

 
Rosh:

Diese Klasse enthält die Methode GetDealByOrder(ulong order)

die bei jeder Transaktion aufgerufen wird. Dementsprechend wird jedes Mal die gesamte Historie der Abschlüsse durchsucht, und die Testzeit verlangsamt sich proportional zum Quadrat der Anzahl der Abschlüsse.

Sie sollten solche Dinge besser nicht in dem zu optimierenden oder zu testenden Expert Advisor verwenden, da Zeitverluste unvermeidlich sind. In diesen Fällen ist es besser, diese Aufrufe algorithmisch zu ersetzen.

D.h. jeder, der die Vorlage des Expert Advisors verwendet hat, ist "betroffen"...

Was ist mit XLSX? Das hat nichts mit dem Code des Expert Advisors zu tun, oder?

 
Rosh:

Diese Klasse enthält die Methode 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);
  } 

die bei jeder Transaktion aufgerufen wird. Dementsprechend wird in diesem Expert Advisor unter den genannten Bedingungen jedes Mal die gesamte Historie der Transaktionen durchsucht, und die Testzeit, die proportional zum Quadrat der Anzahl der Transaktionen ist, verlangsamt sich.

Solche Dinge sollten besser nicht in einem Expert Advisor verwendet werden, der optimiert oder getestet werden muss, da Zeitverluste unvermeidlich sind. In diesen Fällen ist es besser, diese Aufrufe algorithmisch zu ersetzen.

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

Wird bei dieser Methode der gesamte Verlauf durchsucht und nicht nur der Teil des Verlaufs, der mit einer offenen Position verbunden ist? Wenn nicht mehr als 5 Geschäfte mit einer offenen Position verbunden sind, ist es meiner Meinung nach besser, HistorySelectByPosition zu verwenden , als die gesamte Historie HistorySelect(0,TimeCurrent()) zu durchsuchen;

P.S. CExpertAdvisor hat nicht nachgesehen

 
Konstantin83:

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

Wird mit dieser Methode die gesamte Geschichte durchsucht und nicht nur der Teil der Geschichte, der mit einer offenen Position verbunden ist? Wenn nicht mehr als 5 Geschäfte mit einer offenen Position verbunden sind, ist es meiner Meinung nach besser, HistorySelectByPosition zu verwenden , als die gesamte Historie HistorySelect(0,TimeCurrent()) zu durchsuchen;

P.S. CExpertAdvisor hat nicht nachgesehen

In diesem Fall haben wir Tausende von Geschäften in einer Position, die alle denselben Positionsbezeichner POSITION_IDENTIFIER haben. Daher ist der Aufruf von HistorySelectByPosition in diesem Fall äquivalent zum Aufruf vonHistorySelect(0,TimeCurrent()), die Aufzählung dieser Geschäfte führt zu einer Suche nach allen Geschäften aus der Historie.

Angenommen , es wurde ein unglückliches Beispiel für die Verwendung des Musters aus dem Artikel gemacht. Es ist wie in der Geschichte über sibirische Männer und japanische Kettensägen.

 
Ashes:

Was ist mit XLSX? Es hat nichts mit dem EA-Code zu tun?

Dieser Ort wird repariert werden. Die Entwickler sind sich dessen bewusst, vielen Dank.