Les indicateurs standard sont prioritaires !

 
Bonjour !
Veuillez me conseiller sur le problème suivant.
Voici le code de l'Expert Advisor.
int handle ; string filename="test_expert_log.csv" ; int init() { handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';') ; if(handle<1) { Print("Fichier non trouvé, dernière erreur ", GetLastError()) ; return(false) ; } return(0) ; } int start() { double test1,test2,test3 ;
int i ; for (i=1;i<10;i++) { test1=iStochastic("GBPUSD",Period(),5,3,3,3,0,0,0,i) ; //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,0,i) ; if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Write Error !") ; } return(0) ; }


L'Expert Advisor fonctionne sur EURUSD avec une simulation rapide sur les barres formées. Il lit les lectures stochastiques d'une autre paire de devises, générant finalement un rapport de la forme :

2006.10.22 22:00;1;76.79738562
2006.10.20 20:00;2;78.13504823
2006.10.20 16:00;3;78.65853659
2006.10.20 12:00;4;80.50139276
2006.10.20 08:00;5;80.25974026
2006.10.20 04:00;6;86.36363636
2006.10.20 00:00;7;86.96969697
2006.10.19 20:00;8;80
2006.10.19 16:00;9;53.76884422
2006.10.23 00:00;1;65.15151515
2006.10.22 22:00;2;74.83660131
2006.10.20 20:00;3;76.79738562 et 78.13504823 (voir ci-dessus)
2006.10.20 16:00;4;78.13504823 et 78.65853659 (voir ci-dessus) ; etc.
2006.10.20 12:00;5;78.65853659
2006.10.20 08:00;6;80.50139276
2006.10.20 04:00;7;80.25974026
2006.10.20 00:00;8;86.36363636
2006.10.19 20:00;9;86.96969697
2006.10.23 04:00;1;52.85714286
2006.10.23 00:00;2;65.15151515
2006.10.22 22:00;3;74.83660131
2006.10.20 20:00;4;76.79738562
2006.10.20 16:00;5;78.13504823
2006.10.20 12:00;6;78.65853659
2006.10.20 08:00;7;80.50139276
2006.10.20 04:00;8;80.25974026
2006.10.20 00:00;9;86.36363636
2006.10.23 08:00;1;21.83406114
2006.10.23 04:00;2;52.85714286
2006.10.23 00:00;3;65.15151515
2006.10.22 22:00;4;74.83660131
2006.10.20 20:00;5;76.79738562
2006.10.20 16:00;6;78.13504823
2006.10.20 12:00;7;78.65853659
2006.10.20 08:00;8;80.50139276
2006.10.20 04:00;9;80.25974026

il est facile de voir que les valeurs des indicateurs sont différentes sur la même barre lors d'une nouvelle exécution.
Je comprends que l'utilisation pratique de cet EA est douteuse :o) mais le but était de montrer le problème. En pratique, cela ressemble à ceci : dans le terminal, l'indicateur s'affiche correctement, mais lorsque je l'appelle depuis le conseiller expert, il affiche des données erronées. Après avoir éliminé tout ce qui n'influence pas l'indicateur, nous avons obtenu le résultat suivant. Je dois être terriblement stupide mais je ne trouve pas mon erreur.
À propos, si je change la paire de devises pour la paire actuelle, tout est OK.
Je vous remercie d'avance de votre aide.

 
Modifié légèrement deinit()
//+------------------------------------------------------------------+
//|                                         TestSymbolStochastic.mq4 |
//|                                                           satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

int handle;
string filename="test_expert_log.csv";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';');
  if(handle<1)
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double test1,test2,test3;
int i;

  for (i=1;i<10;i++)
      {
       test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i);
       //test2=iStochastic("EURUSD",Period(),5,3,3,0,0,0,i);

       if (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Ошибка записи!");
      }

//----
   return(0);
  }
//+------------------------------------------------------------------+



Cela fonctionne pour moi (mais je n'ai pas vérifié tout le fichier)

 
Shaitan... :о)
Bien sûr, le problème n'est pas de fermer le fichier, car comme je l'ai dit précédemment, j'ai été confronté à différentes valeurs de l'indicateur dans le terminal et lorsqu'il est appelé à partir de l'Expert Advisor. Et puis j'ai dessiné la sortie dans un fichier pour étudier ce "phénomène".
En fait, tout a fonctionné sur mon autre ordinateur, aussi. Cependant, cela n'a pas fonctionné dans l'intervalle.
J'ai trouvé suffisant d'ajouter une paire de devises supplémentaire...
   test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i) ; test2=iStochastic("EURGBP",Period(),5,3,3,0,0,0,i) ;


comment la situation s'est répétée
2006.10.22 22:00;1;74.83660131;19.04761905
2006.10.20 20:00;2;76.79738562;13.91304348
2006.10.20 16:00;3;78.13504823;25.26315789
2006.10.20 12:00;4;78.65853659;48.7804878
2006.10.20 08:00;5;80.50139276;81.57894737
2006.10.20 04:00;6;80.25974026;79.74683544
2006.10.20 00:00;7;86.36363636;74.66666667
2006.10.19 20:00;8;86.96969697;76.54320988
2006.10.19 16:00;9;80;79.22077922
2006.10.23 00:00;1;65.15151515;29.78723404
2006.10.22 22:00;2;74.83660131;19.67213115
2006.10.20 20:00;3;76.79738562;19.04761905
2006.10.20 16:00;4;78.13504823;13.91304348
2006.10.20 12:00;5;78.65853659;25.26315789
2006.10.20 08:00;6;80.50139276;48.7804878
2006.10.20 04:00;7;80.25974026;81.57894737
On peut voir que la première paire dans les conditions données ( !) fonctionne bien, mais que la seconde...
Ce qui me paraît étrange, c'est que le problème n'est pas systématique. Le même code dans des conditions apparemment similaires donne des résultats différents. Le terminal est à 198 partout. Testé sur deux courtiers différents. L'un d'entre eux est le MIG.
Peut-être que les estimés gentlemen développeurs me diront comment combattre cette vilaine chose ?

 
Comme je l'ai découvert, le problème ne vient pas de la stochasticité et pas du tout des indicateurs. Le problème, c'est que MT4, pour une raison quelconque, ne s'adapte pas à la barre actuelle mais à la précédente.
Si on fait l'échantillonnage suivant,
string time1,time2,time3 ; for (i=1;i<10;i++) { time1=TimeToStr(iTime("GBPUSD",Period(),i)) ; time2=TimeToStr(iTime("EURGBP",Period(),i)) ;
      time3=TimeToStr(iTime("EURUSD",Period(),i)) ; if (FileWrite (handle,TimeToStr(Time[i]),i,time1,time2,time3)<=0) Print("Erreur d'écriture !") ; }


J'obtiens ce qui suit :

2006.10.22 22:00;1;2006.10.22 22:00;2006.10.20 20:00;2006.10.22 22:00
2006.10.20 20:00;2;2006.10.20 20:00;2006.10.20 16:00;2006.10.20 20:00
2006.10.20 16:00;3;2006.10.20 16:00;2006.10.20 12:00;2006.10.20 16:00
2006.10.20 12:00;4;2006.10.20 12:00;2006.10.20 08:00;2006.10.20 12:00
2006.10.20 08:00;5;2006.10.20 08:00;2006.10.20 04:00;2006.10.20 08:00
2006.10.20 04:00;6;2006.10.20 04:00;2006.10.20 00:00;2006.10.20 04:00
2006.10.20 00:00;7;2006.10.20 00:00;2006.10.19 20:00;2006.10.20 00:00
2006.10.19 20:00;8;2006.10.19 20:00;2006.10.19 16:00;2006.10.19 20:00
2006.10.19 16:00;9;2006.10.19 16:00;2006.10.19 12:00;2006.10.19 16:00
2006.10.23 00:00;1;2006.10.23 00:00;2006.10.23 00:00;2006.10.23 00:00
2006.10.22 22:00;2;2006.10.22 22:00;2006.10.22 22:00;2006.10.22 22:00
2006.10.20 20:00;3;2006.10.20 20:00;2006.10.20 20:00;2006.10.20 20:00
A partir de maintenant, c'est normal.
Parfois le crash se produit sur une monnaie, parfois sur deux. Nous n'avons pas réussi à comprendre le système. Soit cela dépend de la puissance de l'ordinateur (bien que je l'ai fait tourner sur un ordinateur plutôt rapide), soit cela dépend d'autre chose.
Mais le fait est que les tests sont impossibles. Dès les premiers accès, MT fournit des données incorrectes.
La question demeure : s'agit-il d'un bug ou d'une fonctionnalité ? :о) Si c'est un bug, comment puis-je le combattre ? Peut-être quelqu'un a-t-il été confronté à un tel problème ?

 
Sans aller trop loin, je suppose que quelque chose ne va pas dans votre historique (ou peut-être que cela a quelque chose à voir avec la modélisation des prix), faites attention à l'heure et aux indices que vous affichez
la première impression montre que la barre avec l'indice 1 est devenue l'indice 3, 2 est devenue l'indice 4, de plus, il semble que vous ayez démarré l'Expert Advisor sur H4, et le temps 22:00 ne vous dit rien
j'aimerais probablement relire l'article sur la simulation dans le testeur, cela mettrait probablement tous les points sur les "i".
bonne chance, n'oubliez pas de rapporter les résultats ici ;)

P.S. Alternativement, vous pouvez essayer une autre version de la simulation et voir les résultats, et là déjà quelques conclusions peuvent être faites
 
Ce n'est pas si simple. L'historique est correct, c'est-à-dire que les barres spécifiées sont présentes et semblent être correctes. Encore une fois, comme je l'ai écrit ci-dessus - le test a été effectué sur deux terminaux différents de deux courtiers différents avec un historique différent (FIBO, MIG).
Et cette image est également observée sur d'autres TF (1H, 30M, 15M etc.) et différentes variantes de simulation de prix (les trois) conduisent toujours aux erreurs mentionnées.
Et il n'y a rien de surnaturel dans le bar de quatre heures à 22 heures - un bar ordinaire du "dimanche". Il ouvre à 22 heures. Tous les courtiers ne coupent pas l'histoire, comme Alpari par exemple. ;о)
Cependant, le problème était encore plus localisé. Il s'est avéré que cet EA ne produit pas d'erreurs avec tous les courtiers. Il s'agit des courtiers qui disposent de données "dominicales". Concrètement, Alpari fonctionne normalement, mais FIBO et MIG présentent des erreurs. Et les erreurs n'apparaissent que lorsque l'on regarde les barres "dimanche".
Je ne pense pas qu'il s'agisse d'une "fonctionnalité". Ça ressemble plus à un insecte. Au moins parce que les erreurs ne se produisent pas sur les mêmes paires. Il peut se produire à un moment sur une paire, à un autre moment sur une autre paire, et au troisième moment sur les deux paires.
J'espère toujours attirer l'attention des développeurs sur ce problème et obtenir une réponse de leur part : quel est ce problème et comment le combattre ;o) (Ne me dites pas : "travaillez avec Alpari" :o)))

P.S. En tout cas, merci à Profi_R pour sa participation, mais comme vous le voyez, les solutions simples ne servent à rien, peut-être vais-je devoir aller en profondeur. :о)
 
J'essaie de résoudre à peu près la même chose en ce moment. Indicateur :

#property copyright "Copyright Quark"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color2 Red
#property indicator_minimum -1
#property indicator_maximum 1

// indicator parameters
extern int nPeriod = 9;
extern int nPeriod_1 = 6;

// indicator buffers
double dUsdChf, dUsdChfPrev;

double arrGroupBuffer[];
double arrGroupMaBuffer[];

int nExtCountedBars = 0;

////////////////////////
int init()
{
	string strIndicatorShortName = "Group(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_NONE);
	SetIndexShift(0, 0);
		
	SetIndexStyle(1, DRAW_LINE);
	SetIndexShift(1, 0);

	IndicatorDigits(4);
		
	// indicator buffers mapping
	SetIndexBuffer(0, arrGroupBuffer);
	SetIndexBuffer(1, arrGroupMaBuffer);

	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	// last counted bar will be recounted
//	if(nExtCountedBars > 0) 
//		nExtCountedBars--;
		
	int nPos = Bars - nExtCountedBars - 1;

	double dPr = 2.0 / (nPeriod + 1);
	
	while(nPos > 0)
	{
		if(!IsTesting())
		{
			dUsdChf = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos - 1);
			dUsdChfPrev = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos);
		}

		arrGroupBuffer[nPos - 1] = 0;
			
		if(dUsdChfPrev - dUsdChf > 0)
			arrGroupBuffer[nPos - 1] += 1;
		else if(dUsdChfPrev - dUsdChf < 0)
			arrGroupBuffer[nPos - 1] -= 1;

		if(nPeriod_1 == 1)
			arrGroupMaBuffer[nPos - 1] = arrGroupBuffer[nPos - 1];
		else 
		{
			dPr = 2.0 / (nPeriod_1 + 1);

			arrGroupMaBuffer[nPos - 1] = arrGroupBuffer[nPos - 1] * dPr + 
				arrGroupMaBuffer[nPos] * (1 - dPr);
		}
		
		nPos--;
	}

	return(0);
}



Il n'est guère utile en pratique car il ne se prête pas au test de l'historique (la deuxième devise crée des profits fantastiques si les barres des deux historiques ne sont pas synchronisées, j'ai déjà écrit à ce sujet). Mais ce n'est pas la question.

Comme vous pouvez le voir dans le code, l'indicateur ne dépend pas de la devise à laquelle il est attaché au graphique. Cela fonctionne toujours pour l'USDCHF. Nous attachons l'indicateur à deux graphiques, dans mon cas AUDUSD et EURUSD, mais je suppose que nous pouvons l'attacher à n'importe quel graphique. Nous le laissons pendant quelques jours. Et nous voyons que les graphiques sont DIFFÉRENTS. Le même indicateur. En temps réel. Le même MT. Redessinez de force (délier - lier) - ils deviennent identiques. Depuis un certain temps.

Je suis en train de tracer et si je trouve quelque chose, je vous le ferai savoir. C'est peut-être, bien sûr, à cause de moi :)

 
C'est parti. Comme il peut y avoir une prétention à "mon" indicateur, qu'il y a quelque chose de faux dans la logique, j'ai écrit un indicateur simplifié pour tester la "monnaie d'aide".

Le code (voir ci-dessous) prend (peu importe la fenêtre à laquelle l'indicateur est attaché) les données de USDCHF, H1 et dessine un graphique a) Open, MA(Open, 6) et MA(Open, 6, calculés manuellement, sans appeler l'indicateur standard).

L'indicateur a été attaché à l'EURUSD H1 et à l'AUDUSD H1. Après 12 heures de travail, les différences sont visibles sur les graphiques (attention, les données proviennent de l'USDCHF et il ne devrait pas y avoir de différences). De plus, les différences ne se situent pas dans la MA, mais exactement dans les lignes Open (bien sûr, dans la MA aussi, mais c'est secondaire, à cause d'Open).

Il y a donc un bug lié à l'utilisation de données provenant d'une autre devise. Chers développeurs ?

#property copyright "Copyright Quark"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Aqua
#property indicator_color3 Red


// indicator parameters
extern int nPeriod = 6;

double arrOpen[];
double arrMa[];
double arrMyMa[];

int nExtCountedBars = 0;

double dUsdChf, dUsdChfPrev;

////////////////////////
int init()
{
	string strIndicatorShortName = "Test(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_LINE);
	SetIndexShift(0, 0);

	SetIndexStyle(1, DRAW_LINE);
	SetIndexShift(1, 0);

	SetIndexStyle(2, DRAW_LINE);
	SetIndexShift(2, 0);

	IndicatorDigits(4);
		
	// indicator buffers mapping
	SetIndexBuffer(0, arrOpen);
	SetIndexBuffer(1, arrMa);
	SetIndexBuffer(2, arrMyMa);
		
	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	int nPos = Bars - nExtCountedBars - 1;

	double dPr = 2.0 / (nPeriod + 1);
	
	while(nPos > 0)
	{
		dUsdChf = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos - 1);
		dUsdChfPrev = iMA("USDCHF", 0, nPeriod, 0, MODE_EMA, PRICE_OPEN, nPos);

		arrOpen[nPos - 1] = iOpen("USDCHF", 0, nPos - 1);
		arrMa[nPos - 1] = dUsdChf;

		arrMyMa[nPos - 1] = arrOpen[nPos - 1] * dPr + 
				arrMyMa[nPos] * (1 - dPr);

		nPos--;
	}

	return(0);
}
 
Plus on s'enfonce dans les bois, plus les partisans sont nombreux.
Premièrement, plus l'histoire est grosse, plus les erreurs sont grosses.
Ensuite, voici le code (toutes mes excuses pour la maladresse du code tout de suite) :
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int       BarsCount=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";
string Para;
int TF;
int handle,handle2;
int init()
  {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexLabel(0,Currency1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexLabel(1,Currency2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

   string Para=Symbol();
   int TF=Period();
   handle= FileOpen("testfile.csv",FILE_CSV|FILE_WRITE,';');
   handle2= FileOpen("testfile2.csv",FILE_CSV|FILE_WRITE,';');
  if(handle<1 || handle2<1 )
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   return(0);
  }
int deinit()
  {
   FileClose(handle);
   return(0);
  }
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       ExtMapBuffer1[i]=iTime(Currency1,Period(),i);
       Sleep(1000);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),i);
       ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
       tt1=Time[i]-ExtMapBuffer1[i];
       tt2=Time[i]-ExtMapBuffer2[i];
       if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) 
        {
      if (FileWrite (handle,
      i,TimeToStr(Time[i]),TimeToStr(ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer2[i])
       )<=0) Print("нифига не пишет!!");
        }
        FileFlush(handle);
      if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }
   return(0);
  }


sur les paires de devises EURUSD et GBPUSD, l'exécution sur EURGBP sur 4H donne plus de 2000 erreurs.
sur 15M - plus de 26500.
Et sur 15M, le décalage n'est pas d'une barre, mais de beaucoup, beaucoup plus (plus de 100 ( !) barres).
Voici un morceau de bois :
15.06.2006 1:45 16.06.2006 0:45 16.06.2006 0:00
15.06.2006 1:30 16.06.2006 0:30 15.06.2006 23:45
15.06.2006 1:15 16.06.2006 0:15 15.06.2006 23:30
15.06.2006 1:00 16.06.2006 0:00 15.06.2006 23:15
15.06.2006 0:45 15.06.2006 23:45 15.06.2006 23:00
15.06.2006 0:30 15.06.2006 23:30 15.06.2006 22:45
15.06.2006 0:15 15.06.2006 23:15 15.06.2006 22:30
15.06.2006 0:00 15.06.2006 23:00 15.06.2006 22:15
14.06.2006 23:45 15.06.2006 22:45 15.06.2006 22:00
14.06.2006 23:30 15.06.2006 22:30 15.06.2006 21:45
14.06.2006 23:15 15.06.2006 22:15 15.06.2006 21:30
14.06.2006 23:00 15.06.2006 22:00 15.06.2006 21:15
14.06.2006 22:45 15.06.2006 21:45 15.06.2006 21:00
14.06.2006 22:30 15.06.2006 21:30 15.06.2006 20:45
Ce journal a été extrait du serveur Alpari avec un terminal frais et un historique récent (jusqu'au 3.10.2005 sur 15M pour les trois paires de devises).
Le but de toutes ces enquêtes est d'obtenir une explication intelligible de ce phénomène de la part des développeurs.
Et ce qui me trouble, c'est que je n'ai pas eu de nouvelles de vous, chers messieurs, depuis une semaine environ.
Je ne sais pas comment vous prouver la gravité du problème, pour que vous y prêtiez attention.
La simplicité transparente de la situation et du code m'empêche de penser à une erreur triviale. Alors je demande aux concepteurs de s'en assurer:
Messieurs ! Je vous demande sincèrement de prêter attention à ce fil et de faire au moins quelques commentaires de votre côté. Si c'est mon erreur, ne pensez pas que c'est ma faute - dites-moi au moins où la chercher. Et dans ce cas, je m'en excuserai. S'il s'agit d'une erreur dans MT4 - alors je pense que vous devriez respecter le temps des personnes (pas seulement moi, je veux dire) qui dépensent cette précieuse ressource afin de trouver et d'attirer votre attention sur cette situation, qui en fait n'est pas leur tâche directe.
Avec respect et dans l'espoir d'un dialogue constructif ... :о)

 
Tu vois, tu t'es embrouillé tout seul :)
Il y a presque vingt ans, assis dans mon dortoir et remuant mon thé en cercle avec une cuillère, j'ai découvert que l'image à travers l'entonnoir se déformait. J'ai immédiatement oublié l'explication simple et j'y ai vu la confirmation que les masses d'eau se déplaçant en cercle provoquent des changements locaux de gravitation (et cela explique la disparition des navires autour du triangle des Bermudes) et par conséquent la réfraction des ondes (lumière). Cette éclipse a duré quelques minutes avant que je ne réalise qu'il s'agissait d'une lentille banale obtenue à partir d'eau tourbillonnante :)

J'ai légèrement modifié votre code :
//+------------------------------------------------------------------+
//|                                             RedrawIndicators.mq4 |
//|                                                           Satori |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Satori"
#property link      "http://www.metaquotes.ru/forum/7790/"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Yellow
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
extern int       BarsCount=20;   //кол-во считаемых баров, если 0 - то все
extern string    Currency1="EURUSD";
extern string    Currency2="GBPUSD";

int handle,handle2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexLabel(0,Currency1);

   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexLabel(1,Currency2);

   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

   handle= FileOpen("TestFile.csv",FILE_CSV|FILE_WRITE,';');
   handle2= FileOpen("TestFile2.csv",FILE_CSV|FILE_WRITE,';');
  if(handle<1 || handle2<1 )
   {
    Print("Файл не обнаружен, последняя ошибка ", GetLastError());
    return(false);
   }
   else
   {
   FileWrite (handle,"index",Symbol(),Currency1,Currency2);
   FileWrite (handle2,"index",Symbol(),"  ",Currency1,"  ",Currency2);
   }

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   FileClose(handle);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i;
   double test1,test2;
   datetime tt1,tt2,TimeMain;
   BarsCount=MathMin(Bars,(MathMin(iBars(Currency1,Period()),iBars(Currency2,Period()))));
   for (i=0;i<BarsCount-counted_bars;i++)
      {
       TimeMain=Time[i];
       ExtMapBuffer1[i]=iTime(Currency1,Period(),iBarShift(Currency1,Period(),TimeMain));
       //Sleep(1000);
       ExtMapBuffer2[i]=iTime(Currency2,Period(),iBarShift(Currency2,Period(),TimeMain));
       ExtMapBuffer3[i]=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);
       tt1=Time[i]-ExtMapBuffer1[i];
       tt2=Time[i]-ExtMapBuffer2[i];
       if (ExtMapBuffer3[i]!=0 || tt1!=0 || tt2!=0) 
         {
         if (FileWrite (handle,
         i,TimeToStr(Time[i]),TimeToStr(ExtMapBuffer1[i]),TimeToStr(ExtMapBuffer2[i])
          )<=0) Print("нифига не пишет!!");
         }
        FileFlush(handle);
        if ((iTime(Symbol(),Period(),i)!=iTime(Currency1,Period(),i) ||
           Time[i]!=iTime(Currency1,Period(),i) ||
           iTime(Currency1,Period(),i)!=iTime(Currency2,Period(),i)
           ) && i>0)
        {
         if (FileWrite (handle2,i,
         TimeToStr(Time[i])," ",TimeToStr(iTime(Currency1,Period(),i))," ",TimeToStr(iTime(Currency2,Period(),i))
       )<=0) Print("нифига не пишет!!");

        }
      }//----
   return(0);
  }
//+------------------------------------------------------------------+



 
Votre code a révélé le fait que sur différents instruments, les barres avec le même indice ne reflètent pas toujours la même période de temps.
La question est donc la suivante : pourquoi ne sont-ils pas les mêmes, pourquoi y a-t-il des trous dans l'histoire ? J'ai exécuté cet indicateur sur GBPJPY H4 et ouvert les deux fichiers résultants.
Vous pouvez voir immédiatement que le timing est cassé à deux endroits et que le second fichier montre un tas d'"erreurs".




PS Alpari cite.