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

 
Artyom Trishkin #:

Стандартными средствами нельзя.

Артём, ещё один момент: многократный пересчёт индикатора (удаляются линии затем появляются), как будто вот здесь limit = rates_total - prev_calculated;  слетает  limit, или как бы выразиться ,  prev_calculated не срабатывает. Чем может быть вызвано? 

На старших ТФ всё нормально, как переключаешься на М1 или М5 - начинается крутить


UPD

Кажется нашёл. ChartRedraw(); конфликтует на истории несколько раз обновляться. Один раз поставил (когда rates_total - prev_calculated == 0) и проблема ушла.

 
Ivan Butko #:

Артём, ещё один момент: многократный пересчёт индикатора (удаляются линии затем появляются), как будто вот здесь limit = rates_total - prev_calculated;  слетает  limit, или как бы выразиться ,  prev_calculated не срабатывает. Чем может быть вызвано? 

На старших ТФ всё нормально, как переключаешься на М1 или М5 - начинается крутить


UPD

Кажется нашёл. ChartRedraw(); конфликтует на истории несколько раз обновляться. Один раз поставил (когда rates_total - prev_calculated == 0) и проблема ушла.

Это у Вас ChartRedraw на каждом тике...

 
Artyom Trishkin #:

Это у Вас ChartRedraw на каждом тике...

Исправил) Теперь обновление чарта только по условиям появления объекта. 
 
А обязательно ли использовать ResetLastError


Если да, то перед каждой торговой операцией (установка/открытие/модификация/удаление)? (mql4 и mql5)

 
Ivan Butko #:
А обязательно ли использовать ResetLastError


Если да, то перед каждой торговой операцией (установка/открытие/модификация/удаление)? (mql4 и mql5)

ResetLastError сбрасывает код последней ошибки.

Читайте справку - там всё хорошо поясняется:

В переменной _LastError хранится значение последней ошибки, произошедшей во время исполнения mql5-программы.

Сбросить значение в ноль можно функцией ResetLastError(). Для получения кода ошибки можно также использовать функцию GetLastError().

Т.е., если Вы обращаетесь к какой-либо функции, и полагаетесь на результат её работы, то нужно проверять результат выполнения этой функции. Если она отработала с ошибкой, то нужно проверить код ошибки, находящейся в _LastError - чтобы понять причину ошибочного выполнения функции. Но если перед вызовом функции код ошибки не был сброшен при помощи ResetLastError, то в _LastError может быть не нулевое значение - ведь там хранится код последней произошедшей ошибки, и не обязательно, что это будет от результата исполнения функции, которую Вы вызывали.

Самый короткий ответ, который может помочь Вам в понимании:

Вызывайте ResetLastError всегда непосредственно перед вызовом функции, результат работы которой Вы проверяете на ошибки.

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

 
Ivan Butko #:
А обязательно ли использовать ResetLastError


Если да, то перед каждой торговой операцией (установка/открытие/модификация/удаление)? (mql4 и mql5)

Нет не обязательно. Только если после каждой операции вы проверяете нет-ли ошибки.

А в MQL5 гораздо полезней проверить функцией OrderCheck() перед тем как… и посмотреть код возврата в структуре.

 
Artyom Trishkin #:

ResetLastError сбрасывает код последней ошибки.

Читайте справку - там всё хорошо поясняется:

Т.е., если Вы обращаетесь к какой-либо функции, и полагаетесь на результат её работы, то нужно проверять результат выполнения этой функции. Если она отработала с ошибкой, то нужно проверить код ошибки, находящейся в _LastError - чтобы понять причину ошибочного выполнения функции. Но если перед вызовом функции код ошибки не был сброшен при помощи ResetLastError, то в _LastError может быть не нулевое значение - ведь там хранится код последней произошедшей ошибки, и не обязательно, что это будет от результата исполнения функции, которую Вы вызывали.

Самый короткий ответ, который может помочь Вам в понимании:

Вызывайте ResetLastError всегда непосредственно перед вызовом функции, результат работы которой Вы проверяете на ошибки.

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

Alexey Viktorov #:

Нет не обязательно. Только если после каждой операции вы проверяете нет-ли ошибки.

А в MQL5 гораздо полезней проверить функцией OrderCheck() перед тем как… и посмотреть код возврата в структуре.

Спасибо за ответы!

Стараюсь читать (понять) документацию, не всегда получается

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

ERR_NO_ERROR 0 Нет ошибки
ERR_NO_RESULT 1 Нет ошибки, но результат неизвестен
ERR_COMMON_ERROR 2 Общая ошибка
ERR_SERVER_BUSY 4 Торговый сервер занят
ERR_NO_CONNECTION 6 Нет связи с торговым сервером
ERR_TOO_FREQUENT_REQUESTS 8 Слишком частые запросы
ERR_TRADE_TIMEOUT 128 Истек срок ожидания совершения сделки
ERR_PRICE_CHANGED 135 Цена изменилась
ERR_OFF_QUOTES 136 Нет цен
ERR_BROKER_BUSY 137 Брокер занят
ERR_REQUOTE 138 Новые цены
ERR_ORDER_LOCKED 139 Ордер заблокирован и уже обрабатывается
ERR_TOO_MANY_REQUESTS 141 Слишком много запросов
ERR_TRADE_MODIFY_DENIED 145 Модификация запрещена, так как ордер слишком близок к рынку
ERR_TRADE_CONTEXT_BUSY 146 Подсистема торговли занята
ERR_TRADE_TOO_MANY_ORDERS 148 Количество открытых и отложенных ордеров достигло предела, установленного брокером.


Нашёл в кодбазе джентельменский набор if ((GetLastError() != 135) && (GetLastError() != 138) && (GetLastError() != 146)) return(OpenOrder);

Но, мне кажется, ситуаций побольше будет
 

Всем доброго времени суток!
Я учусь в тестере  генерировать случайные числа при помощи встроенных функций mql4
Вот мой код который генерирует на каждом тике случайное число в диапазоне   от 0 до 32767

void OnInit()
{
MathSrand(GetTickCount());
}
void OnTick()
{
Print("-----КАЖЛЫЙ ТИК------------ ", MathRand());
}

 ВОПРОС

А каким образом можно изменить диапазон ? Например 0-100 , или 100-167, или 45- 587 и т.д.
Всем спасибо за помощь.

 
ANDREY #:

Всем доброго времени суток!
Я учусь в тестере  генерировать случайные числа при помощи встроенных функций mql4
Вот мой код который генерирует на каждом тике случайное число в диапазоне   от 0 до 32767

 ВОПРОС

А каким образом можно изменить диапазон ? Например 0-100 , или 100-167, или 45- 587 и т.д.
Всем спасибо за помощь.

Просто надо взять остаток от деления на 100

void OnInit()
{
MathSrand(GetTickCount());
}
void OnTick()
{
Print("-----КАЖЛЫЙ ТИК------------ ", MathRand()%100);
}

А дальше можете фантазировать как угодно. Остаток от деления минус чего-то, или разделить на что-то, или умножить, прибавить или вообще по какой-то формуле пересчитать…

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