причем он явно лишний, так как есть 20:00 и 00:00, все как я и предполагал в своем первом посте в этой ветке, но вот то , что на нем нельзя спозиционировать объект (построить линию), наверное еще что-то с базой котировок, если считаешь что она нужна, попробуй сначала ее прибить, а потом ручками добавить
Прочитал про восресные бары. Возможно (для индикатора), дело в функции iBarShift()
int iBarShift( string symbol, int timeframe, datetime time, bool exact=false) Поиск бара по времени. Функция возвращает смещение бара, которому принадлежит указанное время. Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает, в зависимости от параметра exact, -1 или смещение ближайшего бара.
Параметры: symbol - Символьное имя инструмента. NULL означает текущий символ. timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика. time - Значение времени для поиска. exact - Возвращаемое значение если бар не найден. FALSE - iBarShift возвращает ближайший. TRUE - iBarShift возвращает -1.
Пример: datetime some_time=D'2004.03.21 12:00'; int shift=iBarShift("EUROUSD",PERIOD_M1,some_time); Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);
На предыдущей странице мне этот вопрос уже задавали. :о) Нет, не показалось. Это обычный "воскресный" бар, и он действительно открывается в 23:00. А например, у FIBO "воскресные" бары начинаются в 22:00.
Проверил, все подтвердилось.Правда, мне все же удалось установить линию в нужном месте. Для этого я сначала переключился на часовки. Думаю, при установке объекта всегда ищется ближайший бар с точностью до Period() минут.
Окончательный вариант индикатора, использующего вторую валюту. Учтены как разное время прихода баров, так и пропуски в истории. Критика приветствуется.
#property copyright "Copyright Quark"
#property link ""
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Lime
// indicator parameters
extern int nPeriod = 6;
double arrOpen[];
int nExtCountedBars = 0;
int nBars;
int nBarsUsdChf;
////////////////////////
int init()
{
nBars = 0;
nBarsUsdChf = 0;
string strIndicatorShortName = "Test_1(" + Symbol() + " " + nPeriod + ")";
IndicatorShortName(strIndicatorShortName);
// drawing settings
SetIndexStyle(0, DRAW_LINE);
SetIndexShift(0, 0);
IndicatorDigits(4);
// indicator buffers mapping
SetIndexBuffer(0, arrOpen);
return(0);
}
///////////////////////////
int start()
{
if(Bars <= nPeriod)
return(0);
if(nBars == Bars || nBarsUsdChf == iBars("USDCHF", 0))
return(-1);
int nPos = Bars - nBars;
int nPosUsdChf = nPos;
nBars = Bars;
nBarsUsdChf = iBars("USDCHF", 0);
while(nPos >= 0)
{
// Adjust nPosUsdChf, so that time is the same as in EURUSD
// If Time(USDCHF) < Time(EURUSD), decrease nPosUsdChf
while(nPosUsdChf > 0 &&
TimeDay(Time[nPosUsdChf]) < TimeDay(Time[nPos]) || // Yerterday vs. Today
(TimeDay(Time[nPosUsdChf]) == TimeDay(Time[nPos]) && // Same day
TimeHour(Time[nPosUsdChf]) < TimeHour(Time[nPos])))
nPosUsdChf--;
// Now, if Time(USDCHF) > Time(EURUSD), increase nPosUsdChf
while(nPosUsdChf < Bars &&
TimeDay(Time[nPosUsdChf]) > TimeDay(Time[nPos]) || // Yerterday vs. Today
(TimeDay(Time[nPosUsdChf]) == TimeDay(Time[nPos]) && // Same day
TimeHour(Time[nPosUsdChf]) > TimeHour(Time[nPos])))
nPosUsdChf++;
arrOpen[nPos] = iOpen("USDCHF", 0, nPosUsdChf);
nPos--;
nPosUsdChf--;
}
return(0);
}
вот данные из файлов
а вот этот бар на графике
причем это не единственный случай, это всего лишь один пример из множества.
все эти бары имеют отношение к "воскресным" барам.
но вот то , что на нем нельзя спозиционировать объект (построить линию), наверное еще что-то с базой котировок, если считаешь что она нужна, попробуй сначала ее прибить, а потом ручками добавить
int iBarShift( string symbol, int timeframe, datetime time, bool exact=false)
Поиск бара по времени. Функция возвращает смещение бара, которому принадлежит указанное время. Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает, в зависимости от параметра exact, -1 или смещение ближайшего бара.
Параметры:
symbol - Символьное имя инструмента. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
time - Значение времени для поиска.
exact - Возвращаемое значение если бар не найден. FALSE - iBarShift возвращает ближайший. TRUE - iBarShift возвращает -1.
Пример:
datetime some_time=D'2004.03.21 12:00';
int shift=iBarShift("EUROUSD",PERIOD_M1,some_time);
Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);
Я постараюсь глянуть на котировках MiG, попозже.
Нет, не показалось.
Это обычный "воскресный" бар, и он действительно открывается в 23:00. А например, у FIBO "воскресные" бары начинаются в 22:00.
Учтены как разное время прихода баров, так и пропуски в истории.
Критика приветствуется.
#property copyright "Copyright Quark" #property link "" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Lime // indicator parameters extern int nPeriod = 6; double arrOpen[]; int nExtCountedBars = 0; int nBars; int nBarsUsdChf; //////////////////////// int init() { nBars = 0; nBarsUsdChf = 0; string strIndicatorShortName = "Test_1(" + Symbol() + " " + nPeriod + ")"; IndicatorShortName(strIndicatorShortName); // drawing settings SetIndexStyle(0, DRAW_LINE); SetIndexShift(0, 0); IndicatorDigits(4); // indicator buffers mapping SetIndexBuffer(0, arrOpen); return(0); } /////////////////////////// int start() { if(Bars <= nPeriod) return(0); if(nBars == Bars || nBarsUsdChf == iBars("USDCHF", 0)) return(-1); int nPos = Bars - nBars; int nPosUsdChf = nPos; nBars = Bars; nBarsUsdChf = iBars("USDCHF", 0); while(nPos >= 0) { // Adjust nPosUsdChf, so that time is the same as in EURUSD // If Time(USDCHF) < Time(EURUSD), decrease nPosUsdChf while(nPosUsdChf > 0 && TimeDay(Time[nPosUsdChf]) < TimeDay(Time[nPos]) || // Yerterday vs. Today (TimeDay(Time[nPosUsdChf]) == TimeDay(Time[nPos]) && // Same day TimeHour(Time[nPosUsdChf]) < TimeHour(Time[nPos]))) nPosUsdChf--; // Now, if Time(USDCHF) > Time(EURUSD), increase nPosUsdChf while(nPosUsdChf < Bars && TimeDay(Time[nPosUsdChf]) > TimeDay(Time[nPos]) || // Yerterday vs. Today (TimeDay(Time[nPosUsdChf]) == TimeDay(Time[nPos]) && // Same day TimeHour(Time[nPosUsdChf]) > TimeHour(Time[nPos]))) nPosUsdChf++; arrOpen[nPos] = iOpen("USDCHF", 0, nPosUsdChf); nPos--; nPosUsdChf--; } return(0); }Э... Просто там была МА, а потом я ее убрал. Но не до конца :)