ベータ版530での配列リサイズの不具合 - ページ 6

 
ubzen:
***Ps:(これは忘れたくないのですが)。確かに、私たちのほとんどは、自分が使っているコードの中身がわからないというのは嫌なものです。あるいは、他の人のコードを理解しようとすることで頭がいっぱいになり、そうでなければ、おそらくそれを使うことはないでしょう。しかし、mql4のNative関数(例えばOrderSend())のほとんどは、私たちから見ればオブジェクトです。私たちはそのコードを見ることはできませんが、それを受け入れることができます。私は、このような他者のライブラリの受け入れは、大規模なプロジェクトに携わるプロのプログラマーが受け入れなければならないものだと考えています。そうでなければ、車輪の再作成に行き詰まるでしょう。
そうですね、mql4では常に車輪を再発明しているようなものです。
 
ubzen:

あなたはプログラムの流れを説明しているのだと思います。それは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) と単純にし、それがエキスパート全体となるようにするのです。

こうすることで、他の人があなたのライブラリのセットを使うことが容易になり、通常、他の人のために機能するものは、将来的にあなたのためにも機能するようになるのです。他に何もなければ、組み立てライン上のスタンドアロン・オブジェクトを考えてみてください :)

以前、このことについて調べたことがあるのですが、大抵は長々とした小説のような内容で、要点がつかめなかったのです。
 
SDC: 以前、このことについて調べたことがあるのですが、大抵は長々とした小説のような内容で、要点がよく分かりませんでした。
どういたしまして。
 
RaptorUK: 違いがあります ... ... 私は注文をしたい場合、OrderSend()を使用する以外の選択肢はありません。 私は他の人のライブラリを使うかどうかの選択権を持っています ... たとえソースが尊重されていても、私はそれを使おうとする前に理解しようとします。こうしていくつかの誤りが発見され修正されます: https://www.mql5.com/en/forum/133792/page3"そして RaptorUKの コメントに対する私の訂正 :"
ここに議論はありません。OOPはコードのバグの問題を解決するものではありませんし、他人のライブラリを使うことを強制するものでもありません。
 
RaptorUK:
私はMQL5に少し手を出しましたが、私が書いたコードではOOPを使用する必要はありませんでした。

MQL5では、クラスとOOPは非常にオプションのアドオンです。プラットフォームフレームワークはそれら自体を使用しません。例えば、プラットフォームにはOrderコレクションのようなものがあり、Orderオブジェクトのリストを含んでいて、次のようなコードを書くことができると期待するかもしれません。

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) {
    }
  }
}

(また、あなたが書く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)に存在するものをすべて一元化するために、このトピックを 作成しました。

 
ubzen:

あなたはプログラムの流れを説明しているのだと思います。それは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) と単純にし、それがエキスパート全体となるようにする。

こうすることで、他の人があなたのライブラリのセットを使うことが容易になり、通常、他の人のために機能するものは、将来的にあなたのためにも機能するようになるのです。他に何もなければ、組み立てライン上のスタンドアロン・オブジェクトを考えてみてください :)

ポリモーフィズムを除けば、良い概要だと思います。関数がdouble_arrayと同様にinteger_arrayを扱えるか」というのは、ポリモーフィズムの話ではなく、関数のオーバーロードの 話です。mql5でもoperator overloading(間違ってoperation overloadingと訳されています)は可能です。OOPとポリモーフィズムはそれ以上のものです。私は詳しく説明する時間がないので(特に英語で)、mql5 introduction to polymorphismを 読むことをお勧めします。
 
cyclops993:

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()のような関数は動作しますが、繰り返し使用するにはひどく遅く、非効率的です。

そうですね。mql5はmql4よりも「低」レベルの関数を多く提供していることを付け加えます。例えば、多くの人がiBarShift()がmql5に存在しないことに文句を言っています。しかし、mql5はより詳細な関数を提供しているので、自分でiBarShift() を作ることができますし、oopも提供しているので、どんなプロジェクトでも簡単に再利用することができます(もちろん、oopは再利用するために必須ではありません)。私の英語はまだ初歩的な ものなので、私の説明が明確であるかどうかはわかりません。
 
Ovo:

現在、OOPはかなり一般的で、MQLに本物のコーダーをもっと引き寄せるでしょう。しかし、メモ帳のようなエディタは、彼らのほとんどを撃退してしまうでしょう、きっと。

mql5のメタエディタ(または、それと同じ新しいmql4エディタ)は試されましたか?多くの改良がなされています。