2015年5月27日水曜日

MT4プログラミング この休み複雑すぎるだろ!イースターの計算


さて、EAを作成していると休みの日は取引したくない!ってことありませんか?
その場合、コツコツと計算していくわけですが、大概の休みは決まった日か月の何番目の何曜日とか割と簡単な計算で求めることができます。

ところが、イースターだけは別格です。
「春分の日の後の最初の満月から数えて最初の日曜日」

春分の日の計算も近似で求める必要があるなど大概面倒なのですが、満月ってなんですか?満月ってどうやって求めるといいんですか? ふざけてるんですか???

と言いたくなる法則です。
それでもネットの海を検索するとガウスさん(ガウス平面とか最小二乗法とかのガウスさんです!)が考えてくれた数式が見つかりました。それ以降さまざまな数学者が公式を出しています。こんな超有名数学者じゃないと作れない式を使わないと計算できない恐ろしい休日なのです。

イギリス国立天文台のサイトから式を拾ってアルゴリズムにしてみました。1900-2099まで適用可能のようです。EAで使う分には十分ですよね。

さらっと見たところ結果は正しいと思われますが式の内容は全く理解していません(汗

//------------------------------------------------------------------
// イースターを取得する
void GetEastar(
int year,            //取得年度
MqlDateTime &dt      //イースター日
)
{
int mod = year % 19;
int d = 255 - mod * 11;
while( d >= 51 ) d-=30;
if( d > 48 ) d -= 1;
int e = (year + (int)(year / 4) + d + 1) % 7;
int q = d + 7 - e;

if( q <= 31 )
{
dt.mon = 3;
dt.day = q;
}
else
{
dt.mon = 4;
dt.day = q - 31;
}
}