//+------------------------------------------------------------------+//| Функция обработки ошибок |//+------------------------------------------------------------------+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; // Другие варианты // Выход из функции
}
}
}
Pokrov、 あなたが見ているものは何なのか、私はあなたに言いました...
以下はその答えです。https://www.mql5.com/ru/forum/131277/page295#455199
著者に感謝します。
下記のエラー処理ブロックのスペルが正しいのか、それとも何か間違いがあるのか、教えてください。すぐに悪口を言わないように ))))
インジケータで値の履歴をファイルに保存し、後で読み込むにはどうしたらよいでしょうか。 既製の解決策はありますか。
下記のエラー処理ブロックのスペルが正しいのか、それとも何か間違 いがあるのか、教えてください。すぐに悪口を言わないように ))))
私の考えでは、エラー処理はユーザー定義関数の形で行うべきで、サーバーへのアクセスに関連するアクションの後に呼び出されるべきです。
例えば OrderSend() は、失敗した場合、すなわちエラーの場合、注文チケットまたは -1 を返します。そこで、コマンドの実行に失敗した場合には、エラーハンドラを呼び出し、そこにエラーコードを渡すようにする必要があります。そして、エラーハンドラでは、失敗したアクションが繰り返されるか、別の値で停止されるような戻り値を提供する必要があります。
例えば、価格が変更された場合、RefreshRates();で再試行し、十分な資金が ない場合は、試行を中止する方がよいでしょう。
私の考えでは、エラー処理はユーザー定義関数の形で行うべきで、サーバーへのアクセスに関連するアクションの後に呼び出されるべきです。
例えば OrderSend() は、失敗した場合、すなわちエラーの場合、注文チケットまたは -1 を返します。そこで、コマンドの実行に失敗した場合には、エラーハンドラを呼び出し、そこにエラーコードを渡すようにする必要があります。そして、エラーハンドラでは、失敗したアクションが繰り返されるか、別の値で停止されるような戻り値を提供する必要があります。
例えば、価格が変更された場合、RefreshRates(); と再試行し、資金不足の場合は、試行を中止した方がよいでしょう。
GetLastErrorの 後に関数があるのですが、エラーがあった場合、このブロックに移動して(書いてある通り)コマンドが実行されないのでしょうか?OrderSend() -> GetLastError -> エラーブロック Sleep(3000) RefreshRates() -> ブロックを終了し、条件が残っていれば OrderSend() を再度要求する、といったチェーンは理解できましたが。あるいは、私の推理や概念が間違っているのか。ブロック内に戻り値1か0を書きたいとのことですが、私の関数はSignalBuyのようなブーリアン値とは関係ない単純なもので、私の理解が正しければ、戻り値はそこで返すべきものだと思うのですが。