プログラム設計

最近のパソコンは基本スペックが上がっているので、どんなパソコンでもMT4位ならサクサク動くようになっています。

しかし、プログラムの構造が変だったり、無駄な処理が実装してあったりするとメモリ使用量が増えますので、重くなります。

なので、効率化ってのを少し意識してみましょう。

インジケーターは過去のバー(足)を元に計算するのが基本ですが、プログラムで判断しない箇所、つまり不要なデータを作る処理まで計算する実装になっている事が多いです。

例えばですよ、MA100とMA200のラインクロスでシグナルを判断させるインジケーターが有ったとしましょう。

最新のシグナルを発生させるためにはMA200で必要となる足の本数は直近200個ですので、最低限必要な足の個数は200でいいんです。

ということは、最新のシグナルを作るには200個の足を遡れば判断出来るということになります。

しかし普通のインジケーターとかEAは、過去5000個の足まで遡って計算していたり、もっと言えば何万〜とか大いに有り得る実装がされているプログラムが多いです。

過去に遡るほど、チャート描画時に重くなりますので、計算に関係ない足まで計算しなくていいんですというか、根本的に無駄です。

過去のシグナルを遡ってチェックする時くらいしか過去のシグナルとかは見ませんので、プログラムの最適化をお行う場合、遡る個数は必要最低限でいいんです。

プログラムの構造を理解する

i-Gapというブレイクアウトを検知するインジケーターが比較的シンプルで、EAとかにも組み込みやすい良いインジだと思いますので、注意点を含めて説明します。


//+------------------------------------------------------------------+
//| Die St舐ke des Corrected Average (CA) besteht darin, |
//| dass der aktuelle Wert der Zeitreihe einen von der momentanen |
//| Volatilit舩 abh舅gigen Schwellenwert ・erschreiten muss, |
//| damit der Filter steigt bzw. f舁lt, wodurch Fehlsignale |
//| in trendschwachen Phasen vermieden werden. |
//| -A.Uhl- |
//+------------------------------------------------------------------+
//|Germany, 23.03.2007
#property copyright "A.Uhl, ゥ RickD 2006, Alexander Piechotta"
#property link "http://onix-trade.net/forum/"
//----
#define major 1
#define minor 0
//----
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Gold
//----
extern int MA_Period=35;
extern int MA_method=MODE_SMA;
extern int MA_applied_price=PRICE_CLOSE;
//----
double MABuf[];
double CABuf[];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void init()
{
IndicatorBuffers(2);
SetIndexStyle(2, DRAW_LINE, STYLE_SOLID,1);
SetIndexDrawBegin(0, MA_Period);
//
SetIndexBuffer(0, CABuf);
SetIndexBuffer(1, MABuf);
IndicatorShortName("Corrected Average (CA) ("+(string)MA_Period+")");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void deinit()
{}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void start()
{
int counted=IndicatorCounted();
if (counted < 0) return; if (counted > 0) counted--;
int limit=Bars-counted;
double v1, v2, k;
//----
for(int i=limit-1; i>=0; i--)
{
MABuf[i]=iMA(NULL, 0, MA_Period, 0, MA_method, MA_applied_price, i);
if (i==Bars-1)
{
CABuf[i]=MABuf[i];
continue;
}
v1=MathPow(iStdDev(NULL, 0, MA_Period, 0, MA_method, MA_applied_price, i), 2);
v2=MathPow(CABuf[i+1] - MABuf[i], 2);
//----
k=0;
if (v2 < v1 || v2==0) k=0; else k=1 - v1/v2; CABuf[i]=CABuf[i+1] + k*(MABuf[i]-CABuf[i+1]); } } //+------------------------------------------------------------------+

「IndicatorCounted」
確定済みのバー数を取得するための関数です。

確定済みと言うのは、その時間が終わっている足のことで、最新以外の足の事と思って大丈夫です。

「Bars」
Barsとはチャート上に表示されているバーの数で、MT4のツールバー→ツール→オプション→チャートで設定されている値がこのBarsに当たると認識しています。

要は画面に最新からどこまで表示させる?という設定項目で、多ければ画面スクロールとかで過去に遡れて便利ですがメモリを消費します。

逆に少なければスクロール範囲が狭く分析などしにくいですがメモリ使用量は少ないです。

ここからが大事な話です。

for(int i=limit-1; i>=0; i--)

コレはループ処理をするための記述で、簡単に言うと、limit回数分、同じ処理を繰り返しますという感じです。

で、limit回数は「limit=Bars-counted;」で求められているので、Barsが10000の場合、10000回処理をするという事になります。
※細かい部分は割愛します。

特にチャート描画時にインジケーターの計算が行われますので、確実に10000回処理が実効されます。

チャート描画後は、ティック更新毎に処理が行われていきますが、最新の足だけを対象に計算が行われるので負荷はほとんどかかりません。

MT4の起動時のチャート描画や、表示する時間足を変更、パラメータ変更などをして、インジケーターの再計算が行われる時にBars分の全ての足に対して計算が行われるので重たくなるという仕組みです。

注意点

使いやすそうなインジケータを見つけてそれを流用する時に注意すべき点ですが、無駄にiCustomでこれらを呼び出しまくるとかなり重たくなります。

特に、iCustomで呼ぶ専用に実装されていないインジケーターを使う場合には注意が必要となります。

と言ってしまうと、iCustomが悪者みたいになってしまうのですが、要は使い方次第ということなんです。

何らかのシグナル条件をインジケーターから抽出するには標準の関数(iMAなど)から拾う方法とオリジナルインジケーターをiCustomから拾う方法とがあります。

iCustomからシグナル条件を拾うほうが自由度が増しますし、柔軟になります。

僕もインジケーターやEAをを作るときはiCustomを使いますし、やっぱり便利なんですね。

どうしても重たくなる場合の対策

スクリーンショット 2016-08-01 22.05.42

Mt4ツールバー→ツール→オプション→チャートから上記画面の設定が行えます。

【ヒストリー内の最大バー数】
こちらは、バックテストとかで重要になる項目で、バックテストの範囲を決めるような感じで思ってもらって良いです。

【チャートの最大バー数】
こちらは、チャートを表示する時に必要な項目で、数値を大きくすると重たくなりますが、過去まで遡れます。

どうしてもチャート表示が重たい場合は、こちらの数値を減らすと改善されますが、あまりに大きく減らしてしまうとEAやインジケーターに影響を及ぼす可能性が高いので、変更後動作確認を十分行ってください。


スポンサーリンク
海外FX最前線のXMで証拠金を抑えたハイレバレッジなトレードを!