注文が選択されているかどうかを確認する方法 - ページ 19

 
原理的にはそうですが、「ポインタ」はそれ自身のポインタを持っていなければなりません。 私の提案した関数について考えてみてください、それは普遍的な解決策のように思えます。もちろん、そのようなコードの速度についての問題はありますが、それは3番目の問題のように思えます。
 
FAQ:
もちろん、そのようなコードの速度に関する問題はありますが、それは3番目の問題であるように思われます。

ありがとうございます。いつも建設的な会話ができることを嬉しく思います。

 
Ant_TL:

つまり、プログラム中の関数Aがループの中で何らかの順序を選択した後、ライブラリから補助関数Bを呼び出した場合、Bが途中で別の順序を選択したとしても、関数Aでの順序選択はリターンに影響されないはずです。

関数の値を変数に入れるのであれば、そうです。そうでない場合、この関数はグローバルであり、最初の呼び出しで変更することができます。
 
Ant_TL:

ありがとうございます。いつも建設的な会話ができることを嬉しく思います。


どういたしまして。ただ、結論を急ぐな。
 
Roger:
関数の値を変数に格納する場合は、そうです。そうでない場合、この関数はグローバルであり、最初の呼び出しで変更される可能性があります。

少し混乱しています。つまり、メインプログラムのモジュール内で関数A()からライブラリ関数B()を呼び出し、例えば、単純にリストの最初の順番を選択する(先験的に順番があると仮定する)ような状況です。

void B(){。

OrderSelect(0,SELECT_BY_POS)です。

}

この関数が呼ばれた後、ライブラリからメインモジュールに制御が戻ったときに、OrderTicket()やその中の注文が事前に選択されていることを期待する他の関数を呼ぶと、全く同じ4105エラーが出ます。しかし、メインモジュールで関数 Bを呼び出す前に、他の順番がすでに選択されていた場合、ライブラリで新しいSelectがあっても、その順番は選択されたままになります。

しかし、同じ関数Bをメインモジュールの関数Aから呼び出すと、Bを呼び出す前に関数Aで選択されていた順序が順序0に変わる(つまり、Bを呼び出す前に現在選択されていた順序が何であっても、関数Bから戻った後に現在選択されている順序は順序0になる)。

したがって、OrderSelectを使う関数を単体で呼び出す場合は、この関数から戻ったときに、この関数を呼び出す前に選んでおいたオーダーが後で使えるようにする必要があります。それを確認しないと、コードの中に見つけにくい論理的なエラーが発生する可能性があります。

 
Ant_TL:

具体的には、現在の順序選択の状態である「ポインタ」はモジュール内でグローバルであり、つまりこのポインタはライブラリでは同じで、プログラムモジュールでは異なる。つまり、プログラム中の関数Aがループ内で何らかの順序を選択し、ライブラリから補助関数Bを呼び出した場合、その動作中にBが別の順序を選択しても、関数Aでの順序選択はリターン時に変更されてはいけないということである。しかし、両方の関数がモジュール内にある場合、B関数から戻るとき、A関数の作業の論理がその時点で破られないように、A関数自身またはB関数が作業を開始・終了するときにBが呼ばれる前後のいずれかの現在の順序選択を記憶し、復元する必要があります。


あなたの言いたいことは明確です...

チケット番号が変数に格納され、後で(次のティックで、バイチケットがオープンされた場合など)使用される、人気のExpert Advisorの構成と類似していると思うのですが......。

最後に開いた注文のチケットを取得したい場合は、この注文のプロパティ、OrderSelect()を使用すればすべてうまくいくでしょう。つまり、Expert Advisorは、端末内の電気や他のExpert Advisorの動作に関係なく、いつでも取引戦略の状態を「理解」し、その状態に従って行動しなければならないのです。

Ant_TL:

この関数を呼び出した後、ライブラリからメインモジュールに制御が戻ったときに、OrderTicket()関数やその中のあらかじめ注文が選択されるように設計された他の関数を呼び出すと、まったく同じ4105エラーが出ます。しかし、メインモジュールで関数Bを呼び出す前に、すでに他の順番が選択されていた場合、ライブラリで新たにSelectを呼び出しても、その順番は選択されたままとなります。

このように機能することが証明されている、あるいは、このように機能すると思っているのですか?


私には、モジュールとライブラリの区別はありません。一旦コンパイルされたコードは、単一の構成要素として機能します。


OrderSelect()が呼び出さ れると、最後に選択されたオーダーと同じOrderTicket()が返されます...

こんな感じでいいんじゃないでしょうか...。

 
keekkenen:

それとも、そうだと思いますか?

私には、モジュールやライブラリという区分はありません。コンパイル後のコードは、ひとつのコンストラクトとして機能します。

OrderSelect()が呼び出されるたびに、最後に選択されたオーダーと同じOrderTicket()が返されます...

こんな感じでいいんじゃないでしょうか...。

ライブラリで選択された順番が、メインモジュールで返されるときに選択された順番にならないことを確認しました。したがって、まだ確認していませんが、論理的に選択されている順番は、メインモジュールで最後に選択された順番になるはずです。

私自身は、以下のようなインクルードライブラリファイルmqhにライブラリ関数のラッパーを作成することで、この問題を解決しました。

bool GetOrder(int a=0){
return(OrderSelect(_GetOrder(a),SELECT_BY_TICKET));
}.

ちなみに、ライブラリ関数にデフォルトのパラメータを渡すこともできない。

ここで、_GetOrder(int a)は、ある順序を見つけて返すライブラリ関数そのものである。この関数は、ライブラリから明示的なパラメータ "a "で呼び出され、ラッパー関数ではデフォルトで0となり、さらに、ライブラリ関数での選択が「受取人」に届かないため、ラッパーで返されたチケットはメインプログラムのモジュールで新たに選択されることになります。

 

私もそう思います。この関数がどこから呼ばれても、特定の順番で選択されたパラメータのセットが与えられ、次にこの関数が呼ばれるまで、ソフトウェアはそのパラメータを変更することはありません。

他になぜこの機能を、全く不要な追加機能で包むのでしょうか?

PYSYSアドバイス - 静的な整数変数を作成し、開いた後に順序の値を渡すと、それはあなたがそれをしたいと思うまで、変更されませんし、あなたが計画したものを正確に実行されます。

 
Ant_TL:

メインモジュールに戻った時に、ライブラリで選択した順番が選択された順番になっていないことを確認しました。したがって、論理的には、メインモジュールで最後に選択された注文が、リターンで選択されるはずです。

この文は、コンパイルされたモジュール(ライブラリ)のみ(librariesフォルダの*.mg4-libraries)について話している場合、真となります。メインコンパイルファイル(*.mgh-library)の一部であるモジュールの場合、この記述は正しくありません!
 
TarasBY:
ライブラリフォルダ内の*.mg4-librariesのみをコンパイルしたモジュール(ライブラリ)について述べている場合、この文は正しいです。メインコンパイルファイル(*.mgh-library)の一部であるモジュールの場合、この記述は正しくありません!

MQHは独立したモジュールではなく、メインモジュールに挿入され、別のファイルに配置されています。だからもちろん、別の.ex4ライブラリについて話しているのです