
デマーカーによる取引システムの設計方法を学ぶ
はじめに
最も人気のあるテクニカル指標に基づいて取引システムを設計する方法を学ぶための連載の新しい記事へようこそ。取引で有利になる新しいテクニカルツールや指標を詳しく学びます。この指標はデマーカー指標であり、以下のトピックを通じて、この指標をカバーしていきます。
MetaTrader 5取引ターミナルとターミナルに内蔵されているMQL5を使用して、取引システムのコードを書き、テストします。MetaTrader 5のダウンロードと使用方法がわからない場合は、以前の記事の「MetaEditorでMQL5のコードを書く」トピックを読むと、詳細を知ることができます。
取引とプログラミングのスキルを伸ばし、最大の利益を得るには、この記事で学んだことをご自分で適用することをお勧めします。練習は学習ステップにおいて非常に重要な要素だからです。この戦略の主な目的は、指標の背後にある主な概念を学ぶことであることを述べ、確認したいと思います。したがって、その主な目的は教育的なものであり、実際の口座で使用する前には、その戦略が利益をもたらすか、また、ご自分の取引に適しているかを確認するために、テストする必要があります。
免責条項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。
デマーカーの定義
デマーカー指標を見極め、より詳しく知ろうと思えば、デマーカーとは何か、何を測るのか、どう計算するのか、どう読めば有利に使えるのか、などを学ぶ必要があります。デマーカーはオシレータ系のテクニカルツールで、テクニカルアナリストのトーマス・デマークによって作られました。この指標の名称は明らかに作成者の名前に由来しており、「DeM」指標とも呼ばれています。このテクニカル指標は、商品の需要を測定し、現在の最高値と最低値を以前の価格と比較することによって、市場の方向性を評価するものです。
この指標を手動で計算するには、以下の手順を使用します。
DMark (i) = SMA (DeMax, N) / (SMA (DeMax, N) + SMA (DeMin, N))
ここで、
- DMark (i) = 現在のデマークの値
- SMA = 単純移動平均
- DeMax = デマーカーの最大値
- N = 使用期間
- DeMin = デマーカーの最小値
DeMaxは、次のように計算することができます。
DeMax (i) = HIGH (i) - HIGH (i - 1)
その他の場合、
DeMax (i) = 0
DeMinは次のように計算することができます。
DeMin (i) = LOW (i - 1) - LOW (i)
その他の場合、
DeMin (i) = 0
この指標を計算すると、先ほど述べたように、0から1の間のオシレータラインを生成して、商品の需要を測定していることがわかります。現在では、この指標はMetaTrader 5取引プラットフォームの内蔵指標になっていて、MetaTrader 5取引ターミナルの利用可能な指標からそれを選択して読み取るだけでいいため、手動で計算する必要はありません。
MetaTrader5でこのDeMarkerテクニカル指標を挿入する方法を説明します。
MetaTrader 5取引ターミナルを開き、[挿入] -> [インディケータ] -> [オシレーター] -> [DeMarker]をクリックします。
その後、この指標のパラメータウィンドウが以下のように表示されます。
1 - 期間を決定
2 - 指標の線の色を設定
3 - 指標のラインスタイルを設定
4 - 指標の線の太さを設定
これらのパラメータを決定して[OK]を押すと、以下のようにチャートに指標が挿入されることがわかります。
先ほどのチャートの下部にあるように、指標が接続されており、0と1の間にオシレータの線があります。この指標は、記載された領域内の線の位置を判断することで読み取ることができます。0.70に近づくと買われすぎ、0.30に近づくと売られすぎということです。
デマーカー戦略
次に、デマーカー指標の主な概念に基づいて、どのように使用できるかを学ぶ必要があります。そこで、3つの簡単な戦略で使い方を学びます。
この戦略では、デマーカーの値と過去5期間の平均値を見ることで、デマーカーの強弱のシグナルを得ます。デマーカー指標の現在値がデマーカーの過去5期間を上回った場合、これは強さのシグナルとなります。逆に、現在の値が過去5期分のデマーカーを下回れば、弱さのシグナルとなります。
単純に言うと次のようになります。
デマーカー値 >= デマーカーの5期間平均値 -> デマーカーが強い
デマーカー値 <= デマーカーの5期間平均値 -> デマーカーが弱い
この戦略では、買われすぎ、売られすぎ領域に達したときにシグナルを得ます。現在のデマーカーの値が0.70レベル以上であれば、買われすぎ領域に接近しているシグナルとなります。デマーカーの現在値が0.30レベルより低ければ、売られすぎ領域に接近しているシグナルとなります。
単純に言うと次のようになります。
デマーカー値 >= 0.70 -> 買われ過ぎ
デマーカー値 <= 0.30 -> 売られ過ぎ
この戦略では、現在の動きを変える可能性があるという洞察を与える強気または弱気のダイバージェンスのシグナルを取得します。現在の高値、前回の高値、現在のデマーカー、前回のデマーカーという4つの値を見て、これらのシグナルを得ます。これはダイバージェンスの単純な状況ですが、最も効果的なのは価格の高値・安値と指標の高値・安値を比較・観察する場合であることを述べておきます。この単純な状況では、現在の高値が前回の高値を上回り、同時に現在のデマーカーが前回のデマーカー値を下回る場合、弱気のダイバージェンスシグナルが得られます。一方、現在の安値が前回の安値を下回り、現在のデマーカー値が前回を上回れば、強気のダイバージェンスのシグナルとなります。
単純に言うと次のようになります。
現在の高値 > 前回の高値、かつ、現在のデマーカー < 前回のデマーカー -> 弱気ダイバージェンス
現在の安値 < 前回の安値、かつ、現在のデマーカー > 前回のデマーカー -> 強気ダイバージェンス
デマーカー戦略の設計図
簡単な戦略でデマーカー指標の使い方を学んだ後、このトピックでは、各戦略の簡単な設計図を作成し、その戦略の取引システムを円滑に作成できるようにします。
この戦略では、2つの値を作成または定義した後に自動的に確認するような取引システムを作成します。これらの値は、現在のデマーカー値と過去5回のデマーカー平均値です。現在の値が平均値を上回る場合、取引システムは以下の値をチャートにコメントとして返す必要があります。
- デマーカーは強い
- 現在のデマーカー値
- 5期間平均デマーカー値
もう1つのシナリオは、現在値が平均値を下回る場合で、取引システムはこの条件に基づいて次の値を返す必要があります。
- デマーカーは弱い
- 現在のデマーカー値
- 5期間平均デマーカー値
この戦略では、特定の条件に基づいてシグナルを生成するために使用することができる取引システムを作成する必要があります。現在のデマーカーの値、指標の0.70レベル、指標の0.30レベルの3つの値を継続的に確認することが必要です。現在のデマーカー値が0.70レベル以上であれば、取引システムは以下の値をチャートにコメントとして返す必要があります。
- 買われ過ぎ
- デマーカー値
もう1つのシナリオは現在のデマーカーの値が0.30レベル以下である場合で、取引システムはチャート上に以下の値を返す必要があります。
- 売られ過ぎ
- デマーカー値

この戦略では、4つの値を連続的に確認することで、強気または弱気のダイバージェンスのシグナルを生成する取引システムを作る必要があります。現在の高値が前回の高値を上回ると同時に現在のデマーカー値が前回のデマーカー値を下回る場合、取引システムは以下の値をチャートにコメントとして返す必要があります。
- 弱気のダイバージェンス
- 現在の高値
- 前回の高値
- 現在のデマーカー値
- 前回のデマーカー値
もう1つのシナリオは現在の安値が前回の安値を下回ると同時に現在のデマーカーの値が前回のデマーカーの値を上回る場合で、システムは以下の値をチャート上に返す必要があります。
- 強気ダイバージェンス
- 現在の高値
- 前回の高値
- 現在のデマーカー値
- 前回のデマーカー値
デマーカー取引システム
この部分では、MetaTrader 5で実行される各戦略の取引システムを作成し、自動化シグナルを生成します。まず、すべての戦略の基礎となる簡単な取引システムを作成します。このシステムは、デマーカー指標の現在値をチャート上にコメントとして生成するもので、以下のコードによってこのシステムを作成する方法を説明します。
手順1:
分数を返すdoubleを使って、deMarkerArray配列を作成します。
double deMarkerArray[];
手順2:
ArraySetAsSeries関数を使用して、deMarkerArrayに AS_SERIESフラグを設定し、trueまたはfalseのブール値を返します。
ArraySetAsSeries(deMarkerArray,true);
手順3:
DeMarker指標のハンドルを返すiDeMarker関数を使用して指標を定義します。そのパラメータは次の通りです。
- symbol:現在の銘柄に適用(_Symbolを使用)
- period:期間または時間枠を決定するために現在の時間枠に適用(_periodを使用)
- ma_period::平均化期間(14を使用)
int deMarkerDef = iDeMarker(_Symbol,_Period,14);
手順4:
CopyBuffer関数を使って、DeMarker指標のバッファからデータを取得します。そのパラメータは次の通りです。
- indicator_handle:定義済み指標ハンドル(deMarkerDefを使用)
- buffer_num:指標バッファの番号(0を使用)
- start_pos:開始位置(0を使用)
- count:コピーする量(3を使用)
- buffer[]:コピー先配列(deMarekerArrayを使用)
CopyBuffer(deMarkerDef,0,0,3,deMarkerArray);
手順5:
NormalizeDouble関数を用いて現在のdeMarkerの値を定義し、double型の値を返します。そのパラメータは次の通りです。
- value:正規化された数値
- digits:小数点以下の桁数
double deMarkerVal = NormalizeDouble(deMarkerArray[0],6);
手順6:
Comment関数を使って、現在のデマーカー指数の値をチャートのコメントとして返します。
Comment("DeMarker Value is ",deMarkerVal);
この取引システムの完全なコードは、次のようになります。
//+------------------------------------------------------------------+ //| Simple DeMarker System.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+void OnTick() void OnTick() { double deMarkerArray[]; ArraySetAsSeries(deMarkerArray,true); int deMarkerDef = iDeMarker(_Symbol,_Period,14); CopyBuffer(deMarkerDef,0,0,3,deMarkerArray); double deMarkerVal = NormalizeDouble(deMarkerArray[0],6); Comment("DeMarker Value is ",deMarkerVal); } //+------------------------------------------------------------------+
このコードをコンパイルすると、EAナビゲータウィンドウに以下のように表示されます。
このEAをチャート上にドラッグ&ドロップすると、次のようなウィンドウが表示されます。
[OK]を押すと、下図のようにEAがチャートに接続されていることがわかります。
チャートの右上に、Simple DeMarker Systemが接続していることがわかります。この戦略通りに希望のシグナルを取得する準備が整いました。MetaTrader 5で実行するために、前述の戦略の全コードをコンパイルする手順は同じです。
以下は、このシンプルな取引システムに従ってテストして生成されたシグナルです。
チャートの左上でわかるように、デマーカー指標の現在値を確認することができます。
以下は、この戦略の取引システムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| DeMarker Strength.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double deMarkerArray[]; ArraySetAsSeries(deMarkerArray,true); int deMarkerDef = iDeMarker(_Symbol,_Period,14); CopyBuffer(deMarkerDef,0,0,6,deMarkerArray); double deMarkerVal = NormalizeDouble(deMarkerArray[0],4); double deMarkerVal1 = NormalizeDouble(deMarkerArray[1],4); double deMarkerVal2 = NormalizeDouble(deMarkerArray[2],4); double deMarkerVal3 = NormalizeDouble(deMarkerArray[3],4); double deMarkerVal4 = NormalizeDouble(deMarkerArray[4],4); double deMarkerVal5 = NormalizeDouble(deMarkerArray[5],4); double deMarkerAvgVal = (deMarkerVal1+deMarkerVal2+deMarkerVal3+deMarkerVal4+deMarkerVal5)/5; if(deMarkerVal>deMarkerAvgVal) { Comment("DeMarker is strong","\n", "Current DeMarker Value is ",deMarkerVal,"\n", "AVG DeMarker Value is ",deMarkerAvgVal); } if(deMarkerVal<deMarkerAvgVal) { Comment("DeMarker is weak","\n", "Current DeMarker Value is ",deMarkerVal,"\n", "AVG DeMarker Value is ",deMarkerAvgVal); } } //+------------------------------------------------------------------+
このコードの違いは次の通りです。
NormalizeDouble関数で現在のデマーカー値を定義した後に、同関数で過去5回分のデマーカー値を定義します。
double deMarkerVal = NormalizeDouble(deMarkerArray[0],4); double deMarkerVal1 = NormalizeDouble(deMarkerArray[1],4); double deMarkerVal2 = NormalizeDouble(deMarkerArray[2],4); double deMarkerVal3 = NormalizeDouble(deMarkerArray[3],4); double deMarkerVal4 = NormalizeDouble(deMarkerArray[4],4); double deMarkerVal5 = NormalizeDouble(deMarkerArray[5],4);
deMarkerAvgValは、過去5回のデマーカー値を元に、double関数を使ってdeMarkerAvgValという変数を作り、過去5回の計算値の合計と同じにし、それを5で割って平均値を出します。
double deMarkerAvgVal = (deMarkerVal1+deMarkerVal2+deMarkerVal3+deMarkerVal4+deMarkerVal5)/5;
戦略の条件設定
現在のdeMarkerとdeMarkerAvg値を比較することによって行います。deMarkerの強いシグナルの場合、現在のdeMarkerの値がdeMarkerAvgの値を上回ることを確認する必要があります。ここでは、if構文を使用します。
if(式)-> 演算子
強気の場合、deMarkerValが構文中の式であるdeMarkerAvgValを上回るとき、取引システムは演算子であるチャートにコメントとして強気シグナルを返す必要があります。
if(deMarkerVal>deMarkerAvgVal) { Comment("DeMarker is strong","\n", "Current DeMarker Value is ",deMarkerVal,"\n", "AVG DeMarker Value is ",deMarkerAvgVal); }
デマーカーが弱い場合、現在のdeMarker値がdeMarkerAvg値を下回ることを確認する必要があり、その場合、その演算子は、弱さと他の値をそれぞれ別の行でチャートにコメントを返します。
if(deMarkerVal<deMarkerAvgVal) { Comment("DeMarker is weak","\n", "Current DeMarker Value is ",deMarkerVal,"\n", "AVG DeMarker Value is ",deMarkerAvgVal); }
このコードをコンパイルして、学習したようにナビゲータから実行すると、以下でわかるようにこの戦略のEAが接続されていることがわかります。
右上にあるように、この戦略のEAがチャートに接続されており、以下のテスト例と同じようにシグナルを取得する準備が整っています。
シグナルが強い場合:
チャートの左上隅でわかるように、この取引システムはこの取引戦略に基づいて以下のようなシグナルを生成します。
- デマーカーが強い -> デマーカーの現在値がデマーカー指標の過去5回の平均値を上回っている
- 現在のデマーカーの値
- デマーカーの平均値
シグナルが弱い場合:
チャートの左上でわかるように、次のようなシグナルが出ています。
- デマーカーが弱い -> デマーカーの現在値がデマーカー指標の過去5回の平均値を下回る
- 現在のデマーカーの値
- デマーカーの平均値
この戦略の完全なコードは以下の通りです。
//+------------------------------------------------------------------+ //| Simple DeMarker System.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+void OnTick() void OnTick() { double deMarkerArray[]; ArraySetAsSeries(deMarkerArray,true); int deMarkerDef = iDeMarker(_Symbol,_Period,14); CopyBuffer(deMarkerDef,0,0,3,deMarkerArray); double deMarkerVal = NormalizeDouble(deMarkerArray[0],6); if(deMarkerVal<=0.30) { Comment("Oversold","\n", "DeMarker Value is ",deMarkerVal); } if(deMarkerVal>=0.70) { Comment("Overbought","\n", "DeMarker Value is ",deMarkerVal); } if(deMarkerVal>0.30 && deMarkerVal<0.70) { Comment("DeMarker Value is ",deMarkerVal); } } //+------------------------------------------------------------------+
このコードの違いは次の通りです。
本コードの条件
売られすぎシグナルの場合、現在値が0.30以下になると(if式)、売られすぎシグナルとなりそれをチャートのコメントとして見る必要があります。
if(deMarkerVal<=0.30) { Comment("Oversold","\n", "DeMarker Value is ",deMarkerVal); }
買われすぎのシグナルの場合、現在のデマーカーの値が 0.70以上であれば、この状況になります。
if(deMarkerVal>=0.70) { Comment("Overbought","\n", "DeMarker Value is ",deMarkerVal); }
シグナル梨またはバランス(式)の場合、現在のデマーカーの値が0.30~0.70(演算子)のときにシグナルが出力されます。
if(deMarkerVal>0.30 && deMarkerVal<0.70) { Comment("DeMarker Value is ",deMarkerVal); }
このコードをコンパイルして、このEAを実行すると、次のようにチャートに接続されていることがわかります。
さて、この戦略に基づくシグナルを受信する準備が整ったので、以下にテスト時の例を示します。
買われすぎの場合:
前チャートの左上でわかるように、生成されたシグナルは以下の通りです。
- 買われ過ぎ
- デマーカーの現在値
売られすぎの場合:
ご覧の通り、生成されたシグナルは以下の通りです。
- 売られ過ぎ
- デマーカーの現在値
シグナルなし・バランスの場合:
このように、デマーカー現在値の生成シグナルが得られました。
以下は、この戦略の取引システムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| DeMarker Divergence.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double deMarkerArray[]; MqlRates pArray[]; ArraySetAsSeries(deMarkerArray,true); ArraySetAsSeries(pArray,true); int deMarkerDef = iDeMarker(_Symbol,_Period,14); int pData = CopyRates(_Symbol,_Period,0,14,pArray); CopyBuffer(deMarkerDef,0,0,14,deMarkerArray); double deMarkerVal = NormalizeDouble(deMarkerArray[0],4); double deMarkerPrevVal = NormalizeDouble(deMarkerArray[1],4); double currentHigh = NormalizeDouble(pArray[0].high,6); double currentLow = NormalizeDouble(pArray[0].low,6); double prevHigh = NormalizeDouble(pArray[1].high,6); double prevLow = NormalizeDouble(pArray[1].low,6); if(currentHigh>prevHigh && deMarkerVal<deMarkerPrevVal) { Comment("Bearish divergence","\n", "Current High is ",currentHigh,"\n", "Prev. High Value is ",prevHigh,"\n", "Current DeMarker Value is ",deMarkerVal,"\n", "Prev. DeMarker Value is ",deMarkerPrevVal); } if(currentLow<prevLow && deMarkerVal>deMarkerPrevVal) { Comment("Bullish divergence","\n", "Current Low is ",currentLow,"\n", "Prev. Low Value is ",prevLow,"\n", "Current DeMarker Value is ",deMarkerVal,"\n", "Prev. DeMarker Value is ",deMarkerPrevVal); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
doubleのdeMarkerArrayを作成し、MqlRates関数でpArray(価格)を作成し、価格、出来高、スプレッドの情報を格納します。
double deMarkerArray[]; MqlRates pArray[];
この2つの作成した配列にAS_SERIESフラグを設定します。
ArraySetAsSeries(deMarkerArray,true); ArraySetAsSeries(pArray,true);
deMarketDef,、pDataを定義します。
int deMarkerDef = iDeMarker(_Symbol,_Period,14); int pData = CopyRates(_Symbol,_Period,0,14,pArray);
deMarkerArrayに入力します。
CopyBuffer(deMarkerDef,0,0,14,deMarkerArray);
deMarkerVal、deMarkerPrevVal、current high、current low、 prev、high、prev. lowを定義します。
double deMarkerVal = NormalizeDouble(deMarkerArray[0],4); double deMarkerPrevVal = NormalizeDouble(deMarkerArray[1],4); double currentHigh = NormalizeDouble(pArray[0].high,6); double currentLow = NormalizeDouble(pArray[0].low,6); double prevHigh = NormalizeDouble(pArray[1].high,6); double prevLow = NormalizeDouble(pArray[1].low,6);
戦略の条件
弱気ダイバージェンスの場合:
if(currentHigh>prevHigh && deMarkerVal<deMarkerPrevVal) { Comment("Bearish divergence","\n", "Current High is ",currentHigh,"\n", "Prev. High Value is ",prevHigh,"\n", "Current DeMarker Value is ",deMarkerVal,"\n", "Prev. DeMarker Value is ",deMarkerPrevVal); }
強気ダイバージェンスの場合:
if(currentLow<prevLow && deMarkerVal>deMarkerPrevVal) { Comment("Bullish divergence","\n", "Current Low is ",currentLow,"\n", "Prev. Low Value is ",prevLow,"\n", "Current DeMarker Value is ",deMarkerVal,"\n", "Prev. DeMarker Value is ",deMarkerPrevVal); }
このコードもコンパイルした後、ナビゲータで見つけて実行することができます。[OK]を押すと、以下のようにチャートに接続されていることがわかります。
先ほどのチャートの左上にあるように、チャートにEAを接続して、この売買戦略に基づいてEAから次のようなシグナルを受信できるようになっています。
強気ダイバージェンスの場合:
先ほどのチャートの左上にあるように、以下のようなシグナルが発生しています。
- 強気ダイバージェンス
- 現在の高値
- 前回の高値
- 現在のデマーカー値
- 前回のデマーカー値
弱気ダイバージェンスの場合:
先ほどのチャートの左上にあるように、以下のようなシグナルが生成されています。
- 弱気のダイバージェンス
- 現在の高値
- 前回の高値
- 現在のデマーカー値
- 前回のデマーカー値
結論
この記事では、デマーカーとは何か、何を測定するのか、どのように計算するのか、そしてどのように読み、どのように使うのか、その主な概念に基づいた簡単な戦略を学び、このテクニカル指標を詳しく確認しました。戦略は次のようにシンプルなものでした。
- DeMarker strength:現在のデマーカーの位置とデマーカー値の過去5期間の平均値から強弱のシグナルを受信する
- DeMarker, OB - OS:現在のデマーカーの値を0から1までのスケールで表示し、買われすぎ、売られすぎのシグナルを受信する
- DeMarker Divergence:現在のデマーカー、前回のデマーカー、現在の高値、前回の高値の位置から、強気または弱気のダイバージェンスのシグナルを受信する
その後、言及された各戦略の取引システムを作成するために、ステップバイステップの設計図を作成しました。そして、MetaTrader5によって自動的にシグナルを受信するために、言及された戦略の設計図で設計したものを元に取引システムを作成するという、最も興味深い話題について学びました。
繰り返しになりますが、どんな戦略も、使う前に必ずテストして、自分の取引に適しているかどうかを確認する必要があります。この記事が読者にとって有用であり、記事のトピックまたは関連するトピックについて有益な洞察を得られることを願っています。同様の記事をもっとお読みになりたい場合は、この初心者向け連載の以前の記事で、最もテクニカルな指標とそれらに基づいて簡単な取引システムを作成する方法についてお読みください。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/11394





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索