Gli indicatori standard si sovrascrivono?!

 
Ciao!
Per favore, date un consiglio sul seguente problema.
Ecco il codice dell'Expert Advisor.
int handle; string filename="test_expert_log.csv"; int init() { handle= FileOpen(filename,FILE_CSV|FILE_WRITE,';'); if(handle<1) { Print("File not found, last error ", 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); se (FileWrite (handle,TimeToStr(Time[i]),i,test1,test2)<=0) Print("Write Error!"); } return(0); }


L'Expert Advisor funziona su EURUSD con una rapida simulazione sulle barre formate. Legge le letture stocastiche da un'altra coppia di valute, generando alla fine un rapporto della forma:

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 e 78.13504823 (vedi sopra)
2006.10.20 16:00;4;78.13504823 e 78.65853659 (vedi sopra); ecc.
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

è facile vedere che i valori degli indicatori sono diversi sulla stessa barra in una nuova corsa.
Capisco che l'uso pratico di questo EA è dubbio :o) ma lo scopo era di mostrare il problema. In pratica si presenta così: nel terminale l'indicatore si mostra correttamente, ma quando lo chiamo dall'Expert Advisor mostra dati diversi, sbagliati. Dopo aver tagliato tutto ciò che non influenza l'indicatore, abbiamo ottenuto il seguente risultato. Devo essere terribilmente stupido ma non riesco a trovare il mio errore.
A proposito, se cambio la coppia di valute con quella attuale, tutto va bene.
Apprezzo il vostro aiuto in anticipo.

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



Funziona per me (ma non ho controllato tutto il file)

 
Shaitan... :о)
Naturalmente il problema non è la chiusura del file, perché come ho detto prima ho affrontato con valori diversi di indicatore nel terminale e quando chiamato da Expert Advisor. E poi ho disegnato l'output in un file per studiare questo "fenomeno".
In effetti, tutto ha funzionato anche sull'altro mio computer. Tuttavia, nel frattempo non ha funzionato.
Ho trovato sufficiente aggiungere un'altra coppia di valute...
   test1=iStochastic("GBPUSD",Period(),5,3,3,0,0,0,i); test2=iStochastic("EURGBP",Period(),5,3,3,0,0,0,i);


come la situazione si è ripetuta
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
Si può vedere che la prima coppia nelle condizioni date (!) funziona bene, tuttavia la seconda...
Quello che è strano per me è che il problema non è sistematico. Lo stesso codice in condizioni apparentemente simili dà risultati diversi. Il terminale è 198 ovunque. Testato su due diversi broker. Uno di questi è il MIG.
Forse gli stimati signori sviluppatori mi diranno come combattere questa brutta cosa?

 
Come ho scoperto, il problema non è con la stocasticità e nemmeno con gli indicatori. La questione è che MT4 per qualche motivo "adatta" non la barra corrente ma quella precedente.
Se facciamo il seguente campionamento,
stringa time1,time2,time3; per (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("Write error!"); }


Ottengo quanto segue:

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
Da qui in poi è normale.
A volte il crash avviene su una valuta, a volte su due. Non siamo stati in grado di capire il sistema. O dipende dalla potenza del computer (anche se l'ho eseguito su uno piuttosto veloce), o dipende da qualcos'altro.
Ma il fatto è che i test sono impossibili. Ai primissimi accessi MT fornisce dati errati.
La domanda rimane: è un bug o una caratteristica. :о) Se è un bug, come posso combatterlo? Forse qualcuno ha affrontato un problema simile?

 
Senza andare troppo in profondità, presumo che tu abbia qualcosa di sbagliato nella tua storia (o forse ha qualcosa a che fare con la modellazione dei prezzi), fai attenzione al tempo e agli indici che stai visualizzando
la prima stampa mostra che la barra con l'indice 1 è diventata l'indice 3, 2 è diventata l'indice 4, inoltre, sembra che tu abbia avviato l'Expert Advisor su H4, e l'ora 22:00 non ti dice nulla
probabilmente vorrei leggere di nuovo l'articolo sulla simulazione nel tester, probabilmente metterebbe i puntini su tutte le "i".
buona fortuna, non dimenticare di riportare i risultati qui ;)

P.S. in alternativa si potrebbe provare un'altra versione della simulazione e vedere i risultati, e già lì si possono fare alcune conclusioni
 
Non è davvero così semplice. La storia è OK, cioè le barre specificate sono presenti e sembrano essere OK. Di nuovo, come ho scritto sopra - il test è stato condotto su due diversi terminali di due diversi broker con diversa storia (FIBO, MIG).
E questo quadro si osserva anche su altri TF (1H, 30M, 15M ecc.) e diverse varianti di simulazione del prezzo (tutte e tre) portano ancora agli errori menzionati.
E non c'è niente di soprannaturale nel bar delle quattro alle 22:00 - un normale bar della "domenica". Apre alle 22:00. Non tutti i broker tagliano la storia, come Alpari per esempio. ;о)
Tuttavia, il problema era ancora più localizzato. Si è scoperto che questo EA non produce errori con tutti i broker. Vale a dire, è in quei broker, che hanno dati "domenica". In particolare, Alpari funziona normalmente, ma FIBO e MIG hanno degli errori. E gli errori appaiono solo quando guardiamo le barre della "domenica".
Non credo che questa sia una "caratteristica". Sembra più un insetto. Almeno perché gli errori non si verificano sulle stesse coppie. Può verificarsi in un momento su una coppia, in un altro momento su un'altra, e nel terzo momento su entrambe.
Spero ancora di attirare l'attenzione degli sviluppatori su questo problema e ottenere una risposta da loro: cos'è questo problema e come combatterlo ;o) (Non ditemi: "lavora con Alpari" :o))

P.S. In ogni caso, grazie a Profi_R per la partecipazione, ma come vedi, le soluzioni semplici non aiutano, forse dovrò andare in profondità. :о)
 
Sto cercando di capire più o meno la stessa cosa al momento. Indicatore:

#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);
}



C'è poco uso pratico perché non si presta al test della storia (la seconda valuta crea profitti fantastici se le barre delle due storie non sono sincronizzate, ho scritto su questo prima). Ma non è questo il punto.

Come potete vedere dal codice, l'indicatore non dipende dalla valuta in cui è collegato al grafico. Funziona sempre per USDCHF. Colleghiamo l'indicatore a due grafici, nel mio caso AUDUSD e EURUSD, ma suppongo che possiamo collegarlo a qualsiasi grafico. Lo lasciamo per qualche giorno. E vediamo che i grafici sono DIVERSI. Lo stesso indicatore. In tempo reale. Lo stesso MT. Ridisegnare forzatamente (unlink -link) - diventano identici. Per qualche tempo.

Sto rintracciando ora e se trovo qualcosa, vi farò sapere. Potrebbe, naturalmente, essere a causa mia :)

 
Ecco qui. Dal momento che ci può essere una pretesa al "mio" indicatore, che c'è qualcosa di sbagliato nella logica, ho scritto un indicatore semplificato per testare la "valuta helper".

Il codice (vedi sotto) prende (non importa a quale finestra è collegato l'indicatore) i dati di USDCHF, H1 e disegna un grafico a) Open, MA(Open, 6) e MA(Open, 6, calcolato manualmente, senza chiamare l'indicatore standard).

L'indicatore è stato collegato a EURUSD H1 e AUDUSD H1. Dopo 12 ore di lavoro le differenze possono essere viste sui grafici (attenzione, i dati sono presi da USDCHF e non dovrebbero esserci differenze). Inoltre, le differenze non sono nel MA, ma esattamente nelle linee di Open (naturalmente, anche nel MA, ma è secondario, a causa di Open).

Quindi c'è un bug associato all'uso dei dati di un'altra valuta. Cari sviluppatori?

#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);
}
 
Più ci si addentra nel bosco e più i partigiani sono spessi.
In primo luogo, più grande è la storia, più grandi sono gli errori.
In secondo luogo, ecco il codice (mi scuso per la pesantezza del codice):
#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);
  }


sulle coppie di valute EURUSD e GBPUSD, essendo eseguito su EURGBP su 4H dà oltre 2000 errori
su 15M - oltre 26500.
E su 15M lo spostamento non è una barra, ma molte, molte di più (oltre 100 (!) barre)
Ecco un pezzo di registro:
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
Questo log è stato preso dal server Alpari con terminale fresco e storia recente (fino al 3.10.2005 su 15M per tutte e tre le coppie di valute).
Lo scopo di tutte queste indagini è quello di ottenere una spiegazione intelligibile di questo fenomeno da parte degli sviluppatori.
E quello che mi confonde è che non ho sentito una parola da voi, cari signori, da circa una settimana.
Non so come dimostrarvi la gravità del problema, in modo che ci prestiate attenzione.
La trasparente semplicità della situazione e del codice mi impedisce di pensare a un errore banale. Perciò vi prego di assicurarvi che i progettisti siano in grado di farlo:
Cari signori! Vi chiedo seriamente di prestare attenzione a questo thread e di dare almeno qualche commento da parte vostra. Se è un mio errore, per favore non pensare che sia colpa mia - almeno dimmi dove cercarlo. E in questo caso mi scuserò per questo. Se si tratta di un errore in MT4 - allora penso che dovresti rispettare il tempo delle persone (non solo io, intendo) che spendono questa preziosa risorsa per trovare e portare alla tua attenzione questa situazione, che in realtà non è il loro compito diretto.
Con il rispetto e la speranza di un dialogo costruttivo ... :о)

 
Vedi, ti sei confuso :)
Quasi vent'anni fa, seduto nel mio dormitorio e mescolando il mio tè in cerchio con un cucchiaio, ho scoperto che l'immagine attraverso l'imbuto si distorceva. Ho subito dimenticato la semplice spiegazione e l'ho vista come una conferma che le masse d'acqua che si muovono in un cerchio causano cambiamenti locali di gravitazione (e questo spiega la scomparsa delle navi intorno al Triangolo delle Bermuda) e di conseguenza la rifrazione delle onde (luce). Questa eclissi è durata qualche minuto prima che mi rendessi conto che si trattava di una banale lente ottenuta dal vortice dell'acqua :)

Ho cambiato leggermente il tuo codice:
//+------------------------------------------------------------------+
//|                                             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);
  }
//+------------------------------------------------------------------+



 
Il tuo codice ha rivelato il fatto che su diversi strumenti le barre con lo stesso indice non riflettono sempre lo stesso time frame.
Quindi la domanda suona davvero così - perché non sono uguali, perché ci sono dei buchi nella storia? Ho eseguito questo indicatore su GBPJPY H4 e ho aperto i due file risultanti.
Si può vedere immediatamente che il tempo è rotto in due punti e il secondo file mostra un mucchio di "errori"




Citazioni di PS Alpari.