本連載は、まだ取引を開始して間もない方や、現在勉強中という方を対象に、毎回ある1つのテクニカル指標をピックアップし、知識編・実践編の2回に分けてご紹介しています。実践編では、知識編でご紹介したテクニカル指標を売買ルールとして用いて、システムトレードのプログラミングに挑戦します。
なお、本連載内で使用されるプログラミングのプラットホームには、ひまわり証券が提供しているシステムトレード用チャートツール「トレードシグナル」を使用します。
前回お届けした<知識編>では、相場の方向やトレンドの強さに着目したトレンド系テクニカル指標の一つ、「DMI」をご紹介いたしました。日本語で"方向性指数"と訳される同指標は、上昇・下降の可能性を示す二つの指標と、トレンドの勢いを測る一つの指標から構成されています。
■プログラミング内容
[ラインの構築]
DMI指標は主に3つの指標から構成されています。まずは、一定期間の変動値幅に対する上昇幅と下降幅の割合から2つの指標「DM+」「DM-」を算出します。さらにこの2つの指標を用いて、現在のトレンドの勢いを測る「ADX」指標を導き出します。
<1>
Plus_DM = 当日の高値 - 前日の高値
Minus_DM = 前日の安値 - 当日の安値
<2>
Plus_DM > Minus_DM のとき Minus_DM = 0
Plus_DM < Minus_DM のとき Plus_DM = 0
Plus_DM = Minus_DM のとき Plus_DM = 0、Minus_DM = 0
Plus_DM ≦ 0 のとき Plus_DM = 0、 Minus_DM = 0
Minus_DM ≦ 0 のとき Plus_DM = 0、 Minus_DM = 0
<3>
TR(TrueRange) = 以下3つの内の最大値
・当日の高値 と 当日の安値 の 差
・当日の高値 と 前日の終値 の 差
・前日の終値 と 当日の安値 の 差
<4>
DM+ = n日間のPlus_DMの累計 ÷ n日間のTRの累計 × 100
DM- = n日間のMinus _DMの累計 ÷ n日間のTRの累計 × 100
<5>
ADX = {((DM+)-(DM-))の絶対値÷((DM+)+(DM-))} のn日平均
[売買ルールの構築]
DM+ がDM-を上抜けたときは上昇トレンド、逆は下降トレンドの始まりと判断することが出来ます。その他には、ADX指標が高水準の場合、強いトレンドが形成されているとみなされ、また逆に下降しているときはトレンドが弱く、保ち合い相場とみなされるなど、トレンドを見極める上でADX指標を重要視することが多くなっています。DMI指標は、トレンドに沿った順張り手法や、保ち合いでの逆張り手法など、様々な手法で利用されています。今回の検証用プログラムでは、上述した内容をもとに売買手法のひとつである順張り手法をご紹介します。
■サンプル・プログラム
※ここで記載のプログラムは過去データによる検証用として書かれています。実際の自動売買用プログラムとしては、口座やツールの仕様上、このままではお使いいただけません。
※さらに詳しいプログラミング言語「エキーラ」の解説ガイドは、こちら
■検証プログラム適用後
{① プログラムの概要}
Meta: Synopsis(
"日本語で"方向性指数"と訳される同指標は、上昇・下降の可能性を示す2つの指標と
トレンドの勢いを測る指標の、計3つの指標から構成されています。
≪順張り手法≫
■買いシグナル : DMI+ が DMI- を上抜いたとき。
■売りシグナル : DMI+ が DMI- を下抜いたとき。
(※さらにADX指標を活用すると、トレンドの強さを考慮することが出来ます。)" )
,ShortCode( "DMI" ),SubChart( True );//←サブチャートに各指標のラインを表示
{② プログラム内で使用される変数の定義}
vars: result, Plus_DMI, Minus_DMI, rDMI, rADX, rADXR, rVola;
{③ DMI作製プログラム}
//* 今回使用の関数は、DMI指標を表示するための関数【DirMovement】です。
//* 変数の数値指定と、任意の変数名の指定で値が算出されます。
DirMovement( High, Low, Close, 10, Plus_DMI, Minus_DMI, rDMI, rADX, rADXR, rVola );
//(高値、安値、終値、日数、変数名1、変数名2、変数名3、変数名4、変数名5、変数名6)
{④ 売買条件の設定}
// DMI+ が DMI- を上抜いたとき、1枚買い注文
// DMI+ が DMI- を下抜いたとき、1枚売り注文
If Plus_DMI Crosses Over Minus_DMI Then
Buy( "買" ) 1 Contracts Next Bar at Market
Else If Plus_DMI Crosses Under Minus_DMI Then
Short( "売" ) 1 Contracts Next Bar at Market;
{⑥ 各ラインを描画するプログラム}
DrawLine( Plus_DMI, "DMI+" );
DrawLine( Minus_DMI, "DMI-" );
DrawLine( rADX, "ADX" );
参考URL
・『トレードシグナル』
― 第12回 DMI 編 おわり―