Подскажите, ниже блок обработок ошибок, правильно написано, или может что-то не так? Только не ругайтесь сразу )))
//+------------------------------------------------------------------+//| Функция обработки ошибок |//+------------------------------------------------------------------+if(GetLastError()>=0)
{
switch(_LastError)
{ // Преодолимые ошибки case4:Sleep(3000); // Простое решениеbreak; // Выход из функцииcase6:Sleep(10000); // Простое решениеbreak; // Выход из функцииcase130:Sleep(3000);RefreshRates(); // Обновим данныеbreak; // Выход из функцииcase135:Sleep(3000);RefreshRates(); // Обновим данныеbreak; // Выход из функцииcase136:Sleep(3000);RefreshRates(); // Обновим данныеbreak; // Выход из функцииcase137:Sleep(3000); // Простое решениеbreak; // Выход из функцииcase146:Sleep(3000); // Простое решениеbreak; // Выход из функцииdefault:break; // Другие варианты // Выход из функции
}
}
}
Подскажите, ниже блок обработок ошибок, правильно написано, или может что-то не так? Только не ругайтесь сразу )))
На мой взгляд обработка ошибок должна быть в виде пользовательской функции, которая должна вызываться после каких либо действий связанных с обращением к серверу.
Например OrderSend() возвращает тикет ордера или -1 в случае неудачи, тоесть в случае ошибки. Вот и вызывать обработку ошибок надо в случае неудачного выполнения команды с передачей в неё кода ошибки. А в обработчике ошибок предусмотреть возвращаемое значение при котором не выполненное действие повторяется или при другом значении прекращается.
Например изменились цены, RefreshRates(); и повторить попытку, а при нехватке средств наверное лучше прекратить попытки.
На мой взгляд обработка ошибок должна быть в виде пользовательской функции, которая должна вызываться после каких либо действий связанных с обращением к серверу.
Например OrderSend() возвращает тикет ордера или -1 в случае неудачи, тоесть в случае ошибки. Вот и вызывать обработку ошибок надо в случае неудачного выполнения команды с передачей в неё кода ошибки. А в обработчике ошибок предусмотреть возвращаемое значение при котором не выполненное действие повторяется или при другом значении прекращается.
Например изменились цены, RefreshRates(); и повторить попытку, а при нехватке средств наверное лучше прекратить попытки.
У меня после функций прописан GetLastError и если возникает ошибка разве она в этот блок не поступит (так как написано) и команды не будут выполняться? Я так понимаю цепочку например OrderSend() -> GetLastError -> блок ошибок Sleep(3000) RefreshRates() -> выход из блока и если условия остались опять идет запрос OrderSend(). Или мои рассуждения и представления не верны. Я понимаю,что вы мне предлагаете прописать возвращаемое return значение 1 или 0 в блок, но у меня функции простые не привязаны к булевым значения типа SignalBuy, если я правильно понимаю туда и должны потом возвращаться значения return.
У меня после функций прописан GetLastError и если возникает ошибка разве она в этот блок не поступит (так как написано) и команды не будут выполняться? Я так понимаю цепочку например OrderSend() -> GetLastError -> блок ошибок Sleep(3000) RefreshRates() -> выход из блока и если условия остались опять идет запрос OrderSend(). Или мои рассуждения и представления не верны. Я понимаю,что вы мне предлагаете прописать возвращаемое return значение 1 или 0 в блок, но у меня функции простые не привязаны к булевым значения типа SignalBuy, если я правильно понимаю туда и должны потом возвращаться значения return.
Делаете цикл на количество торговых попыток при ошибке. Обновляете торговое окружение. Сбрасываете значение прошлой ошибки, отсылаете торговый запрос с проверкой на возвращаемый результат. Если вернули ошибку, анализируете её и, в зависимости от кода ошибки, либо полностью прерываете цикл, либо проводите необходимые действия по устранению ошибки и переходите к следующей итеррации цикла. Если торговая операция прошла успешно, прерываете цикл и возвращаете в вызывающую программу значение, соответствующее логике программы для дальнейшей обработки результата торгового запроса (либо флаг успешности выполнения функции, либо номер тикета открытого ордера, и т.д.).
У меня после функций прописан GetLastError и если возникает ошибка разве она в этот блок не поступит (так как написано) и команды не будут выполняться? Я так понимаю цепочку например OrderSend() -> GetLastError -> блок ошибок Sleep(3000) RefreshRates() -> выход из блока и если условия остались опять идет запрос OrderSend(). Или мои рассуждения и представления не верны. Я понимаю,что вы мне предлагаете прописать возвращаемое return значение 1 или 0 в блок, но у меня функции простые не привязаны к булевым значения типа SignalBuy, если я правильно понимаю туда и должны потом возвращаться значения return.
Я ещё дополню то, что в твоём примере после получения ошибки никакой реакции. Что проверяли, что нет, разве что поспать решили чуток или обновили данные. Просто выход по завершению функции OnTick()
Вот здесь нашёл ответ https://www.mql5.com/ru/forum/131277/page295#455199
Спасибо автору.
Подскажите, ниже блок обработок ошибок, правильно написано, или может что-то не так? Только не ругайтесь сразу )))
как в индикаторе сохранять историю значений в файл (и загружать потом)? готовые решения есть наверно?
Подскажите, ниже блок обработок ошибок, правильно написано, или может что-то не так? Только не ругайтесь сразу )))
На мой взгляд обработка ошибок должна быть в виде пользовательской функции, которая должна вызываться после каких либо действий связанных с обращением к серверу.
Например OrderSend() возвращает тикет ордера или -1 в случае неудачи, тоесть в случае ошибки. Вот и вызывать обработку ошибок надо в случае неудачного выполнения команды с передачей в неё кода ошибки. А в обработчике ошибок предусмотреть возвращаемое значение при котором не выполненное действие повторяется или при другом значении прекращается.
Например изменились цены, RefreshRates(); и повторить попытку, а при нехватке средств наверное лучше прекратить попытки.
На мой взгляд обработка ошибок должна быть в виде пользовательской функции, которая должна вызываться после каких либо действий связанных с обращением к серверу.
Например OrderSend() возвращает тикет ордера или -1 в случае неудачи, тоесть в случае ошибки. Вот и вызывать обработку ошибок надо в случае неудачного выполнения команды с передачей в неё кода ошибки. А в обработчике ошибок предусмотреть возвращаемое значение при котором не выполненное действие повторяется или при другом значении прекращается.
Например изменились цены, RefreshRates(); и повторить попытку, а при нехватке средств наверное лучше прекратить попытки.
У меня после функций прописан GetLastError и если возникает ошибка разве она в этот блок не поступит (так как написано) и команды не будут выполняться? Я так понимаю цепочку например OrderSend() -> GetLastError -> блок ошибок Sleep(3000) RefreshRates() -> выход из блока и если условия остались опять идет запрос OrderSend(). Или мои рассуждения и представления не верны. Я понимаю,что вы мне предлагаете прописать возвращаемое return значение 1 или 0 в блок, но у меня функции простые не привязаны к булевым значения типа SignalBuy, если я правильно понимаю туда и должны потом возвращаться значения return.
У меня после функций прописан GetLastError и если возникает ошибка разве она в этот блок не поступит (так как написано) и команды не будут выполняться? Я так понимаю цепочку например OrderSend() -> GetLastError -> блок ошибок Sleep(3000) RefreshRates() -> выход из блока и если условия остались опять идет запрос OrderSend(). Или мои рассуждения и представления не верны. Я понимаю,что вы мне предлагаете прописать возвращаемое return значение 1 или 0 в блок, но у меня функции простые не привязаны к булевым значения типа SignalBuy, если я правильно понимаю туда и должны потом возвращаться значения return.
У меня после функций прописан GetLastError и если возникает ошибка разве она в этот блок не поступит (так как написано) и команды не будут выполняться? Я так понимаю цепочку например OrderSend() -> GetLastError -> блок ошибок Sleep(3000) RefreshRates() -> выход из блока и если условия остались опять идет запрос OrderSend(). Или мои рассуждения и представления не верны. Я понимаю,что вы мне предлагаете прописать возвращаемое return значение 1 или 0 в блок, но у меня функции простые не привязаны к булевым значения типа SignalBuy, если я правильно понимаю туда и должны потом возвращаться значения return.