
MQL5を使った線の扱い方
はじめに
私たちトレーダーは、取引中に重要なレベルを観察するために多くの線を引き、それに基づいて適切な取引判断を下せるようにします。これらの線は私たちにとって非常に重要であり、自動的に引いたりそれに基づいて適切な判断をするような方法があるのかと疑問に思うかもしれません。あればとても助かると思うからです。その答えは「ある」です。MQL5(MetaQuotes言語5)には、その方法があります。
この記事は、MQL5 によってこれらの線を処理する方法を学ぶための例です。このようなことをおこなうには多くの方法があり、何をする必要があるかによって異なるからです。線には多くの種類がありますが、ここではその人気の高さのみから、トレンドライン、支持線と抵抗線の3つだけを取り上げます。
以下のトピックを通して、それらをカバーしていきます。
一般的に、MQL5で線を扱うには多くの方法があります。ここでは簡単な方法を紹介しますが、ご自分の戦略に合わせて開発する必要があるかもしれません。ここでは、価格水準を検知して更新された線を引く方法を紹介します。
線の種類、手動で描く方法、取引に使う方法などを特定しながら、線とは何かについて詳しく学びます。MQL5を使用してトレンドライン、支持線と抵抗線を使って取引プロセスを容易にし、自動化によって取引結果を向上させるのに役立てる方法を学びます。MetaTrader 5取引ターミナルに組み込まれているMQL5(MetaQuotes言語5)を使ってプログラムをコーディングします。使い方がわからない場合は、以前の記事から「MetaEditorでMQL5コードを書く」を読むと、詳細がわかります。
私のアドバイスは、読んだことを自分で書いて適用してみることです。このステップは、コーディングスキルを向上させるために非常に重要です。さらに、この記事のトピックや取引結果を開発および強化するのに役立つ関連トピックについてより多くの洞察を得るための理解を深めます。
トレンドラインとMQL5
線は、より効果的な結果を得るために取引に使用できるテクニカルツールです。効果的な意思決定をおこなうためのトリガーとして使用することができる重要な価格やレベルの周りに引くくことができますが、線には多くの種類があります。今回は、この重要な線のうち、トレンドライン、支持線と抵抗線の3つについて言及します。
さて、ここからは、トレンドラインの見極めと対処法についてです。トレンドラインは、上か下への反発レベルとして使用できる、価格水準を視覚化するために使用できる線です。相場の方向性に応じて、価格の上にも下にも引かれることがあります。トレンドラインは、相場の方向性を見極めるのに役立つと言えます。価格が引いた線と少なくても3点で同じレベルで上に跳ね返れば、上昇トレンドラインとなります。逆に、価格が引いた線と少なくても3点で同じレベルで下に跳ね返れば、下降トレンドラインとなります。ここで重要なのは、トレンドラインはあくまでツールであり、それを正しく認識し、引くかどうかは自分次第であるということです。
トレンドラインは、トレンドラインの種類に基づいて注文を出すことで、取引に使用することができます。上昇トレンドラインがある場合、価格が上からこのトレンドラインを試しながら下に移動し、その後上に反発することが予想できるので、このトレンドライン付近で買い注文を出すことができます。逆に、下降トレンドラインがある場合、価格がこのトレンドラインを下から試しながら上昇し、その後下に反発することが予想できるので、この下降トレンドラインに沿って空売りまたは売り注文を出すことができます。
以下は、上昇トレンドラインの場合です。
明らかに上昇していることは先ほどの図でわかりますが、直近の3つの安値を結んでみると、上昇に向かう同じ線上にあることがわかります。
次は、市場からの上昇トレンドラインの例です。
先ほどのチャートにあるように、上昇トレンドラインは何度もタッチし、買い力を見つけた後で上に反発しているので、上昇トレンドの存在を確認することができます。
以下は下降トレンドのラインの場合です。
下向きの動きがあることは前の図で明らかです。最後の3つの高値をつなげようとした場合、それらが同じ下向きの線上にあることがわかります。
以下は、市場からの下降トレンドラインの例です。
先ほどのチャートにあるように、下降トレンドラインは何度もタッチし、売り力を見つけた後で下に反発しているので、下降トレンドの存在を確認することができます。
1.UpwardTrendline System
MetaTrader 5によって、自動的に上昇トレンドラインを作成し、潜在的な上昇のために価格の下に表示するプログラムを作成する必要があります。ティックごとに安値と上昇トレンドラインの有無を確認し、以前の上昇トレンドラインを削除し、安値の下に更新された青いトレンドラインを作成します。
そのためには、以下の手順を踏むことが1つの方法として考えられます。
ChartGetInteger関数を使用して、現在のチャートの対応するプロパティの返されたlong型の値に等しい整数変数を作成することによって、最初のローソク足の検出を作成します。パラメータは次の通りです。
- chart_id:チャート(0で現在のチャートを指定)
- prop_id:チャートプロパティIDでENUM_CHART_PROPERTY_INTEGER値のいずれかを使用可能(CHART_FIRST_VISIBLE_BARを使用)
- sub_window=0:チャートサブウインドウの数(0でメインチャートウィンドウを指定)
int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
double型のpLow変数を作成し、安値のローソク足の配列を作成します。
double pLow[];
ArraySetAsSeries関数を使用して、作成した配列を現在のデータから並び替え、成功した場合はtrue、それ以外の場合はfalseとなるブール値を返します。
ArraySetAsSeries(pLow,true);
CopyLow関数を使用して、作成したpLow配列にデータを入力し、現在時刻の銘柄の最安値を取得します。そのパラメータは次の通りです。
- symbol_name:銘柄(現在の銘柄に適用する_Symbolを使用)
- timeframe:期間を現在の期間に適用(_Periodを使用)
- start_pos:コピーする要素の開始位置(0を使用)
- count:コピーするデータカウント(事前に作成されたcandles変数を使用)
- low_array[]: コピー先配列(pLowを使用)
CopyLow(_Symbol,_Period,0,candles,pLow);
配列の最小値に等しくなるように整数型のcandleLow変数を作成してローソク足のLowを計算し、ArrayMinimum関数を使って配列の最小要素を返します。そのパラメータは次の通りです。
- array[]:配列(pLow配列を使用)
- start=0:確認を開始するインデックス(0を使用)
- count=WHOLE_ARRAY:確認する要素の数(candlesを使用)
int candleLow = ArrayMinimum(pLow,0,candles);
MqlRates関数を使用して、価格、出来高、スプレッドの情報を格納する価格の配列pArrayを作成します。
MqlRates pArray[];
pArray価格配列をArraySetAsSeries関数で並び替えます。
ArraySetAsSeries(pArray,true);
整数型のData変数を作成した後、価格データを価格配列にコピーし、 CopyRatesでMqlRates構造体の履歴データを取得します。そのパラメータは次の通りです。
- symbol:銘柄(現在のチャートに適用する_Symbolを使用)
- timeframe:期間(現在の期間に適用する_Periodを使用)
- start_pos:開始位置(0を使用)
- count:コピーするデータカウント(作成されたcandles変数を使用)
- rates_array[]:コピー先配列(pArrayを使用)
int Data = CopyRates(_Symbol,_Period,0,candles,pArray);
ObjectDelete関数を使用して、指定されたチャートから指定されたオブジェクトを削除することで、以前に作成されたトレンドラインを更新することができます。そのパラメータは次の通りです。
- chart_id:チャートID(現在の銘柄に適用する_Symbolを使用)
- name:削除するオブジェクトの名前(UpwardTrendlineを使用)
ObjectDelete(_Symbol,"UpwardTrendline");
ObjectCreateでトレンドラインオブジェクトを作成し、新しいトレンドラインを作成します。そのパラメータは次の通りです。
- chart_id:チャートID(現在の銘柄適用する_Symbolを使用)
- name:オブジェクト名(UpwardTrendlineを使用)
- type:オブジェクトタイプ(OBJ_TRENDを使用してトレンドラインを作成)
- nwin:ウィンドウのインデックス(0を使用してメインチャートウィンドウを使用)
- time1:最初のアンカーポイントの時間(pArray[candleLow].timeを使用)
- price1:最初のアンカーポイントの価格(pArray[candleLow].lowを使用)
- time1:N番目のアンカーポイントの時間(pArray[0].timeを使用)
- priceN: N番目のアンカーポイントの価格間(pArray[0].lowを使用)
ObjectCreate(_Symbol,"UpwardTrendline",OBJ_TREND,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low);
ObjectSetInteger関数で値をオブジェクトの色として設定し、トレンドラインの色を決定します。そのパラメータは次の通りです。
- chart_id:チャートID(現在のチャートを意味する0を使用)
- name:オブジェクト名(オブジェクトの定義済みの名前であるUpwardTrendlineを使用)
- prop_id:オブジェクトプロパティのIDでENUM_OBJECT_PROPERTY_INTEGERのいずれかを使用可能(OBJPROP_COLORを使用)
- prop_value:プロパティの値(作成されたトレンドラインの色としてBlueを使用)
ObjectSetInteger(0,"UpwardTrendline",OBJPROP_COLOR,Blue);
ObjectSetInteger関数でもトレンドラインのスタイルを決定できますが、ここではENUM_OBJECT_PROPERTY_INTEGERの1つであるOBJPROP_STYLEを使用して、作成したトレンドラインのスタイルとしてprop_valueをSTYLE_SOLIDにします。
ObjectSetInteger(0,"UpwardTrendline",OBJPROP_STYLE,STYLE_SOLID);
ObjectSetInteger関数でもトレンドラインの幅を決定できますが、ここではENUM_OBJECT_PROPERTY_INTEGERの1つであるOBJPROP_WIDTHを使用して、トレンドラインの幅としてprop_valueを3にします。
ObjectSetInteger(0,"UpwardTrendline",OBJPROP_WIDTH,3);
ObjectSetInteger関数でもトレンドライン光線の判定ができますが、ここではENUM_OBJECT_PROPERTY_INTEGERの1つであるOBJPROP_RAY_RIGHTを使用して、prop_valueをtrueにします。
ObjectSetInteger(0,"UpwardTrendline",OBJPROP_RAY_RIGHT,true);
以下は、この上昇トレンドラインを自動的に作成するシステムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| UpwardTrendline System.mq5 | //+------------------------------------------------------------------+ void OnTick() { int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); double pLow[]; ArraySetAsSeries(pLow,true); CopyLow(_Symbol,_Period,0,candles,pLow); int candleLow = ArrayMinimum(pLow,0,candles); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int Data = CopyRates(_Symbol,_Period,0,candles,pArray); ObjectDelete(_Symbol,"UpwardTrendline"); ObjectCreate(_Symbol,"UpwardTrendline",OBJ_TREND,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low); ObjectSetInteger(0,"UpwardTrendline",OBJPROP_COLOR,Blue); ObjectSetInteger(0,"UpwardTrendline",OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,"UpwardTrendline",OBJPROP_WIDTH,3); ObjectSetInteger(0,"UpwardTrendline",OBJPROP_RAY_RIGHT,true); } //+------------------------------------------------------------------+
このコードを書いたらコンパイルして、エラーが出ないようにしなければなりません。 その後、ナビゲータウィンドウでエキスパートアドバイザー(EA)が以下のように表示されます。
このEAをチャート上にドラッグ&ドロップすると、次のようなEAウィンドウが表示されます。
[アルゴリズム取引を許可する]にチェックを入れて[OK]を押すと、EAがチャートに接続され、次の例のように、このEAをベースにしたアクションを見ることができます。
先ほどのチャートにあるように、EAは右上に接続されており、青い上昇トレンドラインが価格の下に描かれています。
2.DownwardTrendline System
MetaTrader 5によって、自動的に下降トレンドラインを作成し、潜在的な下降のために価格の下に表示するプログラムを作成する必要があります。ティックごとに高値と下降トレンドラインの有無を確認し、そして、以前の下降トレンドラインを削除し、高値の上に更新された青いトレンドラインを作成します。
そのための1つの方法として、以下の完全なコードを使用することができます。
//+------------------------------------------------------------------+ //| DownwardTrendline System.mq5 | //+------------------------------------------------------------------+ void OnTick() { int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); double pHigh[]; ArraySetAsSeries(pHigh,true); CopyHigh(_Symbol,_Period,0,candles,pHigh); int candleHigh = ArrayMaximum(pHigh,0,candles); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int Data = CopyRates(_Symbol,_Period,0,candles,pArray); ObjectDelete(_Symbol,"DnwardTrendline"); ObjectCreate(_Symbol,"DnwardTrendline",OBJ_TREND,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_COLOR,Blue); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_WIDTH,3); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true); } //+------------------------------------------------------------------+
このコードの違いは次の通りです。
高値のローソク足の配列を作成します。
double pHigh[];
作成した配列を現在のデータから並び替えます。
ArraySetAsSeries(pHigh,true);
配列にデータを入力します。
CopyHigh(_Symbol,_Period,0,candles,pHigh);
candle変数を作成して高値を計算します。
int candleHigh = ArrayMaximum(pHigh,0,candles);
過去の下降トレンドラインを削除します。
ObjectDelete(_Symbol,"DnwardTrendline");
新しい下降トレンドラインを作成します。
ObjectCreate(_Symbol,"DnwardTrendline",OBJ_TREND,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high);
OBJPROP_COLORで下降トレンドラインの色を青にします。
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_COLOR,Blue);
OBJPROP_STYLEとSTYLE_SOLIDで下降トレンドラインのスタイルをソリッドにします。
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_STYLE,STYLE_SOLID);
OBJPROP_WIDTHで下降トレンドラインの幅を3にします。
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_WIDTH,3);
OBJPROP_RAY_RIGHTで下降トレンドラインのレイを決定します。
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);
エラーなしでコンパイルした後、ナビゲータウィンドウで、前に述べたようにEAが表示されます。EAを接続した後、このEAに基づいて必要なアクションを取る準備が整いますが、以下のように下降トレンドラインが描かれていることが分かります。
チャートの右上にEAが接続されており、このレベルには買い優勢であるため、価格の上に下降トレンドのラインが引かれています。
支持レベルとMQL5
支持レベルとは、現在の価格よりも下にある価格レベルやゾーンのことで、このレベル周辺には買い勢力が存在するため、その周辺で上への反発を見出すことができます。買いポイントとしてトリガーさせることができるので、非常に重要です。支持線にはいろいろな形がありますが、そのひとつに水平支持線があります。この形は次のようなものです。
以下は、市場からの支持レベルの例です。
先ほどのチャートにあるように、価格の下には緑色の支持線があり、これは価格の上向きへの反発レベルとして使用できます。
ティックごとに安値と支持線の有無を確認し、そして、以前の支持線を削除し、安値の下に更新された緑の支持線を作成します。 この支持線は、以下のコードと同じようにMQL5で描画して処理することができます。
//+------------------------------------------------------------------+ //| Support Line System.mq5 | //+------------------------------------------------------------------+ void OnTick() { int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); double pLow[]; ArraySetAsSeries(pLow,true); CopyLow(_Symbol,_Period,0,candles,pLow); int candleLow = ArrayMinimum(pLow,0,candles); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int Data = CopyRates(_Symbol,_Period,0,candles,pArray); ObjectDelete(_Symbol,"supportLine"); ObjectCreate(_Symbol,"supportLine",OBJ_HLINE,0,pArray[candleLow].time,pArray[candleLow].low,pArray[0].time,pArray[0].low); ObjectSetInteger(0,"supportLine",OBJPROP_COLOR,Green); ObjectSetInteger(0,"supportLine",OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,"supportLine",OBJPROP_WIDTH,3); ObjectSetInteger(0,"supportLine",OBJPROP_RAY,true); } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
以前のsupportLineという名前の支持線をすべて削除します。
ObjectDelete(_Symbol,"supportLine");
必要なオブジェクトのタイプにOBJ_HLINEを使用して、新しい支持線を作成します。
ObjectCreate(_Symbol,"supportLine",OBJ_HLINE,0,pArray[candleLow].time,pArray[candleLow].low, pArray[0].time,pArray[0].low);
OBJPROP_COLORを使用して支持線の色を決定します。
ObjectSetInteger(0,"supportLine",OBJPROP_COLOR,Green);
OBJPROP_STYLEとSTYLE_SOLIDを使用して支持線のスタイルを決定します。
ObjectSetInteger(0,"supportLine",OBJPROP_STYLE,STYLE_SOLID);
OBJPROP_WIDTHを使用して支持線の幅を決定します。
ObjectSetInteger(0,"supportLine",OBJPROP_WIDTH,3);
OBJPROP_RAYを使用して支持線のレイを決定します。
ObjectSetInteger(0,"supportLine",OBJPROP_RAY,true);
このコードがエラーなくコンパイルされたら、先程と同じようにチャートに接続します。その後、チャートに接続し、下の例のように支持線が引かれていることが分かるので、その動作を確認することができます。
先ほどのチャートにあるように、Support System EAは右上隅に接続されていて、価格の下には支持線があります。
抵抗レベルとMQL5
抵抗レベルとは、現在の価格よりも上にある価格レベルやゾーンのことです。このレベル付近では売り勢力が存在するため、その周辺で下への反発を見出すことができます。売りポイントとしてトリガーさせることができるので、非常に重要です。この抵抗線にはいろいろな形がありますが、そのひとつに水平方向の抵抗線があり、次のような形をしています。
以下は、市場からの抵抗レベルの例です。
先ほどのチャートにあるように、価格の上には赤い抵抗線があります。このレベル付近は買い優勢であるため、これは価格の下向きへの反発レベルとして使用できます。
ティックごとに高値と抵抗線の有無を確認し、そして、以前の抵抗線を削除し、高値の上に更新された赤い抵抗線を作成します。 この抵抗線は、以下のコードと同じようにMQL5で描画し、処理することができます。
//+------------------------------------------------------------------+ //| Resistance Line System.mq5 | //+------------------------------------------------------------------+ void OnTick() { int candles=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); double pHigh[]; ArraySetAsSeries(pHigh,true); CopyHigh(_Symbol,_Period,0,candles,pHigh); int candleHigh = ArrayMaximum(pHigh,0,candles); MqlRates pArray[]; ArraySetAsSeries(pArray,true); int Data = CopyRates(_Symbol,_Period,0,candles,pArray); ObjectDelete(_Symbol,"resistanceLine"); ObjectCreate(_Symbol,"resistanceLine",OBJ_HLINE,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high); ObjectSetInteger(0,"resistanceLine",OBJPROP_COLOR,Red); ObjectSetInteger(0,"resistanceLine",OBJPROP_STYLE,STYLE_SOLID); ObjectSetInteger(0,"resistanceLine",OBJPROP_WIDTH,3); ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true); } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
resistanceLineという名前を持つ以前の抵抗線を削除します。
ObjectDelete(_Symbol,"resistanceLine");
必要なオブジェクトのタイプにOBJ_HLINEを使用して抵抗線を新規に作成します。
ObjectCreate(_Symbol,"resistanceLine",OBJ_HLINE,0,pArray[candleHigh].time,pArray[candleHigh].high,pArray[0].time,pArray[0].high);
OBJPROP_COLORを使用して抵抗線の色を決定します。
ObjectSetInteger(0,"resistanceLine",OBJPROP_COLOR,Red);
OBJPROP_STYLEとSTYLE_SOLIDを使用して抵抗線のスタイルを決定します。
ObjectSetInteger(0,"resistanceLine",OBJPROP_STYLE,STYLE_SOLID);
OBJPROP_WIDTHを使用して抵抗の幅を決定します。
ObjectSetInteger(0,"resistanceLine",OBJPROP_WIDTH,3);
OBJPROP_RAY_RIGHTを使用して抵抗線のレイを決定します。
ObjectSetInteger(0,"DnwardTrendline",OBJPROP_RAY_RIGHT,true);
このコードがエラーなくコンパイルされたら、先程と同じようにチャートに接続します。その後、Resistance System EAがチャートに接続され、以下のように動作をすることがわかります。
先ほどのチャートにあるように、Resistance System EAは右上隅に接続されていて、価格の上には抵抗線があります。
結論
これで、取引で使用できる重要な3つの線を詳しく理解することができたと思います。トレンドライン(上昇トレンドライン、下降トレンドライン)、支持線、抵抗線とは何か、どのように使うことができるかを学びました。また、MQL5によって、ひとつひとつ独自のシステムを作ってこれらを自動に引くことで、どのように対処できるかを学びました。また、このコードは、注文を送信してそれに基づいて取引を実行するように開発することができます。この記事は主に教育目的だけなので、それらが有益であることを確認するためには本当の口座で使用する前にはテストする必要があります。
この記事がお役に立ったことを願っています。これらのツールを他の高度なシステムの一部として、あるいは個別に使って、ご自分に有利な使い方を学んでいただければと思います。読者がこの記事のトピックまたは任意の関連するトピックに関して有用な洞察を得て、より良い取引結果を得られること、そして便利で有益なツールでそれらを強化できることを願っています。また、メリットを得てコーディングスキルを向上させるために、言及したコードをご自分でテストし、書いてみていただければと思います。
この記事が役に立ち、MQL5や最も人気のあるテクニカル指標を使った取引システムの設計方法についての記事をもっと読みたい方は、私の以前の記事をご覧ください。移動平均、RSI、MACD、ストキャスティック、パラボリックSARなどの最も人気のあるテクニカル指標に基づいて取引システムを設計する方法などの記事があるので、詳しく学ぶことができます。
MQL5の基本やアルゴリズム取引システムを設計する理由や方法についてもっと学びたい場合は、以前の記事もご覧ください。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/11538



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