アクセラレーターオシレーター(Accelerator Oscillator)による取引システムの設計方法を学ぶ
はじめに
最も人気のあるテクニカル指標に基づいて取引システムを設計する方法を学ぶための連載の新しい記事です。この記事では、取引に有利に働く新しいテクニカルツールを学びます。アクセラレーターオシレーター(Accelerator Oscillator、AC)とは何か、何を測定するのか、どのように計算するのか、どのように読み、どのように使うのかを簡単な取引戦略を通して学び、それらを基にどのように取引システムを作ることができるのかを学びながら、この指標について詳しく説明します。
以下のトピックは、この指標をより深く知るための道しるべとなるものです。
MQL5(MetaQuotes言語5)は、取引システムの実行に使用されるMetaTrader 5取引ターミナルに組み込まれており、これを使ってコードを記述することができます。MetaTrader 5をダウンロードしてMQL5を使用する方法については、以前の記事から「MetaEditorでMQL5のコードを書く」のトピックをお読みになると、より詳しく学ぶことができます。ここで言及された戦略はすべて教育目的でのみ設計されており、実際の口座で使用する前にテストして、収益性が高く、ご自分に適していることを確認する必要があります。ご自分の取引とコーディングスキルを向上させたい場合は、学んだことを適用してみることをお勧めします。この手順がこの記事から最大の利益を得るために役立つからです。
免責条項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。
ACオシレータ定義
Accelerator Oscillator (AC)は、Bill Williamsによって開発されたモメンタム(運動量)指標です。モメンタムに変化があるかどうかを測定するものです。上昇トレンドのモメンタムが低下した場合、買い意欲が低下していることを意味し、この場合、売り方向とは逆の動きが見られる可能性があります。この逆も同じです。逆に下降トレンドのモメンタムが低下した場合、売り意欲が低下して買い勢が見られる可能性があります。また、価格よりも先に動くことがあるため、先行指標でもあります。
この指標の主な目的は、上下両方向の市場の力の加速と減速を測定し、現在の値動きがいつまで続くかを洞察し、変化に備えることです。
次に、この指標を以下の手順で手動で計算する方法を学びます。
AC = AO - SMA (AO, 5)
ここで、
AC = アクセレレータ―オシレーター
AO = オーサムオシレーター(オーサムオシレーターについては以前の記事を読んでいただければと思います。)
SMA = 単純移動平均
5=SMAの期間
以下の手順でAOを計算します。
MEDIAN PRICE = (HIGH + LOW) /2
AO = SMA (MEDIAN PRICE, 5) - SMA (MEDIAN PRICE, 34)
幸いなことに、MetaTrader 5の取引プラットフォームにはこの指標が搭載されているため、手動で計算する必要はなく、必要なのは利用可能な指標からこの指標を選択することだけです。取引ターミナルを開き、[挿入] -> [インディケータ] -> [Bill Williams] -> [Accelerator Oscillator]を押します。
すると、次と同じような、好みを設定するための指標パラメータのウィンドウが表示されます。
1 - アップ値の色
2 - ヒストグラムの太さ
3 - ダウン値の色
これらのパラメータを望見通りに決定して[OK]を押すと、以下のようにチャートに指標が挿入されることがわかります。
先ほどのチャートでわかるように、チャートの下部に指標が挿入されています。ACの値はモメンタムの加速をもとにゼロ付近で振動しています。
ゼロレベルは、市場関係者のブルとベアのバランスが取れていることを意味します。ACがゼロレベルを上回れば上昇が継続し、逆にACがゼロレベルを下回れば下降が継続することがわかります。
ACオシレーター戦略
このトピックでは、AC指標の基本的な概念に基づいて使用する簡単な取引戦略を学びます。ただし、ここでの主な目的は教育だけなので、実際の口座で使用する前にテストする必要があります。ご自分の取引に適しているか、利益が出るかを確認する必要があります。
この戦略では、ACを使用し、現在のAC値とAC指標のゼロレベルの2つの値を比較してその位置を決定し、強気または弱気のシグナルがあるかを判断します。現在のAC値がゼロレベルを上回れば、強気のシグナルとなります。もう1つのシナリオは、現在のAC値がゼロレベルを下回り弱気のシグナルとなる場合です。
単純に言うと次のようになります。
AC > ゼロレベル -> 強気
AC < ゼロレベル -> 弱気
この戦略では、現在のAC値と過去10回のAC値のAC最大値とAC最小値との比較から、ACの動きの強弱のシグナルを取得します。すべての値の位置を決定して、適切なシグナルを取得する必要があります。現在のAC値がAC最大値を上回る場合は、強さのシグナルとなります。一方、現在のAC値がAC最小値を下回る場合は、弱さのシグナルとなります。
単純に言うと次のようになります。
AC > AC最大値 -> ACが強い
AC < AC最小値 -> ACが弱い
この戦略では、終値、50期間の指数移動平均、現在のAC、過去10回のAC値のAC最大値、AC最小値の5つの値を確認し、それらの位置を決定することによって、売買のシグナルを得ます。現在のACがAC最大値を上回り、終値が50期間EMAを上回る場合、買いシグナルとなります。もう1つのシナリオは、現在のACがAC最小値を下回り、終値が50期間EMAを下回り、売りシグナルとなる場合です。
単純に言うと次のようになります。
AC > AC最大値かつ終値 > 50 - EMA -> 買い
AC < AC最小値かつ終値 < 50 - EMA -> 売り
ACオシレーターの戦略設計図
このトピックでは、言及されたすべての戦略について、取引システムを作成するためのステップバイステップの設計図を設計します。
この戦略では、現在のAC値とAC指標のゼロレベルを継続的に確認し、適切なシグナルを返すために、それらの位置を決定することに基づいて、チャート上のコメントとして強気または弱気のシグナルを自動的に生成するために使用できる取引システムを作成します。現在のAC値がゼロレベルを上回る場合、取引システムは以下の値でチャートにコメントを返す必要があります。
- 強気
- AC値
一方、AC値がゼロレベルを下回る場合は、次のような値でチャートにコメントを返すような取引システムが必要です。
- 弱気
- AC値
この取引システムを作るための設計図は以下の通りです。
この戦略では、AC指標の現在のAC値、最大値、過去10回の最小値の3つの値を継続的に確認し、ACの動きの強弱でシグナルを生成する取引システムを作成する必要があります。現在のAC値が最大値を上回る場合、取引システムは以下の値でチャートにコメントを返す必要があります。
- ACは強い
- AC値
- AC最大値
- AC最小値
一方、現在のAC値が最小値を下回る場合、取引システムは以下の値でチャートにコメントを返す必要があります。
- ACは弱い
- AC値
- AC最大値
- AC最小値
この取引システムを作るための設計図は以下の通りです。
この戦略では、現在のAC、最大AC、最小AC、終値、移動平均値の5つの値を継続的に確認し、それらの位置関係を判断して適切なシグナルを生成し、チャート上にコメントとして売買シグナルを生成できる売買システムを構築する必要があります。現在のACがAC最大値を上回り、終値が移動平均を上回る場合、取引システムはシグナルとして以下の値でチャート上にコメントを生成する必要があります。
- 買
- 終値
- AC値
- AC最大値
- AC最小値
- MA値
一方、現在のACがAC最小値を下回り、終値が移動平均を下回る場合、取引システムは以下の値でチャートにコメントを返す必要があります。
- 売り
- 終値
- AC値
- AC最大値
- AC最小値
- MA値
この取引システムを作るための設計図は以下の通りです。
ACオシレーター取引システム
この興味深いトピックでは、前述の戦略に基づいて取引システムを作成しますが、現在のAC値でチャートにコメントを返すことができる簡単な取引システムを作成してそれらの基盤を作成し、その手順を説明します。
double型のfiArray配列を作成します。
double acArray[];
acArrayにArraySetAsSeries関数を使用し、ブール値としてtrueまたはfalseを返します。そのパラメータは次の通りです。
- array[]:acArrayを使用
- flag:配列のインデックス方向としてtrueを使用
ArraySetAsSeries(acArray,true);
AC指標のハンドルを返すiAC関数を使ってAC指標を定義します。そのパラメータは次の通りです。
- symbol:現在の銘柄に適用(_Symbolを使用)
- period:現在の期間または時間枠に適用(_Periodを使用)
int acDef = iAC(_Symbol,_Period);
CopyBuffer関数を使って、RVI指標のバッファからデータを取得します。そのパラメータは次の通りです。
- indicator_handle:定義済み指標ハンドル(acDefを使用)
- buffer_num:指標バッファの番号(0を使用)
- start_pos:開始位置(0を使用)
- count:コピーする量(3を使用)
- buffer[]:コピー先配列(acArrayを使用)
CopyBuffer(acDef,0,0,3,acArray);
acVal用のdouble変数を作成し、NormalizeDoubleで正規化した後にAC値を定義します。NormalizeDoubleのパラメータは以下の通りです。
- value:正規化された数値(acArray[0]を使用)
- digits:小数点以下の桁数(7を使用)
double acVal = NormalizeDouble(acArray[0],7);
Comment関数を使って、現在のAC値をチャートにコメントとして生成します。
Comment("AC Value is ",acVal);
この取引システムを作るための設計図は以下の通りです。
//+------------------------------------------------------------------+ //| Simple AC.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 acArray[]; ArraySetAsSeries(acArray,true); int acDef = iAC(_Symbol,_Period); CopyBuffer(acDef,0,0,3,acArray); double acVal = NormalizeDouble(acArray[0],7); Comment("AC Value is ",acVal); } //+------------------------------------------------------------------+
このコードをコンパイルすると、下図のように、ナビゲータ ウィンドウにEAとして表示されます。
このファイルを実行するには、目的のチャートにドラッグ&ドロップすると、次のようなウィンドウが表示されます。
先のチャートでわかるように、EAがチャートの右上に接続されています。これでシグナルを受信する準備が整いました。次のようになります。
左上に、現在のAC値に対するコメントがあることがわかります。
以下は、この戦略の取引システムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| AC Zero Crossover.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 acArray[]; ArraySetAsSeries(acArray,true); int acDef = iAC(_Symbol,_Period); CopyBuffer(acDef,0,0,3,acArray); double acVal = NormalizeDouble(acArray[0],7); if(acVal > 0) { Comment("Bullish","\n" "AC Value is ",acVal); } if(acVal < 0) { Comment("Bearish","\n" "AC Value is ",acVal); } } //+------------------------------------------------------------------+
このコードの違いは次の通りです。
戦略の条件
強気シグナルの場合
if(acVal > 0) { Comment("Bullish","\n" "AC Value is ",acVal); }
弱気シグナルの場合
if(acVal < 0) { Comment("Bearish","\n" "AC Value is ",acVal); }
このコードをコンパイルして、エラーがないことを確認してから、先ほど習ったのと同じようにチャート上にドラッグ&ドロップして実行すると、次のようにチャートに接続するのがわかります。
右上で、この戦略のEAがチャートに接続されているのがわかります。これでシグナルを受信する準備が整いました。
強気シグナル:
左上には、この戦略のシグナルとして、以下の値を持つコメントが表示されていることがわかります。
- 強気
- AC値
弱気シグナルの場合
左上には、以下のような値があることがわかります。
- 弱気
- AC値
以下は、この戦略の取引システムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| AC 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 acArray[]; ArraySetAsSeries(acArray,true); int acDef = iAC(_Symbol,_Period); CopyBuffer(acDef,0,0,11,acArray); double acCurrVal = NormalizeDouble(acArray[0],7); int acMaxArray = ArrayMaximum(acArray,1,WHOLE_ARRAY); int acMinArray = ArrayMinimum(acArray,1,WHOLE_ARRAY); double acMaxVal = NormalizeDouble(acArray[acMaxArray],7); double acMinVal = NormalizeDouble(acArray[acMinArray],7); if(acCurrVal>acMaxVal) { Comment("AC is strong ","\n", "AC Value is ",acCurrVal,"\n", "AC Max is ",acMaxVal,"\n", "AC Min is ",acMinVal); } if(acCurrVal<acMinVal) { Comment("AC is weak ","\n", "AC Value is ",acCurrVal,"\n", "AC Max is ",acMaxVal,"\n", "AC Min is ",acMinVal); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
ACの現在値を定義します。
double acCurrVal = NormalizeDouble(acArray[0],7);
ArrayMaximum」関数で最大値を返すことで、ACの配列全体における最大値を定義します。そのパラメータは次の通りです。
- array[]:acArrayを使用
- start:確認する開始点。(1を使用)
- count:確認する配列の要素の合計。この配列の全体を確認するために、WHOLE_ARRAYを使用することにします。
int acMaxArray = ArrayMaximum(acArray,1,WHOLE_ARRAY);
ArrayMinimum関数で最小値を返すことで、ACの配列全体における最小値を定義します。そのパラメータは次の通りです。
- array[]:acArrayを使用
- start:確認する開始点(1を使用)
- count:確認する配列の要素の合計。この配列の全体を確認するために、WHOLE_ARRAYを使用することにします。
int acMinArray = ArrayMinimum(acArray,1,WHOLE_ARRAY);
NormalizeDouble関数で最大値と最小値を正規化します。
double acMaxVal = NormalizeDouble(acArray[acMaxArray],7); double acMinVal = NormalizeDouble(acArray[acMinArray],7);
戦略の条件は次の通りです。
シグナルが強い場合
if(acCurrVal>acMaxVal) { Comment("AC is strong ","\n", "AC Value is ",acCurrVal,"\n", "AC Max is ",acMaxVal,"\n", "AC Min is ",acMinVal); }
シグナルが弱い場合
if(acCurrVal<acMinVal) { Comment("AC is weak ","\n", "AC Value is ",acCurrVal,"\n", "AC Max is ",acMaxVal,"\n", "AC Min is ",acMinVal); }
このコードをコンパイルして目的のチャート上で実行すると、次のように接続されていることがわかります。
チャートの右上でEAが接続されていることがわかります。テストから次の例と同じようなこの戦略のシグナルを受信する準備が整いました。
強いシグナルの場合
チャートの左上でわかるように、次のような値のシグナルを受信しています。
- ACは強い
- AC値
- AC最大値
- AC最小値
弱いシグナルの場合
その結果、以下のようなシグナルが得られました。
- ACは弱い
- AC値
- AC最大値
- AC最小値
以下は、この戦略の取引システムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| AC & MA Strategy.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() { MqlRates pArray[]; double acArray[]; double maArray[]; int Data=CopyRates(_Symbol,_Period,0,1,pArray); ArraySetAsSeries(acArray,true); ArraySetAsSeries(maArray,true); int acDef = iAC(_Symbol,_Period); int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE); CopyBuffer(acDef,0,0,3,acArray); CopyBuffer(maDef,0,0,3,maArray); int acMaxArray = ArrayMaximum(acArray,1,WHOLE_ARRAY); int acMinArray = ArrayMinimum(acArray,1,WHOLE_ARRAY); double closingPrice = pArray[0].close; double acVal = NormalizeDouble(acArray[0],7); double acMaxVal = NormalizeDouble(acArray[acMaxArray],7); double acMinVal = NormalizeDouble(acArray[acMinArray],7); double maVal = NormalizeDouble(maArray[0],7); if(acVal > acMaxVal && closingPrice > maVal) { Comment("Buy","\n" "Closing Price is ",closingPrice,"\n", "Ac Value is ",acVal,"\n", "AC Max is ",acMaxVal,"\n", "AC Min is ",acMinVal,"\n", "MA Value is ",maVal); } if(acVal < acMinVal && closingPrice < maVal) { Comment("Sell","\n" "Closing Price is ",closingPrice,"\n", "Ac Value is ",acVal,"\n", "AC Max is ",acMaxVal,"\n", "AC Min is ",acMinVal,"\n", "MA Value is ",maVal); } } //+------------------------------------------------------------------+
このコードの違いは次の通りです。
pArray、acArray、maArray の各配列を作成します。acArrayとmaArrayにはdoubleを使用しますが、pArrayにはMqlRates関数を使用して、価格、出来高、スプレッドの情報を格納します。
MqlRates pArray[]; double acArray[]; double maArray[];
AS_SERIESフラグを先ほどのacArrayとmaArrayの配列に設定し、CopyRates関数を使って、MqlRates構造体の履歴データを取得し、そのパラメータをData定義しています。
- symbol:現在の銘柄に適用(_Symbolを使用)
- period:現在の期間に適用(_Periodを使用)
- start_pos:開始位置(0を使用)
- count:コピーするデータカウント(1を使用)
- rates_array[]:コピー先配列(pArrayを使用)
int Data=CopyRates(_Symbol,_Period,0,1,pArray); ArraySetAsSeries(acArray,true); ArraySetAsSeries(maArray,true);
AC、MAを定義することになります。
iCA関数によるACは、先ほどと同じです。しかし、MAでは、iMA関数を使用します。そのパラメータは次の通りです。
- symbol:_Symbolを使用
- period:_periodを使用
- ma_period:移動平均の期間(50を使用)
- ma_shift:水平方向のシフト(0を使用)
- ma_method:移動平均の種類(指数MAを使用)
- applied_price:価格の種類(終値を使用)
int acDef = iAC(_Symbol,_Period); int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
CopyBuffer関数を使って、AC指標とMA指標のバッファからデータを取得します。
CopyBuffer(acDef,0,0,3,acArray); CopyBuffer(maDef,0,0,3,maArray);
acArrayの最大値と最小値を取得します。
int acMaxArray = ArrayMaximum(acArray,1,WHOLE_ARRAY); int acMinArray = ArrayMinimum(acArray,1,WHOLE_ARRAY);
AC、AC最大値、AC最小値、指数移動平均値を定義します。
double acVal = NormalizeDouble(acArray[0],7); double acMaxVal = NormalizeDouble(acArray[acMaxArray],7); double acMinVal = NormalizeDouble(acArray[acMinArray],7); double maVal = NormalizeDouble(maArray[0],7);
戦略の条件
買いシグナルの場合
if(acVal > acMaxVal && closingPrice > maVal) { Comment("Buy","\n" "Closing Price is ",closingPrice,"\n", "Ac Value is ",acVal,"\n", "AC Max is ",acMaxVal,"\n", "AC Min is ",acMinVal,"\n", "MA Value is ",maVal); }
売りシグナルの場合
if(acVal < acMinVal && closingPrice < maVal) { Comment("Sell","\n" "Closing Price is ",closingPrice,"\n", "Ac Value is ",acVal,"\n", "AC Max is ",acMaxVal,"\n", "AC Min is ",acMinVal,"\n", "MA Value is ",maVal); }
このコードをコンパイルして実行すると、次のようにシグナルを受信するために接続されます。
チャートの右上にEAが接続しているのがわかります。これで、シグナルを受信できるようになりました。
買いシグナルの場合
左上にあるように、次のような値になっていることがわかります。
- 買
- 終値
- AC値
- AC最大値
- AC最小値
- MA値
売りシグナルの場合
以下の値のコメントがあります。
- 売り
- 終値
- AC値
- AC最大値
- AC最小値
- MA値
結論
この記事で学んだことをすべて踏まえれば、アクセレレータ―オシレーターをよく理解出来たかと思います。それが何であるか、何を測定するか、どのように計算するか、どのように読み、どのように使うか、簡単な取引戦略を通じて学ぶことができました。
- AC Zero Crossover:AC値とAC指標のゼロレベルとのクロスオーバーに基づいて強気と弱気のシグナルを取得
- AC Strength:現在のAC値と過去10回のAC値の最大値および最小値との比較により、AC動作の強さを示すシグナルを取得
- AC & MA戦略:終値、50期間の指数移動平均、AC現在値、AC最大値、AC最小値の位置関係から売買シグナルを取得
次に、取引システムを簡単に、効果的かつスムーズに構築するために、すべての戦略について段階的な設計図を作成しました。そして、この記事の最も興味深い部分は、これらの戦略に基づいて取引システムを作成し、MetaTrader 5で実行して、適用する条件を手動で読んだり監視したりせずに自動シグナルを生成するコードを作成したことです。
この記事の冒頭でも言いましたが、読者が、学んだことの適用を試み、この記事のトピックまたは任意の関連するトピックについてのより多くの洞察を得ることによって、この記事から完全な利益を得たことを願っています。ここでもう一度確認しておきたいのは、すべての人に適した戦略というものはないので、実際の口座で使用する前に、その戦略が利益を生むか、あるいは自分の取引スタイルに適しているかを必ずテストする必要があるということです。さらに、ここでの主な目的はあくまでも教育です。
この記事が読者の取引のために有用で、より良い結果を得られることを願っています。RSI、MACD、MA、ストキャスティック、ボリンジャーバンドのような最も人気のあるテクニカル指標に基づいて取引システムを設計する方法についてのより多くの類似した記事をお読みになりたい場合は、この連載の過去記事を読んでいただければと思います。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/11467
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索