MQL5におけるOOPに関する質問 - ページ 29

 
Dmitry Fedoseev:

そう、ここにも明確な答えのない疑問が次々と湧いてくるのです。自分のクラスを継承する必要がある場合 - 継承するのと、新たに拡張版を書くのと、どちらが良いでしょうか。

最終的に何を求めるかは、一般的な考え方によると思います。

クラスを他の場所で使用する予定がある場合は、継承を行わずに完全なものにする必要があります。

私の例では、CError クラスは GetLastError() を取得し、説明を付けてアンセットし、エラーの値 (int) を返すことができます。 私はこれをどこでも使うつもりです。とにかく、静的変数に言語を定義するコンストラクタとエラーテキストを返すケースしかないのです。

しかし、もう一つ便利なメソッドがあります - bool ServerDisable(); - これはサーバーの可用性を定義します(マルチプラットフォームMT4/МТ5コード)、非常に良い機能です。

.....

しかし、最終的にはCOrderのオブジェクトとして使うことになるわけで、それ以外の使い道があるでしょうか?


サービス機能ライブラリはリンカと一緒にインクルードした方が楽だし、コンパイラが勝手に使わない部分を実行ファイルにインクルードすることもない。

クラス全体は手続き型で非常にコンパクトになります。私は、注文を開く関数の例を示しましたが、注文のボリュームを静的定数に格納することができますhttps://www.mql5.com/ru/forum/85652/page17#comment_12805083

 
Dmitry Fedoseev:

限度額内であることが本当に重要なのでしょうか?制限を守ることが大事なら、関数も書けばいいんです。

クラスを使わないと、不便な呼び出しシグネチャに悩まされるというメッセージの文脈で答えたのです。 悩まされる必要がないことを示しました。

 
Alexey Navoykov:
コンストラクタにシンボル名を渡して、クラスを柔軟かつ汎用的にすることを妨げるものは何ですか? ポートフォリオトレードの可能性を原則と考えないのですか?

すべてにおいて

でも、これまでは研究に徹してきました。今は、MMの1000と1の方法と、オーダーシステムのいろいろなトリックを研究する準備がほとんどできています ))) 。

しかし、やはり最終的にはあまり柔軟性がないと思うので、手続き型スタイル+オーダー処理機能をうまくチューニングした小クラスが良いのではないかと、すでに上で2回ほど書いています。

今は自分のアイデアのテストに切り替えて、コードのどこをよく編集して、どこをそのままにしておくかを確認するつもりです。

 
Igor Makanu:

.....

しかし、最終的にはCOrderのオブジェクトとして使用されます。


トレイリングバーはメインのロジックとは関係ないので別物です。存在しないかもしれないし、全く存在しないかもしれない。

***

トレイリングバーなどのメンテナンス機能は1つのクラスの子孫とし、そのインスタンスは配列で作成する。関数が有効な場合は、配列にインスタンスが追加され、実行される。全ての機能を無効化した場合、配列は空となり、不要なifは実行されない。EAに100本以上のトレーリングバーを挿入しても、実行速度に影響はありません。

 
Alexey Navoykov:
そんなことではダメなんです。少なくともBid()とAsk()の両方を呼び出す必要があります。 あなたのコードは単なる変数のように見え、その値が変化しないように見せていますが、実際にはそうではありません。

MT4ではBidとAskで、Creatorの気まぐれでこのシンプルな使い方と現在の価格を取得することができません。)

fxsaber

私は以下のような方式で、特に問題は発生していません。

  1. TCと書くのはテスターのためだけです。ログやエラーハンドラなどはありません。コードは非常に簡潔で理解しやすく、OOPで行えば変更も可能です(ただし、決定的なものではありません)。すでにKBに例を掲載しています。ボーナスは高速な最適化 です。
  2. 主にテスター用と独立したブロックで利用できるようにすることです。売買シグナルの生成-1ブロック。シグナルトレード - もう一つのブロック
  3. リアルアカウントへの転送は、常に複数の同じ動きで行われます。TSは、コードを変更することなく、仮想環境に置かれる。複数のTSを一つの環境に置いたり、それぞれのTSを独立した環境に置いたりする場合、OOPは特に便利である。そして、コピー機(マーケットにはコピー機がたくさんあるので、人々はコピー機の論理に長けています)を使って、取引や注文を仮想環境から現実の環境にコピーするだけです。
  4. この方式なら、TSの書き込みも素早く簡単にできます。リアルへの移行は(本当に稀なことですが)いつも均一で迅速かつ明確な方法で行われます。

は、このコードのことを言っているのでしょうか?https://www.mql5.com/ru/code/22770

正直言って、あなたのコードを読んで驚きましたが、あなたはもっと洗練された書き方をしていますね。

 
Igor Makanu:

MT4ではBidとAskのままであり、クリエイターの気まぐれでこの単純な使用と現在の価格を取得することができません。)

しかし、その値は現在のイベント処理の 中では不変です(もちろん、RefreshRatesを強制的に呼び出さない限り)。 ですから、それらは関数ではなく変数です。 そして、あなたの関数は変数のように見えます。

 

FPに数百メガバイト、数ギガバイトのデータアレイを管理・処理するという現実的なタスクを与えると、彼らのおとぎ話のようなメッセージモデル(データは不変)はすべて地獄に落ちるでしょう。

こういうのは理論派で、現実のタスクから脱却して架空の世界で放送するのがギリギリ :) テレ朝ネタはアホみたいなデータパス。

実際、複雑さに対抗する唯一のチャンスは、複雑さをオブジェクトに詰め込むことなのです。
 
Alexey Navoykov:

しかし、その値は現在のイベント処理の 中では変更できません(RefreshRatesを強制的に呼び出さない限り)。 したがって、それらは関数ではなく変数です。 そして、あなたの関数は変数のように見えます。

あなたの例で議論されている問題をどう説明したらいいのか分からないので、人間的に説明してみます。最初のPentium-90 PCを持っていた私にとっては、便利に使うために、レジスタ値をスタックに置くことを意味する関数呼び出しが追加されるのは痛いだけです...と...行ってみましょうか。

今はすべてがプロセッサレベルで繰り返しキャッシュされるようになり、コンパイラの開発者は「関数呼び出しから関数呼び出し」をより効率的にするのではないかと思っているのだが......。

という場合は、以下のような例になります。

#define  Ask(dummy) SymbolInfoDouble(_Symbol,SYMBOL_ASK)
#define  Bid(dummy) SymbolInfoDouble(_Symbol,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask());
   Print("Bid = ",Bid());
  }

あるいはこんな感じ。

#define  Ask(symbol_) SymbolInfoDouble(symbol_,SYMBOL_ASK)
#define  Bid(symbol_) SymbolInfoDouble(symbol_,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask(_Symbol));
   Print("Bid = ",Bid(_Symbol));
  }
 
Dmitry Fedoseev:

Vasiliy、この記事はあなたにとって非常に有益なものでしょう - OOPのためにOOPを絞り出すことで自分を苦しめるのはやめましょう。

MTの機能的なフレームワークのアイデアがあるんです。そこでは、ほとんどOOPはないでしょう。関数や「モナド」などの擬似的なFP機能のみ。MQLで本格的なFPを作るのは無理なので、全部引用符で書いています。

 
Dmitry Fedoseev:

コメントは不要です。

というのは、お互いにあまり好きではないのか、あるいは逆に、2人のゲイが自分たちの逃げ道を探しているのか......。)

ところで、私はあなたの記事が好きです。専門家のはダサい、弱い、しかし、私は彼が同じくらい好きです。

で、私はゲイではありません。

理由: