Quand est-il judicieux de conserver une partie du code du robot dans un indicateur ? - page 33

 

Un discours zelo utile...

Et connaissant les ressources et le potentiel des participants, je propose de manière provocante de mesurer la vitesse et la "non-glottabilité" des tics :

1) Sovnig

2) script cyclique fonctionnant à une fréquence de 1 milliseconde

3) induite

4) un récepteur DDE tiers.

Pour les adeptes néophytes - comme moi, il sera également utile.

;)

 

A la fin de la nuit :

Dossiers :
experts.zip  1 kb
 

J'aimerais ajouter mon grain de sel :

Les performances des Expert Advisors dont le code d'indicateur est entièrement placé dans l'EA sont souvent environ trois fois plus rapides que celles de leurs homologues qui font appel à des indicateurs personnalisés. Ceci est vrai pour les variantes avec des calculs d'indicateurs très lourds. Si ces calculs sont très légers, il n'y aura aucune différence. L'indicateur EMA a un calcul trop primitif pour l'utiliser pour de telles mesures. Dans certains de mes articles récents sur ce site, j'ai même présenté une variante de l'Expert Advisor avec un indicateur de calcul très lourd du JMA. La version avec le code sans appels d'indicateurs est trois fois plus rapide.

Personnellement, je n'ai aucune envie de prouver quoi que ce soit à qui que ce soit ; je me contente de tirer mes propres conclusions, que j'ai vues de mes propres yeux et pas une seule fois ; même si, bien sûr, je ne fais pas ce genre de choses éternellement, et il se pourrait bien que les dernières builds de MT4 aient donné à cette image un aspect quelque peu différent. Et même dans MT5, au début, c'était absolument pareil. Mais je ne garde pas trace de ces détails et je ne peux donc pas affirmer que c'est la même chose maintenant.

 

GODZILLA:

Dans certains de mes articles récents sur ce site, j'ai même affiché une variante de l'Expert Advisor avec un indicateur de calcul très lourd du JMA. La variante avec le code sans appels de code fonctionne trois fois plus vite.

Ici? La conclusion est simple, il y a 3 possibilités :

1. le code sans appels d'indicateurs est mal écrit, ce qui est peu probable.

2. l'indicateur est rédigé de manière inefficace.

3) Les chiffres indiqués ne reflètent pas la réalité.

 
GODZILLA:

J'aimerais ajouter mon grain de sel :

Les performances des Expert Advisors dont le code d'indicateur est entièrement placé dans l'EA sont souvent environ trois fois plus rapides que celles de leurs homologues qui font appel à des indicateurs personnalisés. Ceci est vrai pour les variantes avec des calculs d'indicateurs très lourds. Si ces calculs sont très légers, il n'y aura aucune différence. L'indicateur EMA a un calcul trop primitif pour l'utiliser pour de telles mesures. Dans certains de mes articles récents sur ce site, j'ai même présenté une variante de l'Expert Advisor avec un indicateur de calcul très lourd du JMA. La variante sans appels d'indicateurs est trois fois plus rapide.

Personnellement, je n'ai aucune envie de prouver quoi que ce soit à qui que ce soit ; je me contente de tirer mes propres conclusions, que j'ai vues de mes propres yeux et pas une seule fois ; même si, bien sûr, je ne fais pas ce genre de choses éternellement, et il se pourrait bien que les dernières builds de MT4 aient donné à cette image un aspect quelque peu différent. Et même dans MT5, au début, c'était absolument pareil. Mais je ne garde pas trace de ces détails et je ne peux donc pas affirmer que c'est la même chose maintenant.


Ne sois pas ridicule. Tu n'as juste pas encore appris à écrire des indicateurs.

Après une telle hérésie :

//---- ЭМУЛЯЦИЯ ИНДИКАТОРНЫХ БУФЕРОВ
  int NewSize = iBars(symbol, timeframe);
  //----  Проверка на смену нулевого бара
  if(ArraySize(Ind_Buffer0) < NewSize)
    {
      //---- Установить прямое направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, false);
      ArraySetAsSeries(Ind_Buffer1, false);
      ArraySetAsSeries(Ind_Buffer2, false);
      //---- Изменить размер эмулируемых индикаторных буферов 
      ArrayResize(Ind_Buffer0, NewSize); 
      ArrayResize(Ind_Buffer1, NewSize); 
      ArrayResize(Ind_Buffer2, NewSize); 
      //---- Установить обратное направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, true);
      ArraySetAsSeries(Ind_Buffer1, true);
      ArraySetAsSeries(Ind_Buffer2, true); 
    } 
//----

vous auriez pu vous abstenir de donner votre avis dans ce fil de discussion.

 

Idée fausse n°1 : vous pouvez vous passer d'IndicatorCounted()

Un indicateur avec lui :

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

extern double Alpha = 0.9;

double EMA[];

int init()
{
   SetIndexBuffer(0, EMA);
   return(0);
}

int start()
{
   int toCount = MathMin(Bars - 1, Bars - IndicatorCounted());
   if (toCount == Bars - 1) EMA[Bars - 1] = Open[Bars - 1];
   for(int i = toCount - 1; i >= 0; i--)
   {
      EMA[i] = (1 - Alpha)*Open[i] + Alpha*EMA[i + 1];
   }
   return(0);
}

Sans elle, sur le principe du hrenfx

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

extern double Alpha = 0.9;

double EMABuffer[];

double GetPrice( int Shift )
{
  return(Open[Shift]);
}

double EMA;

int init()
{
   EMA = GetPrice(Bars - 1);

   SetIndexBuffer(0, EMABuffer);
   return(0);
}

double GetEMA()
{
   static int PrevTime = 0;

   if (PrevTime == Time[0])
      return(EMA);

   int i = iBarShift(Symbol(), Period(), PrevTime) - 1;

   PrevTime = Time[0];
   while (i >= 0)
   {
      EMA = EMA * Alpha + (1 - Alpha) * GetPrice(i);
      EMABuffer[i] = EMA;
      i--;
   }
   return(EMA);
}

void start()
{
  GetEMA();
}

Ensuite, nous appliquons les indices au graphique et émulons la perte de connexion pendant que l'automate fonctionne. Résultat :


 

Oui, j'ai aussi fait quelques recherches sur le sujet. Bien sûr, c'est vraiment une connerie de jouer avec les conneries des développeurs de plateformes, mais peu importe.

Vous avez transformé mon EA en indicateur. Comme vous, j'étais sûr il y a 24 heures que l'indicateur de l'Expert Advisor et l'indicateur de l'EA simple doivent montrer les mêmes résultats, parce que les deux sont déclenchés sur tick. Mais ils sont déclenchés différemment. Le premier tick après l'apparition de la connexion n'est pas le même pour l'EA que pour l'indicateur tiré de l'EA. Vous pouvez le vérifier vous-même.

La capture d'écran ci-dessus montre que l'EA (pas l'indicateur de l'EA) est comparé à iCustom après la rupture de connexion. La rupture de communication s'y passe sans aucun problème.

 

Je suppose que sur le premier tick après une rupture de connexion, l'indicateur ne se déclenche pas immédiatement. Pour être plus exact, l'indicateur attend que la fonction IndicatorCounted() soit exécutée. Mais cette fonction peut être exécutée (en fonction de la connexion) jusqu'à plusieurs secondes. C'est-à-dire, voici le schéma :

  1. Premier tic après un échec de connexion.
  2. L'indicateur a commencé.
  3. IndicatorCounted() est exécuté (il semble que juste après le démarrage de l'indicateur, même si IndicatorCounted() n'est pas présent dans le corps de l'indicateur) pendant un certain temps.
  4. Après avoir reçu le résultat, l'environnement commercial est mis à jour.
  5. Et l'indicateur commence à exécuter son code comme s'il avait été lancé non pas au premier tick, mais au dernier tick avant le résultat de IndicatorCounted().

P.S. Test sur la version 226.

 
Il s'avère que pour la fiabilité absolue des EA "tout en un", nous devons faire un appel de départ de l'indicateur Empty et de RefreshRates() au tout début de la fonction. Cela garantira le chargement de l'historique (après la pause) et l'exécution de l'EA au premier tick, correspondant à l'historique déjà chargé.
 
hrenfx:
Il s'avère que pour la fiabilité absolue des EA "tout en un", nous devons faire un appel de départ de l'indicateur Empty et de RefreshRates() au tout début de la fonction. Cela garantira le chargement de l'historique (après la pause) et l'exécution de l'EA au premier tick, correspondant à l'historique déjà chargé.


Et pouvez-vous afficher les recherches et les contrôles sur cette supposition ?

hmmm... Si c'est le cas et qu'il offre une garantie de chargement, alors c'est une très bonne option.

J'ai vu un fil de discussion sur ForexTools où il n'y avait aucune solution au problème de l'échange de l'historique au moment du démarrage du terminal et du conseiller expert.


Raison: