2015年6月23日火曜日

MT4プログラムの小ネタ スクリプトを使って動作確認する。

関数だと、一回だけ実行してくれるような形でテストしたほうが確認がしやすい事があります。

MT4では、スクリプトという形で、一回実行するプログラムをサポートしています。

scripts.PNG
メタエディタを開き、Scriptsフォルダを選択して、右クリック→新規ファイルを選択します。
scripts2.PNG
scripts3.PNG
ウィザードでは、スクリプトを選択した後、名前の欄に作成するスクリプトの名前を入力して完了ボタンを押すと空のファイルが作成されます。

//+------------------------------------------------------------------+
//|                                                FourValueTest.mq4 |
//|                                         Copyright 2015,  Daisuke |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---
}


作成されるファイルはOnStartだけある単純なファイルです。OnStartが一回だけ呼び出されて終了します。

今回は、指定時間の4本値を取得する関数が正しく動作するかどうかを確認するプログラムを書きました。とりあえずサンプルなので、単純に1時間足の値と、5分足で計算した1時間の値を比較して値が一致するかどうかを確認するプログラムです。とりあえず、値は一致しました。基本的なロジックは問題が無いようです。
テストとしては、これで不十分で、最低でも境界値チェックは必要かと思います。

// 一時間(秒)
#define ONEHOUR   (3600)

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---

int handle = FileOpen("FourValueTest.csv", FILE_CSV|FILE_WRITE, ',', CP_ACP);
datetime start = D'2015.06.01 12:00:00';
datetime end = D'2015.06.01 13:00:00';
FourValue result = GetFourValue("EURUSD", PERIOD_M5, start, end);
FileWrite(handle, "GetFourValue", start, end, result.open, result.close, result.high, result.low );

int shift = iBarShift( "EURUSD", PERIOD_H1, start, true) ;

FileWrite(handle, "H1", start, ""
, iOpen("EURUSD", PERIOD_H1, shift)
, iClose("EURUSD", PERIOD_H1, shift)
, iHigh("EURUSD", PERIOD_H1, shift)
, iLow("EURUSD", PERIOD_H1, shift));

FileClose(handle);

}
//+------------------------------------------------------------------+


// 4本値構造体
struct FourValue
{
// オープン
double open;
// クローズ
double close;
// 高値
double high;
// 安値
double low;
};

//------------------------------------------------------------------
//指定期間の4本値を返す。
FourValue GetFourValue(
string symbol           // 対象の通貨ペア
, ENUM_TIMEFRAMES timeframe  // 分解能
, datetime startTime      // 開始時間(開始時間は含む)
, datetime endTime        // 終了時間(終了時間は含まない)
)
{
FourValue result;
result.open = 0;
result.close = 0;
result.high = 0;
result.low = 0;

int i = iBarShift( symbol, timeframe, endTime, true) ;
if( i < 0 )
{
// 値が取れない場合は0
return result ;
}

i--;
if( i < 0 ) i = 0 ;

double close = 0 ;
double open = 0 ;
double low = iClose(symbol, timeframe, 0 ) * 1000;
double high = 0;
while( !IsStopped() )
{
datetime current = iTime(symbol, timeframe, i);
if( current <= 0 ) break ;

if( startTime <= current && current < endTime )
{
if( close == 0 ) close = iClose( symbol, timeframe, i);
open = iOpen( symbol, timeframe, i);
double currentHigh = iHigh(symbol, timeframe, i);
double currentLow = iLow(symbol, timeframe, i);

if( low > currentLow ) low = currentLow;
if( high < currentHigh ) high = currentHigh;
}
if( current < startTime ) break ;
i++;
}

result.open = open;
result.close = close;
result.high = high;
result.low = low;

return result;
}


Money Box-100.jpg
逆コツコツドカン型EA Gewinn2 販売中
初期導入者様向け先着10名様に9800円でご提供します!
不明な点、動作が分からない点ありましたら、ご質問ください!


EURUSDがギリシャ問題に揺れて少し狭い範囲を急速に行ったり来たりしているためGewinn2君も戦績が良くありません。ギリシャネタもいったん大詰めでしょうから、そろそろ次の動きがありそうです。スイングトレードタイプですと、ポジションを保有して評価損を抱えた状態で動きを待ちますが、Gewinn2は諦めて損切して次の動きを待ちます。さて次の動きはどうなるでしょうか?