FX自動売買ソフト設計・開発

システムコンサルティング

MQL4 関数(メソッド)について

約 6 分



私はEAクリエイターとして食べていく為になるべく時短するようにしています。
ご依頼を受ける度に1から作成していては時間がいくらあっても足りません。
1度書いたコードは2度書かないような工夫をしています。その為に絶対必要なことが自作の関数(メソッド)
なのです。

具体的にはどうするのか?

mqhというファイルに関数をまとめています。

ですが今回はmqhは省いてmq4ファイル内でも関数(メソッド)を記述することは可能なので
簡単なところから説明してみたいと思います。

ウィザードから新規作成すると下記の構成が表示されます。
int OnInit() ※EA起動の際に1度だけ処理される。
void OnDeinit(const int reason) ※EAを停止した際に1度だけ処理される。
void OnTick() ※ティック取得毎に処理される。

上記3つ以外の場所に作成します。

自作関数の例を書いてみます。

パーフェクトオーダーの自作関数を作ってみました☆
こんな長いコードを毎回記述するのは嫌ですよね?
関数(メソッド)化してしまえば、これからこのコードはプログラム資産として使い回すことができます。
結論から言うと、
int PO = PerfectOrder(5,8,50,200,MODE_SMA);
この呪文1行で下記の結果が呼び出されます。
分解して考えてみましょう。


int PerfectOrder 型がintなので整数を返します。( -2147483648 ~ 2147483647 )
int TimeFrames 型がintでタイムフレームを意味させているので時間足の整数が入ります。1,5,15,30,60,240,1440等
int MA1 型がintで意図としては短期移動平均線の期間を入力します。
int MA2 型がintで意図としては中期移動平均線の期間を入力します。
int MA3 型がintで意図としては長期移動平均線の期間を入力します。
int Type 型intで意図としては移動平均種類を入力します。
※下記のように文字列でも整数でも
対応した移動平均種類を指定することができます。

MODE_SMA0単純移動平均
MODE_EMA1指数移動平均
MODE_SMMA2平滑移動平均
MODE_LWMA3加重移動平均

ここまで説明した PerfectOrder(5,8,50,200,MODE_SMA); この中(引数)は固定値しか使わないというのであればPerfectOrder();でも構いません。
汎用性を持たせるために私はこのように簡単に変更できるようにしています。



//——————————————————————//
// パーフェクトオーダー
//——————————————————————//
int PerfectOrder(int TimeFrames,int MA1,int MA2,int MA3,int Type)
{//ここから関数の始まり
int ret = 0;// イニシャライズ
int PerfectRows = 0; // イニシャライズ
int PerfectWays = 0; // イニシャライズ

//※イニシャライズして関数内にある変数をリセットします。

double PerfectMA1 = iMA(_Symbol,TimeFrames,MA1,0,Type,PRICE_CLOSE, 0);//短期0前
double PerfectMA2 = iMA(_Symbol,TimeFrames,MA2,0,Type,PRICE_CLOSE, 0);//中期0前
double PerfectMA3 = iMA(_Symbol,TimeFrames,MA3,0,Type,PRICE_CLOSE, 0);//長期0前

//※iMAの関数を各々の変数に格納しています。最後が0なので現在の値を表します。

double PerfectMA11 = iMA(_Symbol,TimeFrames,MA1,0,Type,PRICE_CLOSE, 1);//短期1前
double PerfectMA12 = iMA(_Symbol,TimeFrames,MA2,0,Type,PRICE_CLOSE, 1);//中期1前
double PerfectMA13 = iMA(_Symbol,TimeFrames,MA3,0,Type,PRICE_CLOSE, 1);//長期1前

//※iMAの関数を各々の変数に格納しています。最後が1なので1本前の値を表します。

//並び順
if(PerfectMA1 > PerfectMA2 && PerfectMA2 > PerfectMA3){ PerfectRows = 1;}
else if(PerfectMA1 < PerfectMA2 && PerfectMA2 < PerfectMA3){ PerfectRows = -1;}

//※格納した変数を比較してMAの並び順を整理しています。

//向き
if(PerfectMA1 > PerfectMA11 && PerfectMA2 > PerfectMA12 && PerfectMA3 > PerfectMA13){    PerfectWays = 1;}
else if(PerfectMA1 < PerfectMA11 && PerfectMA2 < PerfectMA12 && PerfectMA3 < PerfectMA13){ PerfectWays = -1;}

//※格納した変数を比較して各々のMAの向きを整理しています。

//結果
if(PerfectRows == 1 && PerfectWays == 1){ret = 1;}//パーフェクトオーダーロング
else if(PerfectRows == -1 && PerfectWays == -1){ret = -1;}//パーフェクトオーダーショート

//※整理した並び順、向きが揃えばパーフェクトオーダーの成立としています。

return ret; // 1ならロング -1ならショート が戻り値となります。
} //ここまでが関数の終わり

これで次回からパーフェクトオーダーの記述をする必要がなくなります。

Leave A Reply

*
*
* (公開されません)

竹下制御設計Takeshita control design