Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну что ж, ребята, первая часть сделана (чтение курсов всех пар).
Теперь мне нужно использовать курсы всех пар, скопированные с помощью функции ArrayCopyRates, для построения графических индикаторов, таких как RSI... как я нарисовал на картинке ниже:
В моем первоначальном вопросе я хотел узнать, как это сделать... а не о чтении курсов. Я не думаю, что мне понадобится копировать курсы перед тем, как нарисовать его, но было полезно знать, как это сделать... теперь мне просто нужно найти способ разделить область индикатора, чтобы построить все пары...
Нет возможности разделить область индикатора. Все должно рисоваться отдельно, никаких буферов, никакого автоматического масштабирования. См.
Видели ли вы такую картинку? (MetaQuotes Software Corp.) - MQL4 форум - Страница 12
Видели ли вы такую картинку? (MetaQuotes Software Corp.) - MQL4 форум - Страница 14
Видели ли вы такую картинку? (MetaQuotes Software Corp.) - MQL4 форум - Страница 36
Нет возможности разделить область индикатора. Все должно рисоваться отдельно, никаких буферов, никакого автоматического масштабирования. См.
Видели ли вы такую картинку? (MetaQuotes Software Corp.) - MQL4 форум - Страница 12
Видели ли вы такую картинку? (MetaQuotes Software Corp.) - MQL4 форум - Страница 14
Видели ли вы такую картинку? (MetaQuotes Software Corp.) - MQL4 форум - Страница 36
Это индикатор, который я где-то взял, но никогда не пытался его расшифровать. Он показывает отображение 3 таймфреймов текущего графика. Самое интересное, что свечи рисуются с помощью гистограмм. Довольно аккуратно, но не то, чем я сейчас увлекаюсь.
С наилучшими пожеланиями
Обновление для тех, кто следит за этой темой!
Я помогал OP через PM исправить его код, так как у него проблемы с английским, а мы оба говорим на португальском. В ходе тестирования мы столкнулись с еще одним "приколом", который происходит с функцией"ArrayCopyRates()". При использовании массива MqlRates с"ArrayCopyRates()" в советнике, массив данных является виртуальным, который всегда сообщает о текущем состоянии дел, поэтому данные всегда свежие.
Однако в индикаторе это не так. Массив не является виртуальной копией, а статической копией, установленной во времени в момент вызова"ArrayCopyRates()". Данные не обновляются, когда Символ отличается от символа графика. Когда это тот же символ, что и на графике, то данные массива "живые" и обновляются, как и ожидалось, но когда это другой символ, то это статическая копия.
Таким образом, для того чтобы это работало в индикаторе, необходимо вызывать функцию "ArrayCopyRates()" при каждом вызове события OnCalculate(), если требуются свежие данные.
Чтобы расширить выводы Фернандо - даже если символ совпадает с символом графика, если таймфрейм другой, то массив статичен.
Поэтому, чтобы иметь виртуальную копию в индикаторе, это должен быть тот же символ И тот же таймфрейм. Все остальное статично.
Предполагая, что сейчас середина недели, чтобы найти максимум и минимум предыдущего дня, я просто использую:
Lo = iLow(NULL, PERIOD_D1, 1);
Это хорошо, но теперь мне нужно найти, в какое время в предыдущий день был максимум и минимум. Я решил прикинуть время до 1ч свечи на максимуме и минимуме, используя iHighest и iLowest. И вот тут начались проблемы.
PrevDayEnd = iBarShift(NULL, PERIOD_H1, iTime(NULL, PERIOD_D1, 0)-1);
PrevDayBegin--;
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1);
ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1);
ArrayCopyRates(mqlrates_array,NULL,0);
OnInit();
:
isHistoryLoading = true;
:
OnCalculate( ... )
:
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
if(isHistoryLoading)
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_D1,0) > 0) && (iTime(NULL,PERIOD_D1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_H1,0) > 0) && (iTime(NULL,PERIOD_H1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array,NULL,0)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,0,0) > 0) && (iTime(NULL,0,1) > 0))
{
isHistoryLoading = false;
if(DebugLog)
Print("Chart up-to-date!");
}
}
}
}
}
}
}
}
}
}
if(isHistoryLoading)
{
if(DebugLog)
Print("Waiting for chart to update!");
return(rates_total);
}
:
:
if(ObjectFind(Trend2Name) != -1) // Check whether mid range line exists
{
if((TimeDay(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeDay(TimeCurrent()))
&& (TimeMonth(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeMonth(TimeCurrent()))
&& (TimeYear(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeYear(TimeCurrent()))) // Indicator has already been ploted today
{
return(rates_total);
}
else // Indicator exists but in a past date, so delete it and plot it on current day
{
if(DebugLog)
Print("Indicator in a past date! Deleting it and creating it today!");
if(ObjectFind(FibName) != -1)
FiboLevelsDelete(0,FibName);
// Indicator will be created by the OnChartEvent() when it detects the fib was deleted.
}
}
else // Indicator doesn't exist, so create it
{
if(DebugLog)
Print("Indicator doesn't exist! Creating it.");
CreateIndicator();
}
:
После нескольких тиков данные будут частично загружены, и приведенный выше фрагмент кода обнаружит, что линии были построены в предыдущий день, удалит fib и вызовет пересчет диапазонов и перерисовку объектов (т.е. fib, линий тренда и т.д.).
CurrDayBegin = iTime(NULL, PERIOD_D1, 0);
while(TimeDayOfWeek(iTime(NULL, PERIOD_H1, iBarShift(NULL, PERIOD_H1, CurrDayBegin))) != TimeDayOfWeek(TimeCurrent()))
// If iBarShift can't find the 0am candle and returns the 11pm candle of prev day.
CurrDayBegin = CurrDayBegin + 3600; // Move 1h until you find the 1st candle of today.Вот скриншоты индикатора:
(1) Рассчитано с использованием неполной истории (обратите внимание, что горизонтальные линии начинаются не с начала дня)
(2) Пересчитано с использованием полной истории (горизонтальные линии начинаются в начале дня)