たまにはEA作成講座でも・・・その3
メール送信関数SendOrderMail()を解説したいと思います。
またまたコードにバグがありました。m(__)m
void SendOrderMail(int ticket, bool bOpen)
{
.
.
.
body = body + "Price:" + DoubleToStr(OrderClosePrice(), MarketInfo(OrderSymbol(),MODE_DIGITS)) + "\r\n";
if(!bOpen){
body = body + "Swap:" + DoubleToStr(OrderSwap(), MarketInfo(OrderSymbol(),MODE_DIGITS)) + "\r\n";
body = body + "Profit:" + DoubleToStr(OrderProfit(), MarketInfo(OrderSymbol(),MODE_DIGITS)) + "\r\n";
}
.
.
.
}
の部分ですが、
void SendOrderMail(int ticket, bool bOpen)
{
.
.
.
if(bOpen){
body = body + "Price:" + DoubleToStr(OrderOpenPrice(), MarketInfo(OrderSymbol(),MODE_DIGITS)) + "\r\n";
}else{
body = body + "Price:" + DoubleToStr(OrderClosePrice(), MarketInfo(OrderSymbol(),MODE_DIGITS)) + "\r\n";
body = body + "Swap:" + DoubleToStr(OrderSwap(), MarketInfo(OrderSymbol(),MODE_DIGITS)) + "\r\n";
body = body + "Profit:" + DoubleToStr(OrderProfit(), MarketInfo(OrderSymbol(),MODE_DIGITS)) + "\r\n";
}
.
.
.
}
と、しないと建値が正しく取得できませんね。
---------------------------------------------------------------------
以下、SendOrderMail()の解説です。
まず関数の宣言、void SendOrderMail(int ticket, bool bOpen)ですが、
voidキーワードは、この関数が値を返さないという意味です。
例えばstart()関数にはintが付いているので整数型を返しますよという意味になります。
SendOrderMailは関数名でticket、bOpenは仮引数でそれぞれint(整数型)、
bool(論理型)です。
この関数を呼び出すとき、例えばSendOrderMail(123, false)と記述すれば、
SendOrderMail()関数内でticket、bOpenを参照したとき、それぞれの値は123、falseとなります。
メールを送信するときに、オーダーのチケット番号から、
オーダー時刻、建値、決済値、利益等の情報を取得する目的で、
呼び出し側からticketにチケット番号を渡しています。
bOpenにはオープン時のメール(true)なのかクローズ時のメール(false)なのかを
渡しています。
int modeについてですが、OrderSelect()関数の第3引数で、
現在ポジション(MODE_TRADES)からオーダーを取得するのか
決済キャンセル済み(MODE_HISTORY)からオーダーを取得するのか
を渡す必要がありますが、その値を格納する目的の整数型変数の宣言です。
string subjectは、メールの件名を格納する文字列型変数の宣言です。
if(bOpen){でオープン時のメールなのか、決済時のメールなのかを判断しています。
オープン時のメールの時は、bOpenはtrueで呼ばれるので、
mode = MODE_TRADESで現在ポジションからオーダーを取得、
subject =OrderOpenMailSubjectでメール件名は、OrderOpenMailSubjectプロパティ値を
使用するという事になります。
bOpenがfalseの場合は、mode = MODE_HISTORYでオーダー取得は履歴から、
subject =OrderCloseMailSubjectでメール件名は、OrderCloseMailSubjectプロパティ値を
採用することになります。
続く・・・・。

| h o m e |