/* * Library Sample. */ // a link to the company website #property link "" // the company name #property copyright "" // チャートウィンドウ上に指標を表示する. #property indicator_chart_window // 表示する指標の数. #property indicator_buffers 1 // 線の色 #property indicator_color1 Blue // 線の太さ #property indicator_width1 2 // 線のスタイル #property indicator_style1 STYLE_SOLID /* * include. * http://docs.mql4.com/basis/preprosessor/include */ #include /* * 外部変数. */ extern int MA_PERIOD = 21; // Averaging period for calculation. extern int MA_SHIFT = 0; // MA shift. Indicators line offset relate to the chart by timeframe. extern int MA_METHOD = MODE_SMA; // Moving Average methods. extern int MA_APPLIED_PRICE = PRICE_CLOSE; // Price constants. extern int MA_TIMEFRAME = PERIOD_H1; // Timeframe used on the chart. // チャート表示用のバッファ. double BUFFER_MA[]; /* * 初期化処理. * チャートを表示するときに実行する. */ int init() { output("start 'init' function"); SetIndexBuffer(0, BUFFER_MA); SetIndexLabel(0, "moving average"); output("finish 'init' function"); return(0); } /* * 後処理. * チャートから削除するときに実行する. */ int deinit() { output("start 'deinit' function"); output("finish 'deinit' function"); return(0); } /* * 基本処理. * 次の tick が決まるたびに実行する. */ int start() { output("start 'start' function"); int countingBars = getCountingBars(); string message; datetime currentPeriodTime; int specifiedPeriodIndex; // 過去から現在に向かってバーのインデックスを移動する. for (int i = countingBars - 1; i >= 0; i--) { currentPeriodTime = currentPeriodIndex2Time(i); specifiedPeriodIndex = time2SpecifiedPeriodIndex(currentPeriodTime); // 移動平均線の値を取得して指標バッファに設定する. BUFFER_MA[i] = iMA( Symbol(), // 通貨ペア名 MA_TIMEFRAME, // 時間枠 MA_PERIOD, // 移動平均線を計算する期間 MA_SHIFT, // MA_METHOD, // 移動平均線を計算する方式 MA_APPLIED_PRICE, // 移動平均線を計算する際に使う値の種類 specifiedPeriodIndex); // 設定するインデックス message = createMessage(i, BUFFER_MA[i]); output(message); } output("finish 'start' function"); return(0); } /* * 指定した時刻、時間枠からインデックスを返す. */ int time2SpecifiedPeriodIndex(datetime time) { /* * iBarShift. * http://docs.mql4.com/series/iBarShift */ int index = iBarShift( Symbol(), // Symbol the data of which should be used to calculate indicator. NULL means the current symbol. MA_TIMEFRAME, // Timeframe. It can be any of Timeframe enumeration values. 0 means the current chart timeframe. time, // value to find (bar's open time). false); // Return mode when bar not found. false - iBarShift returns nearest. true - iBarShift returns -1. datetime specifiedPeriodTime = iTime(Symbol(), MA_TIMEFRAME, index); string message = StringConcatenate( "specified period time:", datetime2String(specifiedPeriodTime)); output(message); return(index); } /* * 現在の時間枠でのインデックスから対応する時刻を返す. */ datetime currentPeriodIndex2Time(int index) { datetime currentTime = iTime(Symbol(), 0, index); string currentTimeString = datetime2String(currentTime); string message = StringConcatenate( "current period time:", currentTimeString); output(message); return(currentTime); } /* * メッセージを作る. * format * symbol, datetime, price */ string createMessage(int index, double price) { string symbolString = Symbol(); string datetimeString = datetime2String( iTime(symbolString, 0, index)); string priceString = DoubleToStr( price, Digits); string message = StringConcatenate( symbolString, ",", datetimeString, ",", priceString); return(message); } /* * 今回計算するバーの数を返す. */ int getCountingBars() { // チャート上のバーの数. int bars = Bars; // 変化のなかったバーの数. int countedBars = IndicatorCounted(); if (countedBars < 0) { return(0); } // 今回計算するバーの数. int countingBars = bars - countedBars - 1; return(countingBars); }