mt4 (MetaTrader4)使い倒シストレ

メタトレーダー、自作インジケータ、自作EAで完全自動売買。使えるものは何でも使え。
インジケーター、EA(自動売買システム)製作のご依頼はこちらへ
Googolyen FX Factory
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


にほんブログ村 為替ブログ FX システムトレード派へ
--/--/--(--) --:--:-- | スポンサー広告 | Trackback(-) | Comment(-)
参照渡しに関するご質問
参照渡しは、とても便利かも!記事内で
記載したコードについてご質問がありましたので、
今回の記事をもって回答という形にさせていただきます。

【ご質問内容】
例えば(1)void func(int &arg0){処理}
と(2)int func(int arg0){処理~return(arg0)}
この2つ結果は同じと思うのですが、どう使い分ければよいのでしょうか?


int func1(int arg0) {
arg0++;
return (arg0);
}

void func2(int &arg0) {
arg0++;
}

int start()
{
int hoge = 1;
int hogehoge = 1;

hoge = func1(hoge);

func2(hogehoge);

Comment("hoge = ", hoge, "\n",
"hogehoge = ", hogehoge);

//結果
//hoge = 2
//hogehoge = 2
}


結果を見て分かるように、使い方は異なるにしろ、二つの関数(func1とfunc2)は同じ動作をします。
違う点は

  • 変更した結果を返しているか
  • 参照渡しをして引数の値自体を変更しているか

の違いだけです。

今回のご質問は『返り値を返す関数と、参照渡しを使った関数の使い分け』ということでしたので
そこに主眼を置いてご説明したいと思います。
つまり、この記事にある『便利な使い方』を除いた場合の、参照渡しの有用性を主観的にご説明します(笑)。


まず結論から言うと

値を得ることが目的であれば、返り値を使い
値の変更が目的であれば、参照渡しを使う


だと思います。

例えば、『MACDとRSIの状態からシグナルを発生させる関数』を作るとしましょう。

そこで二つの関数を書いてみました。
一方はシグナルを返り値として返す関数(MacdRsiSignal関数)、
もう一方はシグナルを参照渡しによって変更させる関数(MacdRsiSignal2関数


#define SELL_SIGNAL -1
#define BUY_SIGNAL 1
#define NO_SIGNAL 0

int MacdRsiSignal(double macd, double rsi)
{
//ふにゃふにゃ処理
//

if (BUY条件)
return (BUY_SIGNAL);
else if (SELL条件)
return (SELL_SIGNAL);
else
return (NO_SIGNAL);
}

void MacdRsiSignal2(int &signal, double macd, double rsi)
{
//ふにゃふにゃ処理
//

if (BUY条件)
signal = BUY_SIGNAL;
else if (SELL条件)
signal = SELL_SIGNAL;
else
signal = NO_SIGNAL;
}

int start()
{
double macd = iMACD(/*省略*/);
double rsi = iRSI(/*省略*/);
int signal1, signal2;

// 返り値によってシグナルを得る
signal = MacdRsiSignal(macd, rsi);

// 参照渡しによってシグナルを変更する
MacdRsiSignal2(signal2, macd, rsi);
}



この二つの関数を見て
『MACDとRSIの状態からシグナルを発生させる関数』
を作ろうとした場合、どちらが感覚的にしっくり来るでしょうか?

私としましては、MacdRsiSignal関数の方がしっくりします。
それは
今回作ろうとしている関数を、参照渡しによって値を変更するという方法によって実装してしまうと、シグナル発生という目的に合わない
からです。


では次の例を。
『シグナルを逆方向に変更する関数』を作るとします。
つまりBUYシグナル→SELLシグナル、SELLシグナル→BUYシグナルに変更するような関数です。
もうこの時点で、どちらを使うか分かっちゃいますね(笑)
結果は分かっていても、コードを見てみましょう!

ConvertIntoOpposite1関数は、逆シグナルを返す関数。
ConvertIntoOpposite2関数は、参照渡しによって、逆シグナルに変更する関数。



#define SELL_SIGNAL -1
#define BUY_SIGNAL 1
#define NO_SIGNAL 0

int MacdRsiSignal(double macd, double rsi)
{
//ふにゃふにゃ処理
//

if (BUY条件)
return (BUY_SIGNAL);
else if (SELL条件)
return (SELL_SIGNAL);
else
return (NO_SIGNAL);
}

int ConvertIntoOpposite1(int signal)
{
if (signal == BUY_SIGNAL)
return (SELL_SIGNAL);
else if (signal == SELL_SIGNAL)
return (BUY_SIGNAL);
else
return (NO_SIGNAL);
}

void ConvertIntoOpposite2(int &signal)
{
if (signal == BUY_SIGNAL)
signal = SELL_SIGNAL;
else if (signal == SELL_SIGNAL)
signal = BUY_SIGNAL;
else
signal = NO_SIGNAL;
}

int start()
{
double macd = iMACD(/*省略*/);
double rsi = iRSI(/*省略*/);
int signal1, signal2;

// 返り値によってシグナルを得る
signal = MacdRsiSignal(macd, rsi);
signal2 = MacdRsiSignal(macd, rsi);

// 参照渡しによってシグナルを逆転させる
ConvertIntoOpposite2(signal);

// シグナル逆転させた結果を返す
signal2 = ConvertIntoOpposite1(signal2);
}


この例だと『値の変更が目的』ですので参照渡しを行っているConvertIntoOpposite2関数がしっくりきます。


今回示した例は私の主観的な意見です。

「この場合は参照渡しの方がしっくりする」
という考えがございましたら、ご自身のフィーリングを大切にして頂きたいと思います。

開発するのは他でもなく、あなたなのでっす。

にほんブログ村 為替ブログ FX システムトレード派へ
スポンサーサイト
NR7に関して
以前製作した自作インジケーターの
NR7にバグがありました。

修正版をブリーフケースにアップしてありますので、
以前ダウンロードされた方は新しいファイルをお使い下さい。

このNR7は使っている方が多い印象がありますので、
恐らく多くの方にご迷惑をお掛けしたと思います。

大変申し訳ございません。

にほんブログ村 為替ブログ FX システムトレード派へ
以前作ったGoldenV3signalに関して
以前作った複合インジケーターの
GoldenV3signal
で、メール送信機能が欲しいというご連絡を受けましたので、
メール機能をつけて改良しました。

yahooブリーフケースの中のファイルに上書きしてありますので、
お使いくだされ!




にほんブログ村 為替ブログ FX システムトレード派へ
Designed by aykm.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。