MQL4 複数の値を戻す参照渡しのやり方

MQL4の関数でreturnは基本的に1つだけですが、複数の戻り値を返したい場合があります
そういう場合は、参照渡しというやり方で、構造体やクラスを使うことで可能にできます

値渡しと参照渡し

 

MQL4の関数で使われる引数にはvalue、値渡しとrerence、参照渡しの2種類あります
 

Passing Parameters - Functions - Language Basics - MQL4 Reference
 
但し、例外として、配列や構造体、クラスオブジェクトに引数を入れる場合は
参照渡しのみになります

値渡しは、そのパラメータの値をそのまま引数に渡すのに対して
参照渡しは、そのパラメータが格納してあるメモリアドレスを渡します
渡された方はそのアドレスを辿るとその値が確認できるわけです
(ポインターとの違いは初期化などの制約が厳しい)

関数などで何らかの処理がなされそのパラメータに変化があった場合に
関数外ではそのアドレスを辿れば変化した値が分かるわけです
 

 

値渡し

 

例えば値渡しのケースですが、
2つのパラメータにそれぞれ値をシフト+5をさせる場合このようにできます

TestSeveralReturns.mq4

ストラテジーテスターでテストしてみると
param1, param2 がそれぞれ+5のシフトがなされているのを確認できます

関数を2回繰り返していますが、パラメータが2つくらいならいいですが
数が多くなったりパラメータの型が変わる場合はとても煩雑になります

 

参照渡し

 

このシフト+5を参照渡しで組んでみます
関数の引数にパラメータを入れて、関数側ではその「&」パラメータを参照するアドレスを入れるようにします

まとめると

結果は値渡しと同じように、+5シフトした値になっています

蛇足:「&」の呼び方はよくアンパサンドと表記されていますが、綴りは Ampersand なので
アンパーサント[ǽmpərsæ`nd]と言ってましたけどね(欧州人には)

 

配列の参照渡し

 

引数が2つならなんとかできますが、6つになると冗長的にならざるえません
その場合は配列にして参照渡しにすれば簡単にできます

配列を使った参照渡しです

シフト+5を実行する関数

TestSeveralReturns.mq4

ストラテジーテスターでテストしてみると
arrTestAの各要素が+5のシフトがなされているのが確認できます

 

構造体の参照渡し

 

引数のパラメータが同じ型であれば配列でいいのですが、異なる型の場合は(struct)構造体で作成します

それぞれのパラメータが処理されているのが分かります

 

クラスの参照渡し

 

クラスの引数も参照渡しです
簡単な配列を渡す例です

この例は配列とあまり変わりません
クラスを使う時は参照渡しであることを考慮しないといけません




シェアする

  • このエントリーをはてなブックマークに追加

フォローする