Особенности языка mql5, тонкости и приёмы работы - страница 32
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Проверяю готовность индикатора так (в самом начале OnCalculate)
можно еще добавить проверку Периода
1. Просто уточнение. Теперь понятно что говорим об одном и том-же.
2. Это я понял, но не соглашусь что для этого обязательно переворачивать массивы. Разве обязательно иметь один индикатор для двух терминалов??? Почти так-же как сделать 2в1 косу и топор.
3. Buffer[] как я понял используется приёмником в функции CopyBuffer() для получения всего 1 значения индикатора.
4. На самое главное ты не обратил внимания. Начало копирования значения индикатора надо определять не индексом бара, а временем i-того бара.
1. Хорошо.
2. Массив переворачиваю потому, что переписываю индикатор с четвёрки - в нём-то как раз всё работает как нужно, все данные получаются верно. В нём всё завязано на получении данных именно в той последовательности, в которой они читаются в цикле. Если не переворачивать буфер, то придётся писать индикатор с нуля - зачем? Он достаточно сложный. Этот индикатор привёл лишь как пример ошибочности получения данных с неродного тф.
3. Нет. В Buffer[] в цикле вписываются данные по одному - на каждой итерации цикла вписывается одно значение, получаемое из АО()
4. Что ты имеешь в виду под "начало копирования"?
1. Хорошо.
2. Массив переворачиваю потому, что переписываю индикатор с четвёрки - в нём-то как раз всё работает как нужно, все данные получаются верно. В нём всё завязано на получении данных именно в той последовательности, в которой они читаются в цикле. Если не переворачивать буфер, то придётся писать индикатор с нуля - зачем? Он достаточно сложный. Этот индикатор привёл лишь как пример ошибочности получения данных с неродного тф.
3. Нет. В Buffer[] в цикле вписываются данные по одному - на каждой итерации цикла вписывается одно значение, получаемое из АО()
4. Что ты имеешь в виду под "начало копирования"?
2. Ничто не мешает построить цикл от 0 до rates_total-1
3. Да, я где-то что-то перепутал.
4.В твоём коде
надо заменить на
"Откуда начнём" или "с какой даты" это и есть начало копирования значений индикатора в массив приёмник.
3. Да, я где-то что-то перепутал.
4.В твоём коде
надо заменить на
"Откуда начнём" или "с какой даты" это и есть начало копирования значений индикатора в массив приёмник.
Зачем передавать дату, если я считываю значение по индексу цикла? Ты запускал этот тестовый индикатор? Он всегда рисует АО только с одного - заданного тф в настройках. Как ни переключай текущий тф, график АО всегда соответствует заданному тф в настройках.
И тут-то как раз все данные с грехом пополам но возвращаются, а вот в моём индикаторе, который переделываю, данные не возвращаются с неродного тф - и хоть тресни...
Этот тестовый индикатор уже не нужен - в нём данные с неродного тф уже возвращаются. А вот в моём - нет, но данные получаю точно таким же способом.
Зачем передавать дату, если я считываю значение по индексу цикла? Ты запускал этот тестовый индикатор? Он всегда рисует АО только с одного - заданного тф в настройках. Как ни переключай текущий тф, график АО всегда соответствует заданному тф в настройках.
И тут-то как раз все данные с грехом пополам но возвращаются, а вот в моём индикаторе, который переделываю, данные не возвращаются с неродного тф - и хоть тресни...
Этот тестовый индикатор уже не нужен - в нём данные с неродного тф уже возвращаются. А вот в моём - нет, но данные получаю точно таким же способом.
Потому, что в нулевом баре Н4 содержится ЧЕТЫРЕ бара Н1. И если запросить по индексу 2 периода Н1 значение индикатора по периоду Н4 то получишь значение индикатора на баре 2 по периоду Н4.
Сам с трудом понимаю что получилось написать...
В текущий момент время 13:35. Время открытия текущего бара Н1 = 13:00. Пытаешься скопировать значения индикатора по индексу бара =1 то-есть бара 12:00 текущего Н1 периода. А получаешь вместо 12:00 по времени Н4 периода 8:00
Для Н1 первый бар 12:00
Для Н4 первый бар 8:00
И там и там индекс бара первый...
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2017.04.12 08:38
Небольшой лайфхак. Обход оператора присваиванияФорум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Не получается брать данные индикатора со старшего ТФ
Artyom Trishkin, 2017.04.14 01:23
Уже четвёртый день в индикаторе пытаюсь получить данные стандартного индикатора АО со старшего таймфрейма, и всё никак...
В цикле считываю данные АО, но именно в цикле исторических данных нет. На текущем баре данные есть. В чём подвох? Что делаю не так?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2017.02.27 18:40
Спасибо за наводку! В дебрях это - SymbolInfoMarginRate. Поэтому теперь такdouble GetMarginRequired( const string Symb )
{
MqlTick Tick;
double MarginInit, MarginMain;
return((SymbolInfoTick(Symb, Tick) && SymbolInfoMarginRate(Symb, ORDER_TYPE_BUY, MarginInit, MarginMain)) ? MarginInit * Tick.ask *
SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) / (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}
Надо четко понимать, что в MT5 в разные стороны могут быть совсем другие маржинальные требования. Т.е. единый MT4-вариант может не прокатывать. На Forex, конечно, такого не будет. Но помнить нужно. Поэтому в общем случае нужно писать так
bool MyOrderCalcMargin( const ENUM_ORDER_TYPE action, const string symbol, const double volume, const double price, double &margin )
{
double MarginInit, MarginMain;
const bool Res = SymbolInfoMarginRate(symbol, action, MarginInit, MarginMain);
margin = Res ? MarginInit * price * volume * SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE) /
(SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0;
return(Res);
}
Выделенное может возвращать 0. В БКС столкнулся.
Сделал так:
Как по мне - много чего делаете "не так". Опишите, пожалуйста, что требуется сделать: последовательно, по пунктам.
Что именно не так? Именно вопрос и звучал - что делаю не так для получения данных индикатора с неродного таймфрейма?
Пример: индикатор запущен на М1, а данные от АО нужно получать с М5. Так вот - пока у нас limit>1 (нужно пересчитать историю), то АО с М5 возвращает нули с ошибкой отсутствия данных. Как только история вся просчитана (limit==0), то данные от АО с М5 начинают поступать.