Перерисовка стандартных индикаторов?! - страница 2

 
Рош(ь) прав. Я только хотел об этом написать, но он меня (как всегда) опередил. Но. Мой индикатор к этому отношения не имеет, в нем проблема в другом. Он рисуется по-разному на разных валютных парах (а данные всегда берутся из USDCHF и всегда в начале бара, в 00 минут), в реальном времени. Номер бара - всегда 1. Так что есть баг. Есть. И пока он не будет вылечен, нельзя тестировать и использовать подобные вещи без риска.

В сущности, мой индикатор можно еще упростить. Просто строим в отдельном окне Open[0] для USDCHF, и этот индикатор цепляем к EURUSD и AUDUSD. Через некоторое время (на часовом графике - неск. часов) начнут появляться расхождения.
 
Рош(ь) прав. Я только хотел об этом написать, но он меня (как всегда) опередил. Но. Мой индикатор к этому отношения не имеет, в нем проблема в другом. Он рисуется по-разному на разных валютных парах (а данные всегда берутся из USDCHF и всегда в начале бара, в 00 минут), в реальном времени. Номер бара - всегда 1. Так что есть баг. Есть. И пока он не будет вылечен, нельзя тестировать и использовать подобные вещи без риска.

В сущности, мой индикатор можно еще упростить. Просто строим в отдельном окне Open[0] для USDCHF, и этот индикатор цепляем к EURUSD и AUDUSD. Через некоторое время (на часовом графике - неск. часов) начнут появляться расхождения.


Как раз твое творение смотрю :) Твой стиль не изменился, пишешь также понятно... для себя :)
 
Вариант Quark'а, переделанный:
//+------------------------------------------------------------------+
//|                                                     QuarkBug.mq4 |
//|                                                            Quark |
//|                             http://www.metaquotes.ru/forum/7790/ |
//+------------------------------------------------------------------+
#property copyright "Quark"
#property link      "http://www.metaquotes.ru/forum/7790/"


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

////////////////////////
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
	string strIndicatorShortName = "Test(" + Symbol() + " " + nPeriod + ")";  
	IndicatorShortName(strIndicatorShortName);

	// drawing settings
	SetIndexStyle(0, DRAW_LINE);
	SetIndexBuffer(0,arrOpen);
	SetIndexLabel(0,"arrOpen");

	SetIndexStyle(1, DRAW_LINE);
	SetIndexBuffer(1,arrMa);
	SetIndexLabel(1,"arrMa");

	SetIndexStyle(2, DRAW_LINE);
	SetIndexBuffer(2,arrMyMa);
	SetIndexLabel(2, "arrMyMa");

	IndicatorDigits(MarketInfo("USDCHF",MODE_DIGITS));		
	// indicator buffers mapping
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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.0);
	
	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--;
		if (nPos<2) Print("nPos=",nPos);
   	}

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


 
Тут фишка немного в другом зарыта :)
Повесил на две пары - GBPUSD M5 и GBPJPY M5, стал смотреть - вроде нет разницы. Потом дошло - Quark, как юзер со стажем, спрятал ошибку поглубже :) Проверил формулу эспоненциальной скользящей - правильно. НО... код построен из предположения, что если открылся новый бар на GBPJPY (на которой висит индикатор) , то новый бар открылся и на USDCHF (откуда снимаются показания Open[]).
Так ли это на самом деле ? Вот поэтому ошибка вылезает постепенно , за несколько суток, так как нужно время на накопление расхождений. Я думаю, все понятно объяснил?
 
А вот и визуальный результат

 
Вариант с тремя графиками еще наглядней

 
Rosh, снимаю перед Вами шляпу. И, как и обещал, приношу свои извинения. В особенности разработчикам.
Как говорится: «Вспылил, был неправ, беру свои слова обратно». ;о)
Действительно всему виной «дыры» в истории. Интересно, кстати, что у меня из Вашего примера есть только одна «дырка» - 25.12.2001. а 14.03.2005 все бары присутствуют.
Остается гадать, куда пропали аж 8 часов котировок, но это уже другая история.
В любом случае, огромное спасибо за помощь. :о)
 
Тут фишка немного в другом зарыта :)
Повесил на две пары - GBPUSD M5 и GBPJPY M5, стал смотреть - вроде нет разницы. Потом дошло - Quark, как юзер со стажем, спрятал ошибку поглубже :) Проверил формулу эспоненциальной скользящей - правильно. НО... код построен из предположения, что если открылся новый бар на GBPJPY (на которой висит индикатор) , то новый бар открылся и на USDCHF (откуда снимаются показания Open[]).
Так ли это на самом деле ? Вот поэтому ошибка вылезает постепенно , за несколько суток, так как нужно время на накопление расхождений. Я думаю, все понятно объяснил?


Мой стиль... ну не знаю. Я хотел как лучше. А что не так? Критику принимаю. Конструктивную :)
Вот новый вариант, без МА вообще. Он рисует iOpen(USDCHF) и iClose.

Теперь насчет того, что ошибка накапливается за счет разного времени открытия баров. Формально, Open[0] одинаков, независимо ни от чего (он формируется в чч:00). Но на практике, что, если бар по нашему чарту уже пришел (первый тик, то есть), а по USDCHF (валюта индикатора) еще нет? Гм... Напрашивается мысль, что правильно построенный код запросит сервер, но если это не сделано, то да, будет использовано значение либо предыдущего (час назад) Open (очень неправильно!!!), либо последнее тиковое значение (что тоже не очень хорошо). Так что, Может быть, Рош прав.

Однако, накопления ошибок при этом не будет (мы же не строим МА, а просто отрисовываем цены открытия).

Для исследования вопроса, я повесил на два чарта новый индикатор, который также рисует iClose.

Замечу, что даже в этом случае, возможны расхождения. Например, если последний тик по одной из валют ОЧЕНЬ задержался, и Open по чарту пришел раньше, чем Close по валюте индикатора.

Для исследования вопроса, я к индикатору добавил третий буфер, рисующий Open предыдущего бара. Думаю, все согласятся, что на часовках эти данные будут синхронизированы ВСЕГДА. Трудно представить, что по одной валюте пришел Open[0], а по другой еще нет Open[1].

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

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

// indicator parameters
extern int nPeriod = 6;

double arrOpen[];
double arrClose1[];
double arrOpen1[];

int nExtCountedBars = 0;

////////////////////////
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, arrClose1);
	SetIndexBuffer(2, arrOpen1);	
		
	return(0);
}
///////////////////////////
int start()
{
	if(Bars <= nPeriod) 
		return(0);
		
	nExtCountedBars = IndicatorCounted();
	if(nExtCountedBars < 0) 
		return(-1);

	int nPos = Bars - nExtCountedBars - 1;

	while(nPos > 0)
	{
		arrOpen[nPos - 1] = iOpen("USDCHF", 0, nPos - 1);
		arrClose1[nPos - 1] = iClose("USDCHF", 0, nPos);
		arrOpen1[nPos - 1] = iOpen("USDCHF", 0, nPos);		

		nPos--;
	}

	return(0);
}



Если верны вышеописанные рассуждения, то получается, что мы должны быть очень осторожны, используя данные другой валюты. Хорошо бы, чтобы разработчики написали (в хелпе, или где еще) некие рекомендации.

Часов через 12 я напишу, что получилось из теста.

 
Quark, ты меня не услышал.
 

Quark, ты меня не услышал.


Не понял, объясни.