月別アーカイブ: 2014年12月

MQLの勉強メモ (13) チャートの価格情報を取得

すでに予約変数と予約関数で一度価格情報の取得方法を勉強しました。
今回は改めて関数でEAの稼働チャート外の価格情報の取得方法を勉強します。

まずは予約変数を貼っておきます。

予約変数

変数

  • Ask:買値
  • Bid:売値
  • Bars:チャートでのバーの数

配列

  • High[]:最高値の直列配列
  • Low[]:最安値の直列配列
  • Open[]:始値(寄り付き)の直列配列
  • Close[]:終値の直列配列
  • Volume[]:出来高(ティック数)の直列配列
  • Time[]:日時の直列配列

その他

  • Digits:価格の小数点以下の桁数
  • Point:相場流通での小数点値

時系列アクセス関数

価格情報

引数:(string 通貨ペア, int 足周期, int シフト)

  • iOpen
  • iClose
  • iHigh
  • iLow
  • iTime
  • iVolume

チャート関連情報

  • iBars(string 通貨ペア, int 足周期):指定したチャートのバー数
  • iBarShift(string 通貨ペア, int 足周期, datetime 開始時間, bool 精確[false]):開始時間でシフトを検索
  • iHighest(string 通貨ペア, int 足周期, int 種類, int 範囲, int 開始シフト):最高値
  • iLowest(string 通貨ペア, int 足周期, int 種類, int 範囲, int 開始シフト):最低値

配列の複製

引数:(string 通貨ペア, 足周期, int 開始, int 複製数, double/long/datetime/MqlRates)

  • CopyOpen
  • CopyClose
  • CopyHigh
  • CopyLow
  • CopyTickVolume
  • CopyTime

価格情報の更新

bool RefreshRates();
計算時間が長いEAに必要な関数です。

MQLの勉強メモ (12) 時間関連のまとめ

MQLプログラミングによく使う時間についてまとめて勉強しておきます。

時間の定義

データ型定義

まずはデータ型のDatetimeを思い出します。
Datetime型の定義

datetime d1 = D'2014.01.01 12:00:01';

StrToTime()文字列で変換

作成した文字列で時間変数を定義する方法です。
(本によるとStringConcatenateが+演算よりパフォーマンス早いとのことです。
改めて検証したいと思います。)

string d2 = "2014.11.18 " + "01:21:04";
string d3 = StringConcatenate(y, ".", m, ".", d, " ", h, ":", min, ":", s);
StrToTime(d3);

表示

TimeToStr()関数

datetime型はそのままMessageBoxとPrintなど出すと、分かりにくい整数です。
システムで取得したdatetime型変数と自分で定義した変数同様です。

datetime d1 = D'2014.11.18 01:21:04';
MessageBox(OrderCloseTime());
MessageBox(d1);

スクリーンショット 2014-12-06 16.40.24
TimeToStr()関数で読める形式で表示すると

datetime d1 = D'2014.11.18 01:21:04';
MessageBox(TimeToStr(d1));
MessageBox(TimeToStr(OrderCloseTime()));

スクリーンショット 2014-12-06 16.40.40

年月日と時分秒の取得

現在時間 指定時間 TimeXxx(datetime型指定時間)  
Year() TimeYear(datetime)
Month() TimeMonth(datetime)
Day() TimeDay(datetime) 月の日付
DayOfWeek() TimeDayOfWeek(datetime) 曜日。0…6=日…土
DayOfYear() TimeDayOfYear(datetime) 年初からの日数
Hour() TimeHour(datetime)
Minute() TimeMinute(datetime)
Seconds() TimeSeconds(datetime)

計算と比較

マクロ定義で時間計算をスムーズに

現在から1時間後とか4時間前とかを計算するとき、
datetime型変数に秒数を足し算引き算すればいいです。
でも毎回1時間が何秒であるかを計算するのか面倒です。
予めよく使う時間をマクロを定義したほうがお勧めです。
後からコードを見直すときも分かりやすいです。

#define SEC_H1 3600
#define SEC_H4 14400
#define SEC_D1 86400

DayOfWeek()で取得した曜日も分かりにくいなら、マクロ定義できます。

#define SUNDAY 0
#define MONDAY 1
#define TUESDAY 2
#define WEDNESDAY 3
#define THURSDAY 4
#define FRIDAY 5
#define SATURDAY 6

計算と比較

計算と比較が簡単に整数感覚ですればいいです。
見出しを「計算と比較」と掲げて実際に書くことがないです。
マクロの定義で計算コードを書きやすくすることが覚えておいたほうが大事です。

時間が取得できる関数

システム時間

常用関数の記事で勉強した各種時間の中に使えそうのが下記四つです。

datetime TimeCurrent([MqlDateTime]) 最後の取得したサーバ時刻
datetime TimeTradeServer([MqlDateTime]) 取引サーバの時刻
datetime TimeLocal([MqlDateTime]) パソコン時間
datetime TimeGMT([MqlDateTime]) GMT時刻

取引情報の時間

OrderSelect()関数でオーダーを選択後、オーダーの時間情報が照会できます。

戻り値 関数名 意味 説明
datetime OrderOpenTime() 注文時間  
datatime OrderCloseTime() 決済時間 未決済は0
datetime OrderExpiration() 有効期限 指値・逆指値だけ

iTime()でチャート上のバーとテクニカル指標の時間を取得

チャートのバーもテクニカル指標も、時間のフレームとシフトで取得しているので、
同じフレームとシフトでバーとテクニカルの時間を取得できます。
(取得しても整数型なので、表示するにはTimeToStr()が必要ですね)

iTime(string 通貨ペア, int 時間枠, int シフト);

例:

// ドル円の1時間チャートの4本前のローソクの開始時間(時間の近い順で5本目)
iTime("USDJPY", PERIOD_H1, 4);

時間構造体 MqlDateTime

定義と初期化

定義:

MqlDateTime time1;

注意:構造体時間の初期化
定義直後の構造体変数は値がなく、年メンバーに初期値を渡してから使えます。
初期値で年だけを渡す場合、他のメンバー変数がその年最大になります。
でも、この値が危険なので、システムで取得した時間で初期化しないといけません。
(なんで危険だというと、この値のday_of_yearも最大で、262796568です。。。)

time1.year = 2014;
// yearを初期化したので、'2014.12.31 23.59'になります。

メンバー変数

  • year:年
  • mon:月
  • day:日
  • hour:時
  • min:分
  • sec:秒
  • day_of_week:曜日、0が日曜日
  • day_of_year:年の日数

構造体時間の関数

システム時間関数
C++の参照引数のように、初期化したい構造体を渡せば、時間がこの構造体に入ります。

MqlDateTime date1;
TimeCurrent(date1);

構造体時間とdatetime型の変換

datetime型 => 構造体
MqlDateTime TimeToStruct(datetime)

構造体 => datetime型
datetime StructToTime(MqlDateTime)

U-mobileのSIMカードのエリアメール

screenshot_2014-12-01_2145
先日の長野北部の地震でU-mobileの通話プラスプランのSIMカードに
緊急地震速報の通知が来ました。

他のMVNOは知りませんが、U-mobileはエリアメールが使えることが分かりました。

でも大地震で嬉しいわけがないです。旅で日本で各地の方々からお世話になっていますので。
今回地震の長野には、去年年末年始の連休で白馬の民宿で七日間アルバイトしました。
その時オーナー一家から、大変お世話になりました。
自分みたいな外人に対して優しくしていただき、ありがとうございました。
Facebookでオーナーさん一家が大丈夫のことが分かり、安心しました。