for (int i = 0; i < Orders.length; i++) {
Order O = Orders.getByIndex(i);
if (O.symbol == "EURUSD" && O.magicNumber = 12345) {
}
}
しかし、そうではありません。その代わり、MQL4とMQL5の間でこれを行う方法は基本的に同じです。
for (int i = 0; i < OrdersTotal(); i++) {
if (OrderGetTicket(i)) {
if (OrderGetString(ORDER_SYMBOL) == "EURUSD" && OrderGetInteger(ORDER_MAGIC) == 12345) {
}
}
}
大きなプロジェクトの一例として、Metaquotesが作成したMQL5 Wizardがあります。これは、ユーザーからの入力で5分以内にEAを作成することができます。これは、EAを構築するために必要なすべての要素を提供するmql5 Standard Librayをベースにしています。同じウィザードはおそらく手続き的な方法で行うことができますが、私の意見ではそれははるかに難しいでしょう。そして、このコードをメンテナンスしなければなりません。しかし、これらのStandard librayはドキュメントや説明が十分でないため、理解するのが難しいのです。私は、このトピック(mql5 wizard not oop)に存在するものをすべて一元化するために、このトピックを 作成しました。
***Ps:(これは忘れたくないのですが)。確かに、私たちのほとんどは、自分が使っているコードの中身がわからないというのは嫌なものです。あるいは、他の人のコードを理解しようとすることで頭がいっぱいになり、そうでなければ、おそらくそれを使うことはないでしょう。しかし、mql4のNative関数(例えばOrderSend())のほとんどは、私たちから見ればオブジェクトです。私たちはそのコードを見ることはできませんが、それを受け入れることができます。私は、このような他者のライブラリの受け入れは、大規模なプロジェクトに携わるプロのプログラマーが受け入れなければならないものだと考えています。そうでなければ、車輪の再作成に行き詰まるでしょう。
あなたはプログラムの流れを説明しているのだと思います。それはOOPの背後にある大きな理念ではないと思います。(OOPは以下のような問題を解決しようとするものです。私はOOPの初心者ですが、世界観を形成しています。
1) 関数はグローバル変数から独立しているか?言い換えれば、その関数は独立したオブジェクトなのか?カプセル化
2) その関数はローカル変数名のような詳細を隠しているか?画面上のコード量が少なくなっていないか?抽象化
3) 変更のために自分自身の複製を作成する機能を備えているか?独自のデータ型を作成する機能とか?継承です。
4) オンザフライで変更する機能があるか?例:double_arrayだけでなく、integer_arrayも扱えるか?ポリモーフィズム。
OOPがEAの構築に役立つ方法は、EA_Builderがプログラマーでない人がエキスパート・アドバイザーを構築するのに役立つ方法と似ています。好きなOrder_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Error Processing Functionを使うだけです。これでExpert_Advisorの出来上がりです。長年培った取引基準定義関数を簡単に入れ替えることができるのです。
例えば、私のExpert Advisorを変更したい場合、私のグローバル変数がどこに適用され、どの関数がそれに依存しているか(ステートやステータス配列のように)を研究する必要があります。OOP はそれを Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2) と単純にし、それがエキスパート全体となるようにするのです。
こうすることで、他の人があなたのライブラリのセットを使うことが容易になり、通常、他の人のために機能するものは、将来的にあなたのためにも機能するようになるのです。他に何もなければ、組み立てライン上のスタンドアロン・オブジェクトを考えてみてください :)
私はMQL5に少し手を出しましたが、私が書いたコードではOOPを使用する必要はありませんでした。
MQL5では、クラスとOOPは非常にオプションのアドオンです。プラットフォームフレームワークはそれら自体を使用しません。例えば、プラットフォームにはOrderコレクションのようなものがあり、Orderオブジェクトのリストを含んでいて、次のようなコードを書くことができると期待するかもしれません。
しかし、そうではありません。その代わり、MQL4とMQL5の間でこれを行う方法は基本的に同じです。
(また、あなたが書くEAはExpertAdvisorクラスから派生したクラスであり、その宣言には仮想OnTickやOnInit関数といったものがあると思うかもしれません。しかし、そのようなことはありません。MQL5フレームワークは基本的に非OOPのままですが、OOPが有用なタスクには自分でOOPを使用するオプションがあります)。
その結果、string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);} のような一連のヘルパー関数を通じて、MQL4コードをMQL5上で使い続けることができます。これが唯一うまくいかないのは、MQL5では非常に異なる構成になっているため、時系列のアクセスです。https://www.mql5.com/en/articles/81 のiOpenMQL4()のような関数は動作しますが、繰り返し使うには恐ろしく遅く非効率的です。
(もしまだ気になる人がいるなら、このスレッドを立ち上げたバグレポートはまだビルド535で適用されます。また、https://forum.mql4.com/56885/page20#861740、MetaQuotesがその修正に失敗したように見えますが)。
私はRaptorUKと同意見で、OOPに関するmql5.comのドキュメントは少なくとも不完全です。しかし、残念ながら、私はOOPに関する良いリファレンスを知りません。私が読んだものは、抽象的すぎるか、基本的すぎて、梨やりんごをオブジェクトの例とし、果物をクラスとしたものでした。
OOPプログラミングは、大きなプロジェクトがある場合にのみ有効です。大きなプロジェクトとは必ずしも1つのEAではなく、インジケータを使った一連のEAを構築することです。残念ながら、私は今、このことについて深く考える時間がありません。しかし、それについて何か記事を書こうと思っています。
大きなプロジェクトの一例として、Metaquotesが作成したMQL5 Wizardがあります。これは、ユーザーからの入力で5分以内にEAを作成することができます。これは、EAを構築するために必要なすべての要素を提供するmql5 Standard Librayをベースにしています。同じウィザードはおそらく手続き的な方法で行うことができますが、私の意見ではそれははるかに難しいでしょう。そして、このコードをメンテナンスしなければなりません。しかし、これらのStandard librayはドキュメントや説明が十分でないため、理解するのが難しいのです。私は、このトピック(mql5 wizard not oop)に存在するものをすべて一元化するために、このトピックを 作成しました。
あなたはプログラムの流れを説明しているのだと思います。それはOOPの背後にある大きな理念ではないと思います。(OOPは以下のような問題を解決しようとするものです。私はOOPの初心者ですが、世界観を形成しています。
1) 関数はグローバル変数から独立しているか?言い換えれば、その関数は独立したオブジェクトなのか?カプセル化
2) その関数はローカル変数名のような詳細を隠しているか?画面上のコード量が少なくなっていないか?抽象化
3) 変更のために自分自身の複製を作成する機能を備えているか?独自のデータ型を作成する機能とか?継承です。
4) オンザフライで変更する機能があるか?例:double_arrayだけでなく、integer_arrayも扱えるか?ポリモーフィズム。
OOPがEAの構築に役立つ方法は、EA_Builderがプログラマーでない人がエキスパート・アドバイザーを構築するのに役立つ方法と似ています。好きなOrder_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Error Processing Functionを使うだけです。これでExpert_Advisorの出来上がりです。長年培った取引基準定義関数を簡単に入れ替えることができるのです。
例えば、私のExpert Advisorを変更したい場合、私のグローバル変数がどこに適用され、どの関数がそれに依存しているか(ステートやステータス配列のように)を研究する必要があります。OOP はそれを Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2) と単純にし、それがエキスパート全体となるようにする。
こうすることで、他の人があなたのライブラリのセットを使うことが容易になり、通常、他の人のために機能するものは、将来的にあなたのためにも機能するようになるのです。他に何もなければ、組み立てライン上のスタンドアロン・オブジェクトを考えてみてください :)
MQL5では、クラスとOOPは非常にオプションのアドオンです。プラットフォームフレームワークはそれら自体を使用しません。例えば、プラットフォームにはOrderコレクションのようなものがあり、Orderオブジェクトのリストを含んでいて、次のようなコードを書くことができると期待するかもしれません。
しかし、そうではありません。その代わり、MQL4とMQL5の間でこれを行う方法は基本的に同じです。
(また、あなたが書くEAはExpertAdvisorクラスから派生したクラスであり、その宣言には仮想OnTickやOnInit関数といったものがあると思われるかもしれません。しかし、そのようなことはありません。MQL5フレームワークは基本的に非OOPのままですが、OOPが有用なタスクには自分でOOPを使用するオプションがあります)。
その結果、string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);} のような一連のヘルパー関数を通じて、MQL4コードをMQL5上で使い続けることができます。これが唯一うまくいかないのは、MQL5では非常に異なる構成になっているため、時系列のアクセスです。https://www.mql5.com/en/articles/81 のiOpenMQL4()のような関数は動作しますが、繰り返し使用するにはひどく遅く、非効率的です。
現在、OOPはかなり一般的で、MQLに本物のコーダーをもっと引き寄せるでしょう。しかし、メモ帳のようなエディタは、彼らのほとんどを撃退してしまうでしょう、きっと。