Потому что минутные таймфреймы которые ниже H1, возвращают корректные значения. Как и описано в справке, возвращают значение таймфрейма, а не от балды константы.
какой балды?
Вы глаза протрите, я же показал внутреннее представление ENUM_TIMEFRAMES
установленный бит № 16 определяет недельный и месячный ТФ
установленный бит № 15 определяет часовые ТФ, причем ТФ Д1 = 100000000011000 --> 11000 --> 24 , т..е разработчики сопоставили Д1 как 24 часа, остальные часовые ТФ соответствуют переводу в десятичную систему исчисления
для минутных ТФ по аналогии с часовыми, но старшие биты сброшены
другой вопрос, что Вы решили, что функции возвращающие ENUM_TIMEFRAMES возвращают время ТФ в минутах - это не так, эти функции возвращает перечисление ENUM_TIMEFRAMES - не больше и не меньше, просто ENUM_TIMEFRAMES
Здравствуйте, подскажите как решить проблему. Хочу написать советника по индикатору (привязан к железу), строящего множество уровней (линий) на графике, количество линий может достигать 500.
Всё что я хочу реализовать - это открытие ордера или любое другое событие (например, алерт или сообщение) при пересечении ценой линий на графике. Но проблема в том, что индикатор не возвращает никаких значений и строит только горизонтальные линии (объекты с названиями) - больше на графике ничего нет.
Попытался найти решение через функцию iCustom, которая извлекает уровни цены через переменную "_price", но советник при касании линий не открывает сделок. Что сделал не так не понимаю.
voidOnTick()
{
ENUM_OBJECT typeObj = OBJ_HLINE;
string ArrLines[];
double
Price;
Price=Bid;
//ВАРИАНТ 1 (не получился). Я хотел, чтобы ордер открывался при пересечении любой из линий на графике //вызовем индикатор: (пара, таймфрейм, индикатор...)iCustom(Symbol(), 0, "ITS-Level Gun", 0, 0);
int i, k = ObjectsTotal();
ArrayResize(ArrLines, 0);
//в цикле перебираем все объекты на графикеfor (i=k-1; i>=0; i--) {
//узнаем имя объекта на графикеstring _name = ObjectName(i);
{
//узнаем координату цены линииdouble _price = NormalizeDouble(ObjectGetDouble(0, _name, OBJPROP_PRICE), Digits);
}
}
if(Price==_price)
{OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);}
// И ВСЁ, дальше не знаю, что делать
}
}
ВАРИАНТ 2. Открытие ордера происходит на той линии которую укажу в настройках - он работает и открывает сделки на том уровне который укажу в параметрах советника
externstring h="@Line_week_open-0"; //ИЗМЕНЕНИЕ ННАЗВАНИЯ ЛИНИИ В СВОЙСТВАХ СОВЕТНИКА.ВАРИАНТ 2.if(ObjectFind(h)>-1)
{
double prise = ObjectGet(h, OBJPROP_PRICE1);
if (Price==prise)
{OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);}
}
Здравствуйте, подскажите как решить проблему. Хочу написать советника по индикатору (привязан к железу), строящего множество уровней (линий) на графике, количество линий может достигать 500.
Всё что я хочу реализовать - это открытие ордера или любое другое событие (например, алерт или сообщение) при пересечении ценой линий на графике. Но проблема в том, что индикатор не возвращает никаких значений и строит только горизонтальные линии (объекты с названиями) - больше на графике ничего нет.
Попытался найти решение через функцию iCustom, которая извлекает уровни цены через переменную "_price", но советник при касании линий не открывает сделок. Что сделал не так не понимаю.
ВАРИАНТ 2. Открытие ордера происходит на той линии которую укажу в настройках - он работает и открывает сделки на том уровне который укажу в параметрах советника
for(int i = ObjectsTotal() - 1; i >=0; i--) {
// все что не горизонтальные линии - игнорируемif(ObjectType(ObjectName(i)) != OBJ_HLINE) continue;
double PriceLine = NormalizeDouble(ObjectGet(ObjectName(i), OBJPROP_PRICE1), Digits());
// измените условие Bid == PriceLine
if(Bid == PriceLine) {
// ..... тут что-то происходит ...
}
}
НО, что если Bid по какой-то причине перескочил линию, и не был равен цене линии, тогда что?... Предусмотрите тогда хотя бы переменную, в которой храниться предыдущий тик, и если было пересечение нового тика вашей линии - то делайте какие-то действия... Но в этом случае не забудьте предусмотреть "допустимое" пересечение, так как если рынок откроется с Гэпом большим, или просто произойдет большой скачек цены, то вы махом откроетесь по множеству линий, и возможно не там, где хотите. Пусть при пересечении больше допустимого - выдается только сообщение,..
НО, что если Bid по какой-то причине перескочил линию, и не был равен цене линии, тогда что?... Предусмотрите тогда хотя бы переменную, в которой храниться предыдущий тик, и если было пересечение нового тика вашей линии - то делайте какие-то действия... Но в этом случае не забудьте предусмотреть "допустимое" пересечение, так как если рынок откроется с Гэпом большим, или просто произойдет большой скачек цены, то вы махом откроетесь по множеству линий, и возможно не там, где хотите. Пусть при пересечении больше допустимого - выдается только сообщение,..
Вы глаза протрите, я же показал внутреннее представление ENUM_TIMEFRAMES
установленный бит № 16 определяет недельный и месячный ТФ
установленный бит № 15 определяет часовые ТФ, причем ТФ Д1 = 100000000011000 --> 11000 --> 24 , т..е разработчики сопоставили Д1 как 24 часа, остальные часовые ТФ соответствуют переводу в десятичную систему исчисления
для минутных ТФ по аналогии с часовыми, но старшие биты сброшены
другой вопрос, что Вы решили, что функции возвращающие ENUM_TIMEFRAMES возвращают время ТФ в минутах - это не так, эти функции возвращает перечисление ENUM_TIMEFRAMES - не больше и не меньше, просто ENUM_TIMEFRAMES
перечисления могут быть и с присвоением любого константного значения члену перечисления
Вы можете создать свое перечисление отвечающее Вашим требованиям
Игорь, да это понятно давно про константные значения. Об этом и речь, какой смысл несёт 15 и 16 бит как возвращаемое значение. Бред да и только. По чему то до М30 константы ENUM соответствовали ЗНАЧЕНИЯМ ТАЙМФРЕЙМА !!!! А далее уже соответствует значениям каким то битам. Ну где блин логика ребят. По этому это грубая ошибка, а если намерено сделано так, то диверсия )) Переменная _Period уже содержит в себе все эти значения таймфрема, из перечисления ENUM их не нужно дополнительно преобразовывать. По этому эти константные значения, должны соответствовать значениям таймфрейма как заявлено в справке. А не БИТАМ!
Точно пора в карантин. Поиском соберите всё что об этом говорилось и читайте наздоровье. Почему вы решили что окружающие должны ещё раз всё написанное повторять?
Точно пора в карантин. Поиском соберите всё что об этом говорилось и читайте наздоровье. Почему вы решили что окружающие должны ещё раз всё написанное повторять?
А почему вы миритесь с неправильными решениями? Я донёс логичное объяснение значений констант, а не то что напридумывал разработчик.
А почему вы миритесь с неправильными решениями? Я донёс логичное объяснение значений констант, а не то что напридумывал разработчик.
Видимо для вас существует только два мнения: ваше и неправильное. Соберите всё что об этом уже писали и может быть найдёте объяснение которое вас устроит.
Alexey Viktorov: Видимо для вас существует только два мнения: ваше и неправильное. Соберите всё что об этом уже писали и может быть найдёте объяснение которое вас устроит.
Вот и попробуйте использовать значение которое возвращает переменная _Period на периодах выше H1в своих математических расчётах. И вы сразу поймёте кто ошибся.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Потому что минутные таймфреймы которые ниже H1, возвращают корректные значения.
Как и описано в справке, возвращают значение таймфрейма, а не от балды константы.
какой балды?
Вы глаза протрите, я же показал внутреннее представление ENUM_TIMEFRAMES
установленный бит № 16 определяет недельный и месячный ТФ
установленный бит № 15 определяет часовые ТФ, причем ТФ Д1 = 100000000011000 --> 11000 --> 24 , т..е разработчики сопоставили Д1 как 24 часа, остальные часовые ТФ соответствуют переводу в десятичную систему исчисления
для минутных ТФ по аналогии с часовыми, но старшие биты сброшены
другой вопрос, что Вы решили, что функции возвращающие ENUM_TIMEFRAMES возвращают время ТФ в минутах - это не так, эти функции возвращает перечисление ENUM_TIMEFRAMES - не больше и не меньше, просто ENUM_TIMEFRAMES
посмотрите пример из справки https://www.mql5.com/ru/docs/basis/types/integer/enumeration
перечисления могут быть и с присвоением любого константного значения члену перечисления
Вы можете создать свое перечисление отвечающее Вашим требованиям
https://www.mql5.com/ru/articles/18
https://www.mql5.com/ru/articles/5798
Спасибо большое! Помогло именно wchar_t! Прочитал про него, он в отличии от char хранит 2 байта на символ.
Правда параметр функции "str" по прежнему не возвращает присвоенное ему значение... Интересно почему?..
Здравствуйте, подскажите как решить проблему. Хочу написать советника по индикатору (привязан к железу), строящего множество уровней (линий) на графике, количество линий может достигать 500.
Всё что я хочу реализовать - это открытие ордера или любое другое событие (например, алерт или сообщение) при пересечении ценой линий на графике. Но проблема в том, что индикатор не возвращает никаких значений и строит только горизонтальные линии (объекты с названиями) - больше на графике ничего нет.
Попытался найти решение через функцию iCustom, которая извлекает уровни цены через переменную "_price", но советник при касании линий не открывает сделок. Что сделал не так не понимаю.
ВАРИАНТ 2. Открытие ордера происходит на той линии которую укажу в настройках - он работает и открывает сделки на том уровне который укажу в параметрах советника
Здравствуйте, подскажите как решить проблему. Хочу написать советника по индикатору (привязан к железу), строящего множество уровней (линий) на графике, количество линий может достигать 500.
Всё что я хочу реализовать - это открытие ордера или любое другое событие (например, алерт или сообщение) при пересечении ценой линий на графике. Но проблема в том, что индикатор не возвращает никаких значений и строит только горизонтальные линии (объекты с названиями) - больше на графике ничего нет.
Попытался найти решение через функцию iCustom, которая извлекает уровни цены через переменную "_price", но советник при касании линий не открывает сделок. Что сделал не так не понимаю.
ВАРИАНТ 2. Открытие ордера происходит на той линии которую укажу в настройках - он работает и открывает сделки на том уровне который укажу в параметрах советника
НО, что если Bid по какой-то причине перескочил линию, и не был равен цене линии, тогда что?... Предусмотрите тогда хотя бы переменную, в которой храниться предыдущий тик, и если было пересечение нового тика вашей линии - то делайте какие-то действия... Но в этом случае не забудьте предусмотреть "допустимое" пересечение, так как если рынок откроется с Гэпом большим, или просто произойдет большой скачек цены, то вы махом откроетесь по множеству линий, и возможно не там, где хотите. Пусть при пересечении больше допустимого - выдается только сообщение,..
НО, что если Bid по какой-то причине перескочил линию, и не был равен цене линии, тогда что?... Предусмотрите тогда хотя бы переменную, в которой храниться предыдущий тик, и если было пересечение нового тика вашей линии - то делайте какие-то действия... Но в этом случае не забудьте предусмотреть "допустимое" пересечение, так как если рынок откроется с Гэпом большим, или просто произойдет большой скачек цены, то вы махом откроетесь по множеству линий, и возможно не там, где хотите. Пусть при пересечении больше допустимого - выдается только сообщение,..
Проблемный код.
какой балды?
Вы глаза протрите, я же показал внутреннее представление ENUM_TIMEFRAMES
установленный бит № 16 определяет недельный и месячный ТФ
установленный бит № 15 определяет часовые ТФ, причем ТФ Д1 = 100000000011000 --> 11000 --> 24 , т..е разработчики сопоставили Д1 как 24 часа, остальные часовые ТФ соответствуют переводу в десятичную систему исчисления
для минутных ТФ по аналогии с часовыми, но старшие биты сброшены
другой вопрос, что Вы решили, что функции возвращающие ENUM_TIMEFRAMES возвращают время ТФ в минутах - это не так, эти функции возвращает перечисление ENUM_TIMEFRAMES - не больше и не меньше, просто ENUM_TIMEFRAMES
посмотрите пример из справки https://www.mql5.com/ru/docs/basis/types/integer/enumeration
перечисления могут быть и с присвоением любого константного значения члену перечисления
Вы можете создать свое перечисление отвечающее Вашим требованиям
Игорь, да это понятно давно про константные значения.
Об этом и речь, какой смысл несёт 15 и 16 бит как возвращаемое значение. Бред да и только.
По чему то до М30 константы ENUM соответствовали ЗНАЧЕНИЯМ ТАЙМФРЕЙМА !!!!
А далее уже соответствует значениям каким то битам. Ну где блин логика ребят.
По этому это грубая ошибка, а если намерено сделано так, то диверсия ))
Переменная _Period уже содержит в себе все эти значения таймфрема, из перечисления ENUM их не нужно дополнительно преобразовывать.
По этому эти константные значения, должны соответствовать значениям таймфрейма как заявлено в справке. А не БИТАМ!
Точно пора в карантин. Поиском соберите всё что об этом говорилось и читайте наздоровье. Почему вы решили что окружающие должны ещё раз всё написанное повторять?
Точно пора в карантин. Поиском соберите всё что об этом говорилось и читайте наздоровье. Почему вы решили что окружающие должны ещё раз всё написанное повторять?
А почему вы миритесь с неправильными решениями? Я донёс логичное объяснение значений констант, а не то что напридумывал разработчик.
А почему вы миритесь с неправильными решениями? Я донёс логичное объяснение значений констант, а не то что напридумывал разработчик.
Видимо для вас существует только два мнения: ваше и неправильное. Соберите всё что об этом уже писали и может быть найдёте объяснение которое вас устроит.
Вот и попробуйте использовать значение которое возвращает переменная _Period на периодах выше H1 в своих математических расчётах.
И вы сразу поймёте кто ошибся.