学童のためのEOPです。 - ページ 16

 

モデレーターの方には、すべての議論を別スレッドにまとめていただくようお願いします。このような、OOPの利点を論じたスレッドは何十本とあるのではないでしょうか。

 
Alexey Viktorov:

もうひとつ、変数の宣言、ポインタの取得/作成、オブジェクトのインスタンスの作成はどう違うのでしょうか。違いではなく、どのような場合に使うのが良いのか。例えば、ポジションを開くための変数を宣言するだけでも十分です。

そして、どんな場合にポインターを使った方がいいのか、どんな場合にオブジェクトのインスタンスがないとやっていけないのか、などです。

ある方法と別の方法の長所と短所は何ですか?

1.オブジェクトがグローバルスコープに ある場合、それは静的オブジェクトです。静的メモリに配置され、プログラムが存在する限り存在します。

そのコンストラクタは、プログラムの最初の関数を呼び出す前に呼び出されます。デストラクタは OnDeinit()の後に呼び出される。

2.関数内部で宣言されたオブジェクトはローカルオブジェクトとなります。スタックに配置される。関数を終了する際に破棄されます。
中括弧の中にローカルオブジェクトを宣言することができます。


例えば、こんな風に。

if( ... )
{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

あるいはこんな感じでも。

{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

ブロックから出るときに破壊されます。破壊されるときは、デストラクタが呼ばれる。

通常、スタックの大きさには制限があるため、非常に大きなオブジェクトはスタックに置くことができない。

3.new演算子で生成されたオブジェクトは動的メモリ(ヒープ)に存在します。
それらは、delete演算子によって明示的に消去されるまで存在する。


void func()
{
  Myclass* pObject = new MyClass();
}

この例では、2つの変数が作成されています。ヒープにあるMyClassクラスのオブジェクト。

そして、pObject 変数は MyClass へのポインタです。この変数には、ダイナミックメモリ内のオブジェクトのアドレスが代入される。

この関数を終了するとき、変数pObjectは破棄されますが、オブジェクトはダイナミックメモリに残ります。

削除できるようにするためには、そのアドレスがどこかに保存されている必要があります。

また、生成・破棄の際には、コンストラクタとデストラクタが呼び出される。

動的変数は、一般的にローカル変数よりもアクセスに時間がかかります。


オブジェクトを作成する際には、これらすべてを考慮する必要があります。


 
Koldun Zloy:

1.オブジェクトがグローバルスコープに ある場合、それは静的オブジェクトである。静的メモリに配置され、プログラムが存在する限り存在する。

...

そして、誰も何も言わない、ジクスパートさえも。
 
Koldun Zloy:

このオプションの場合、次のように考えてよろしいでしょうか?

#include <Trade\Trade.mqh>
CTrade trade;

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade trade;
 trade.Buy(0.1);
}

コンパイラの警告を 考慮せずに、ポジションが123と等しくないマジックナンバーで開かれる可能性がある ?

つまり、OnTick関数内で新しいオブジェクトが生成され、その中でマジシャンは123に等しくなることはない。

 
Alexey Viktorov:

このオプションの場合、次のように考えてよろしいでしょうか?

コンパイラの警告を 考慮せずに、123以外のマジックナンバーでポジションが開くことがある ?

つまり、OnTick関数で新しいオブジェクトが生成され、その中でマジシャンは123に等しくならない。

セットエキスパート・マジック・ナンバー

 
Alexey Viktorov:

このオプションの場合、次のように考えてよろしいでしょうか?

コンパイラの警告を 考慮せずに、ポジションはマジックnot123で開くことができる?

つまり、OnTick関数で新しいオブジェクトが作成され、そのオブジェクトは123のMagicNumberを持ちません。

はい、その通りです。これらは、2つの異なるオブジェクトです。OnTickのローカルオブジェクトは、グローバルオブジェクトと同じ名前なので、OnTick関数内でアクセスできるのは、そのオブジェクトのみです。グローバルオブジェクトはスコープ外です。したがって、ローカルトレードオブジェクトには、MagicNumber はまだ設定されていない。

 
Alexey Viktorov:

このオプションの場合、次のように考えてよろしいでしょうか?

#include <Trade\Trade.mqh>
CTrade trade;   // Объект № 1 в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade trade;  // Объект № 2 в локальной области OnTick()
 trade.Buy(0.1);
}

コンパイラの警告を 考慮せずに、ポジションはマジックnot123で開くことができる?

つまり、OnTick関数内で新しいオブジェクトが生成され、その中でマジシャンは123にならない。

変数のときとまったく同じです。

そして、フォーカス。

#include <Trade\Trade.mqh>
CTrade trade;   // Объект trade в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade *trade_ptr=GetPointer(trade);  // Указатель на объект trade
 trade_ptr.Buy(0.1);
}
 
そもそも、このSetExpertMagicNumberは なぜ必要なのでしょうか
 
Сергей Таболин:
そもそも、このSetExpertMagicNumberは なぜ必要なのでしょうか

トレードクラスのオブジェクトにマジックナンバーを設定します。現在kodobaseで行われているように、プログラム全体に対して複数のCTradeクラスオブジェクトが存在することが可能です。これはオブジェクトです。このオブジェクトは、取引操作を 行うために使用される。プログラム全体で1つのオブジェクトを作成し、新しいマジシャンやスリップなど、初期化時に設定したパラメータを変更する必要があるたびにリセットする必要がありません。取引するシンボル毎にトレーディングオブジェクトを作成し、この CTrade クラスの特定のオブジェクトが属するシンボルのプロパティに従って必要なパラメータを設定し、必要なシンボルから必要なトレーディングクラスのオブジェクトへのポインタを取得することにより、そこで設定したパラメータをオーバーライドせずに簡単に取引することが可能である。
他のマジシャンと仕事をするためには、適切な設定をした別の取引オブジェクトを定義することができます。1つのEAに複数のウィザードが存在することもあります。

何をどのように使うか、その理解にかかっているのです。

 
Artyom Trishkin:

トレードクラスのオブジェクトにマジックを設定します。kodobaseで通常行われているように、プログラム全体に対してCTradeクラスのオブジェクトを1つだけ持つことはできません。 これはオブジェクトです。このオブジェクトは、取引操作を 行うために使用される。プログラム全体で1つのオブジェクトを作成し、新しいマジシャンやスリップなど、初期化時に設定したパラメータを変更する必要があるたびにリセットする必要がありません。取引するシンボル毎にトレーディングオブジェクトを作成し、この CTrade クラスの特定のオブジェクトが属するシンボルのプロパティに従って必要なパラメータを設定し、必要なシンボルから必要なトレーディングクラスのオブジェクトへのポインタを取得することにより、そこで設定したパラメータをオーバーライドせずに簡単に取引することが可能である。
他のマジシャンと仕事をするためには、適切な設定をした別の取引オブジェクトを定義することができます。何しろ、1つのEAに複数のウィザードが存在することもあるのですから。

何をどのように使うか、その理解にかかっているのです。

その場合、それは

SetExpertMagicNumber
Устанавливает идентификатор эксперта

不正確な記述?

私の理解では、EAに設定すれば、どんな注文/ポジションでもこの魔法がかかるはずです。((