Erreurs, bugs, questions - page 214

 
Ashes:

Je vous rappelle que le résultat a été obtenu avec un simple Expert Advisor, qui ne consacre pratiquement pas de temps à une quelconque analyse et n'utilise pas d'indicateurs, c'est-à-dire que les résultats auraient été encore plus tristes avec un EA fonctionnel.

Veuillez afficher le code de l'EA.
 
Ashes:

Je vous rappelle que le résultat a été obtenu avec un simple Expert Advisor, qui ne consacre pratiquement pas de temps à une quelconque analyse et n'utilise pas d'indicateurs, c'est-à-dire que les résultats auraient été encore plus tristes avec un EA fonctionnel.

À titre de comparaison :

L'exécution de ce test avec 10000 transactions sur une machine Windows 7, Intel Pentium Dual-Core E5400 @ 2.70 GHz, 2038 MB (PR111) a pris 472866ms.

À la lumière de ce qui précède, il y a une certaine probabilité que certains des candidats au Championnat 2010 aient pu être injustement disqualifiés en raison de la barrière des 15 minutes et des particularités du testeur (s'il y avait beaucoup d'affaires).

** - à plusieurs reprises, le testeur n'a pas réussi à afficher le graphique des symboles avec les transactions affichées à la fin du test.

Je n'ai pas été en mesure d'écrire un "simple EA" qui montrerait de tels résultats. Voici mon 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));
  }
//+------------------------------------------------------------------+


Voici les résultats de l'optimisation, la colonne Résultat indique le temps d'exécution en millisecondes.


 
Rosh:

Je n'ai pas été capable d'écrire un "simple EA" qui montre ces résultats. Voici mon code :

Voici les résultats de l'optimisation, la colonne Résultat indique le temps d'exécution en millisecondes.

Intéressant...

Alexander:
Code EA à publier.

Le Conseiller Expert est basé sur le modèle de l'article Comment écrire rapidement un Conseiller Expert pour le Championnat de Trading Automatisé 2010.

La classe CExpertAdvisor est utilisée sans aucune modification. Peut-être est-ce un effet secondaire de l'utilisation des classes ? Les résultats des tests donnent l'impression que le ralentissement commence après le dépassement d'un certain seuil. Peut-être s'agit-il d'une table de transaction d'une taille limitée, après laquelle la réallocation de la mémoire / le ramassage des déchets commence à faire effet ?

PS. Une fois de plus, je tiens à vous rappeler que l'Expert Advisor utilise la fonctionnalité du compte Alpari-Demo (marge nulle), sinon le nombre de transactions peut changer.

Dossiers :
 
Rosh:

Je n'ai pas été capable d'écrire un "simple EA" qui montre ces résultats. Voici mon code :

Voici les résultats de l'optimisation, la colonne Résultat indique le temps d'exécution en millisecondes.

Pas de problème non plus avec la sortie vers XLSX ?

 
Rosh:

Je n'ai pas été capable d'écrire un "simple EA" qui montre ces résultats. Voici mon code :

Voici les résultats de l'optimisation, la colonne Résultat indique le temps d'exécution en millisecondes.

Tableau - Résultat de l'optimiseur : déconnexion ? Un effet secondaire de l'exploitation forestière ?

 
Ashes:


Un EA basé sur le modèle de l'article Comment écrire un EA rapide pour le championnat de trading automatisé 2010.

La classe CExpertAdvisor est utilisée sans aucune modification. Peut-être est-ce un effet secondaire de l'utilisation des classes ? Les résultats des tests donnent l'impression que le ralentissement commence après le dépassement d'un certain seuil. Peut-être s'agit-il d'une table de transaction d'une taille limitée, après laquelle la réallocation de la mémoire / le ramassage des déchets commence à faire effet ?

PS. Une fois encore, je tiens à vous rappeler que le conseiller expert utilise une fonctionnalité du compte Alpari-Demo (marge nulle), sinon le nombre de transactions peut changer.

Cette classe contient la méthode 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);
  }

qui est appelé à chaque transaction. Ainsi, à chaque fois, l'ensemble de l'historique des transactions est examiné et l'on constate un ralentissement du temps de test qui est proportionnel au carré du nombre de transactions.

Il est préférable de ne pas utiliser de telles choses dans un conseiller expert qui doit être optimisé ou testé, car les pertes de temps sont inévitables. Il est préférable de remplacer ces appels de manière algorithmique pour ces cas.

 
Rosh:

Cette classe contient la méthode GetDealByOrder(ulong order)

qui est appelé à chaque transaction. En conséquence, à chaque fois, l'ensemble de l'historique des transactions est recherché et il y a un ralentissement du temps de test, proportionnel au carré du nombre de transactions.

Il vaut mieux ne pas utiliser de telles choses dans le conseiller expert qui doit être optimisé ou testé, car les pertes de temps sont inévitables. Il est préférable de remplacer ces appels de manière algorithmique pour ces cas.

C'est-à-dire que tous ceux qui ont utilisé le modèle du conseiller expert sont "affectés"...

Qu'en est-il de XLSX ? Cela n'a rien à voir avec le code du conseiller expert, n'est-ce pas ?

 
Rosh:

Cette classe contient la méthode 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);
  } 

qui est appelé à chaque transaction. Par conséquent, dans ce conseiller expert, dans ces conditions spécifiées, l'historique complet des transactions est recherché à chaque fois, et le temps de test qui est proportionnel au carré du nombre de transactions, est ralenti.

Il est préférable de ne pas utiliser ces éléments dans un conseiller expert qui doit être optimisé ou testé, car les pertes de temps sont inévitables. Il est préférable de remplacer ces appels de manière algorithmique pour ces cas.

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)) ;

Cette méthode permet-elle de rechercher dans l'ensemble de l'historique, et pas seulement dans la partie de l'historique associée à un poste ouvert? Si je n'ai pas plus de 5 transactions liées à une position ouverte, je pense qu'il est préférable d'utiliser HistorySelectByPosition plutôt que de parcourir l'historique complet HistorySelect(0,TimeCurrent());

P.S. CExpertAdvisor n'a pas regardé

 
Konstantin83:

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)) ;

Cette méthode permet-elle d'examiner l'ensemble de l'histoire, et pas seulement la partie de l'histoire qui est liée à une position ouverte ? Si je n'ai pas plus de 5 transactions liées à une position ouverte, je pense qu'il est préférable d'utiliser HistorySelectByPosition plutôt que de parcourir l'historique complet HistorySelect(0,TimeCurrent());

P.S. CExpertAdvisor n'a pas regardé

Dans ce cas, nous avons des milliers de transactions dans une position, et elles ont toutes le même identifiant de position POSITION_IDENTIFIER. Par conséquent, l'appel de HistorySelectByPosition dans ce cas est équivalent à l'appel deHistorySelect(0,TimeCurrent()), l'énumération de ces transactions conduit à une recherche de toutes les transactions de l'historique.

Disons qu 'un exemple malheureux d'utilisation du modèle de l'article a été fait. C'est comme dans l'histoire des hommes sibériens et des tronçonneuses japonaises.

 
Ashes:

Qu'en est-il de XLSX ? Le code EA a-t-il quelque chose à voir avec cela ?

Cet endroit va être réparé. Les développeurs en sont conscients, merci.