Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1120

 
Artyom Trishkin:

Проблемный код.

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

Я так понимал, что человеку не удавалось получить подобное событие для своих целей. Сейчас же он такое событие получит, а далее на свое усмотрение.


Логично было бы переименовывать саму линию в определенный формат при первом же  пересечении (или в описание этой фигуры ставить какую-нибудь метку). И при прохождении всех обьектов проверять линию на отсутствие этой метки.

Если речь идет о неэффективности перебора всех обьектов каждый тик, то это вообще другая тема.

 
Roman:

Вот и попробуйте использовать значение которое возвращает переменная _Period на периодах выше H1 в своих математических расчётах.
И вы сразу поймёте кто ошибся.

Никто в здравом уме не будет использовать значения именованных констант для математических расчётов. На то они и именованные константы, чтобы вам облегчить понимание к чему вы обращаетесь, или какой идентификатор свойства используете для получения данных. Именованные константы заменяют текстовым описанием значение идентификатора запрашиваемого свойства.

При получении данных, например, от SymbolInfoDouble() вы можете использовать числовое значение  идентификатора, указывающего какое именно значение вы хотите получить от функции. Но для этого нужно помнить какое значение идентификатора нужно подставить в функцию. Чтобы освободить вас от постоянных заглядываний в справку, или чтобы вам не помнить наизусть значения каждого идентификатора каждой функции в MQL, и введены именованные константы перечислений. Чтобы получить значение текущей цены Ask, вам нужно либо прописать значение идентификатора, равное 4 при запросе данных для текущего символа: SymbolInfoDouble(NULL,4), либо написать понятно для всех: SymbolInfoDouble(NULL,SYMBOL_ASK);

Почему вас устраивает, и не вызывает диссонанса, что SYMBOL_ASK возвращает 4, а не текущую цену Ask ?

Что ж вы тогда прицепились к идентификаторам периодов графиков? Разработчикам так было нужно. По их внутренним причинам. Для вас есть наименование идентификатора, например PERIOD_H4. Вас не должно волновать какое именно числовое значение ему назначено разработчиком по тем или иным причинам. Вам дали наименование (текстовую замену числового значения) константы - используйте для своего удобства. Но чтобы значение этой константы использовать в своих расчётах - это, простите, нонсенс. Эта именованная константа служит для указания того, с какого графика вы хотите получить данные. Но она не возвращает период графика. Она используется, блин, для других целей - для облегчения вашей жизни, для указания функции что она должна вернуть.

Если вам нужно количество минут в периоде, то и получайте его из количества секунд в периоде делённых на 60. И не называйте костылями то, что ими не является. Костыли - это то, что делаете вы - пытаетесь использовать в расчётах названия чисел.

Жесть...

 
Vadim Lin:

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

Я так понимал, что человеку не удавалось получить подобное событие для своих целей. Сейчас же он такое событие получит, а далее на свое усмотрение.


Логично было бы переименовывать саму линию в определенный формат при первом же  пересечении (или в описание этой фигуры ставить какую-нибудь метку). И при прохождении всех обьектов проверять линию на отсутствие этой метки.

Если речь идет о неэффективности перебора всех обьектов каждый тик, то это вообще другая тема.

Используете древние функции, которые вот-вот, да и канут в лета. И код от этого не кроссплатформенный, хотя можно было легко сделать его рабочим без изменений на любой платформе.

Да и переименовывать - та ещё забава. Нужно просто поглядеть какие имена линий выдаёт индикатор, вычленить из них их явный идентификатор и его использовать для поиска нужных линий.

 
Vadim Lin:

Спасибо большое! Помогло именно wchar_t! Прочитал про него, он в отличии от char хранит 2 байта на символ.

Правда параметр функции "str" по прежнему не возвращает присвоенное ему значение... Интересно почему?..

Наверно потому, что нужно вернуть возвращаемое значение из функции.

extern "C" __declspec(dllexport) wchar_t* __stdcall ToString(wchar_t* str)
{
   wchar_t wcs[256];
   wcscpy(wcs, str);

   wchar_t* addStr = L" --- Привет! ---";
   
   wchar_t* res = wcsncat(wcs, addStr, wcslen(addStr) + 1);
   
   return(res);
}
 
Artyom Trishkin:

Используете древние функции, которые вот-вот, да и канут в лета. И код от этого не кроссплатформенный, хотя можно было легко сделать его рабочим без изменений на любой платформе.

Да и переименовывать - та ещё забава. Нужно просто поглядеть какие имена линий выдаёт индикатор, вычленить из них их явный идентификатор и его использовать для поиска нужных линий.

Спасибо за правку!

Действительно, последние несколько лет относительно редко программирую на MQL4, а в MQL5 не лазил почти. Поэтому вполне допускаю, что какие-то методы устарели (но работаю во всяком случае!).

Нужно просто поглядеть какие имена линий выдаёт индикатор, вычленить из них их явный идентификатор

Безусловно, но не вы и не я - не знаем особенностей наименования тех линий. "Запоминание" таких уровней тоже вариант, но тогда нужно обязательно сохранять куда-то в файл результаты наших "запоминаний", а без этого - при любом падении терминала будет совсем неясная картина происходящего. Переименовывание, по крайней мере, закроет этот вопрос, хотя данный способ может быть и не самый оптимальный.

Могу ошибаться, но человек написал, что используется до 100 линий одновременно, и только линии, и больше ничего на графике нет. Все линии, я так понимаю, нужно мониторить на наличие пересечения. Поэтому что вы будете "вычленять" из имен, я не знаю))

 
Artyom Trishkin:


В том то и дело, что переменная _Period должна возвращать значения таймфрема.
И константы должны соответствовать значениям периода, а не просто константам перечисления.
Иначе теряется смысл этой переменой, которая специально создана для быстрого получения значения таймфрейма, без преобразования дополнительными функциями. 

 
Vadim Lin:

Спасибо за правку!

Действительно, последние несколько лет относительно редко программирую на MQL4, а в MQL5 не лазил почти. Поэтому вполне допускаю, что какие-то методы устарели (но работаю во всяком случае!).

Безусловно, но не вы и не я - не знаем особенностей наименования тех линий. "Запоминание" таких уровней тоже вариант, но тогда нужно обязательно сохранять куда-то в файл результаты наших "запоминаний", а без этого - при любом падении терминала будет совсем неясная картина происходящего. Переименовывание, по крайней мере, закроет этот вопрос, хотя данный способ может быть и не самый оптимальный.

Могу ошибаться, но человек написал, что используется до 100 линий одновременно, и только линии, и больше ничего на графике нет. Все линии, я так понимаю, нужно мониторить на наличие пересечения. Поэтому что вы будете "вычленять" из имен, я не знаю))

При падении терминала, его придётся перезапускать. Индикатор придётся заново накидывать на график, либо запускать советник, использующий данные этого индикатора (тогда советник сам подгрузить этот индикатор при обращении к нему). При этом (да и даже при штатном перезапуске терминала с автоматической загрузкой установленных на графике программ), индикатор заново нарисует все свои линии - не нужно ничего никуда сохранять. Эти линии можно потом заново прочесть. Тем более, что их и так нужно считывать.

А чтобы советник мониторил только линии, созданные индикатором, достаточно посмотреть имена создаваемых им линий, и попробовать найти в именах повторяющиеся - одинаковые для всех линий - подстроки. Вот по этим подстрокам-то и искать нужные линии.

Всё просто - достаточно заглянуть в список объектов при запущенном индикаторе.

 
Roman:

В том то и дело, что переменная _Period должна возвращать значения таймфрема.
И константы должны соответствовать значениям периода, а не просто константам перечисления.
Иначе теряется смысл этой переменой, которая специально создана для быстрого получения значения таймфрейма, без преобразования дополнительными функциями. 

У вас везде смешались люди, кони... Не только в этом вопросе. Если по вашим предложениям понаделать изменений, то половина всего доселе рабочего просто загнётся.

Одно только приравнивание размера тика с размеру пункта чего стоит...

 
Roman:

Вот и попробуйте использовать значение которое возвращает переменная _Period на периодах выше H1 в своих математических расчётах.
И вы сразу поймёте кто ошибся.

Использую почти в каждом советнике. Это уже не смешно. Простите, такое я встречаю впервые.
 
Artyom Trishkin:

У вас везде смешались люди, кони... Не только в этом вопросе. Если по вашим предложениям понаделать изменений, то половина всего доселе рабочего просто загнётся.

Одно только приравнивание размера тика с размеру пункта чего стоит...

Потому что изначально много несоответствий текущим реальностям.
И вы под эти несоответствия пытаетесь находить оправдания.
Как раз наоборот, я писал что тик не равен пункту!
Это у вас пункт свой внутренний, придуманный.
Ввиду того что Point раньше соответствовал именно пункту, когда был только четырёх знак.
Но после ввода пятого разряда, у вас началось придумывание названий своими оправданиями. 

Причина обращения: