mt4 (MetaTrader4)使い倒シストレ

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


にほんブログ村 為替ブログ FX システムトレード派へ
--/--/--(--) --:--:-- | スポンサー広告 | Trackback(-) | Comment(-)
グローバル変数を使わずに健康的に
グローバル変数を、皆さんは多用していらっしゃいまっか?もうかりまっか?

これはほとんどのプログラミング言語に言えることですが、
必要以上のグローバル変数を使うことは、あまりお薦めできません。


それはこちらの説明に書いてありますので、文章で語ることは割愛します(文字での説明が面倒臭いわけではないですよ?(笑))。
その他にもグローバル変数多用の弊害については、様々なサイトに載っていると思うので、一度調べてみてはいかがでしょうか(文字での説明が面倒臭…(略))。

さて、文章で語るよりも、具体的にMQL4プログラムで説明しましょう。
以下のコードを見てください。


/**
* グローバル変数乱用サンプル
* 特に何をするでもなく…
*/
//--- Global variables
double Ma1;
double Ma2;
double Ma3;
double Ma4;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
Comment("");
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
Ma1 = iMA(Symbol(), Period(), 14, 0, MODE_SMA, PRICE_CLOSE, 0);
Ma2 = iMA(Symbol(), Period(), 21, 0, MODE_SMA, PRICE_CLOSE, 0);
Ma3 = iMA(Symbol(), Period(), 14, 0, MODE_EMA, PRICE_CLOSE, 0);
Ma4 = iMA(Symbol(), Period(), 21, 0, MODE_EMA, PRICE_CLOSE, 0);

SetMA();

Comment(Ma1, "\n", Ma2, "\n", (Ma1 - Ma3), "\n", (Ma2 - Ma4), "\n");
return(0);
}

//+------------------------------------------------------------------+

void SetMA()
{
Ma1 = iMA(Symbol(), Period(), 21, 0, MODE_SMA, PRICE_CLOSE, 0);
Ma2 = iMA(Symbol(), Period(), 14, 0, MODE_SMA, PRICE_CLOSE, 0);

Ma3 = iMA(Symbol(), Period(), 21, 0, MODE_EMA, PRICE_CLOSE, 0);
Ma4 = iMA(Symbol(), Period(), 14, 0, MODE_EMA, PRICE_CLOSE, 0);
}


私はこのようなプログラムを見ると、鬱になってしまいますが、みなさんはいかがでしょうか?
グローバル変数は、どの関数からも参照(アクセス)することができます。
この例では、start、SetMAの2つの関数で、グローバル変数Ma1~Ma4を参照しています。

今は短いプログラムなので動作を理解するのは簡単ですが、
非常に長く、グローバル変数が乱用されているプログラムを理解するには、多くの労力と時間を要します。


またグローバル変数を利用すると、関数の再利用性が落ちてしまいます。
例えば、他のMQL4プログラムでSetMA関数を利用したい場合、SetMA関数本体とSetMA関数内で使われているグローバル変数を全て記述しなければなりません。
関数はプログラム内で独立性が高ければ高いほど、再利用性が高まるのです。




①プログラムの動作を理解するのに時間と労力がかかる
②プログラム(関数)の再利用性が落ちる


以上の2点を考慮した場合、上記のプログラムは以下のように記述したほうがいいと思います。

int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
Comment("");
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
double Ma1, Ma2, Ma3, Ma4;

Ma1 = iMA(Symbol(), Period(), 14, 0, MODE_SMA, PRICE_CLOSE, 0);
Ma2 = iMA(Symbol(), Period(), 21, 0, MODE_SMA, PRICE_CLOSE, 0);
Ma3 = iMA(Symbol(), Period(), 14, 0, MODE_EMA, PRICE_CLOSE, 0);
Ma4 = iMA(Symbol(), Period(), 21, 0, MODE_EMA, PRICE_CLOSE, 0);

SetMA(Ma1, Ma2, Ma3, Ma4);

Comment(Ma1, "\n", Ma2, "\n", (Ma1 - Ma3), "\n", (Ma2 - Ma4), "\n");
return(0);
}

//+------------------------------------------------------------------+

void SetMA(double &ma1, double &ma2, double &ma3, double &ma4)
{
ma1 = iMA(Symbol(), Period(), 21, 0, MODE_SMA, PRICE_CLOSE, 0);
ma2 = iMA(Symbol(), Period(), 14, 0, MODE_SMA, PRICE_CLOSE, 0);

ma3 = iMA(Symbol(), Period(), 21, 0, MODE_EMA, PRICE_CLOSE, 0);
ma4 = iMA(Symbol(), Period(), 14, 0, MODE_EMA, PRICE_CLOSE, 0);
}




ただ、どうしてもグローバル変数を使わなければならない状況もあると思います。
そういう場合はグローバル変数を必要最小限に抑える努力をしてみましょう。
その創意工夫がプログラミング力の向上になると考えています。



健康的なソースファイル作りにお役立てください。

にほんブログ村 為替ブログ FX システムトレード派へ
Comment
≪この記事へのコメント≫
&ma1
の「&」とは一体どういう役割をする物でしょうか?

また、
void SetMA

start のMAで
MAが重複していると思うのですが
そういった場合どうなるのでしょうか?
2009/01/31(土) 09:13:50 | URL | Ma #-[ 編集]
>Ma さん

こんにちは!
ご質問ありがとうございます。

このご質問の回答で一つ記事が書けそうですので、
記事にて解説しますね。
2009/02/11(水) 17:25:58 | URL | googolyen #F7lUkdrY[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
Secret: 管理者にだけ表示を許可する
 
Trackback
この記事のトラックバックURL
≪この記事へのトラックバック≫
Designed by aykm.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。