オーサムオシレーター(Awesome Oscillator)による取引システムの設計方法を学ぶ
はじめに
これは、物事の根本を学ぶことを通して、初心者が人気の高いテクニカル指標を基盤とした取引システムの設計方法を学べる連載の新しい記事です。この記事では、新しいテクニカルツールを学びます。それは、オーサムオシレーター(Awesome Oscillator、AO)という指標で、それをより詳細に確認し、それが何であるか、何を測定するか、そして簡単な戦略を通してその背後にある主な概念に基づく使用方法、そしてこれらの言及された戦略に基づいて取引システムを作成する方法について学びます。
この指標を次のトピックを通して詳しくカバーしていきます。
MQL5(MetaQuotes言語5)を使ってコードを書き、MetaTrader 5取引ターミナルを使って設計した取引システムを実行します。MetaTrader 5にはMQL5が組み込まれています。ダウンロードや使用の方法を知りたい方は、以前の記事から「MetaEditorでMQL5コードを書く」のトピックを読んでみてください。ダウンロードして学んだことを自分で実践し、コーディングスキルを向上させることをお勧めします。
免責条項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。
オーサムオシレーターの定義
このトピックでは、オーサムオシレーター(Awesome Oscillator、AO)指標について詳しく学びます。AOは、ビル・ウィリアムズによって開発され、勢いを測定するためのもので、売り手と買い手が持つパワーやコントロールを明らかにするために使用されます。このモメンタムは、過去5本のバーまたはローソクのモメンタムと、より大きな時間枠での過去34本のバーまたはローソクのモメンタムを比較することで、言い換えれば、最近のモメンタムとより大きな時間枠でのモメンタムを比較することで、測定されます。他のテクニカル指標やツールでAOシグナルを確認できたとき、それは大きな意味を持ち、より重要な意味を持つことになります。そのため、他の技術ツールを併用したほうがよいでしょう。この指標を理解し、深めるために手動で計算する方法をもし学びたいのであれば、以下の手順でおこなうことができます。
AOは、5期間単純移動平均と34期間単純移動平均の差です。AOの算出にあたっては、中央値を使用することにしています。
MEDIAN PRICE = (HIGH + LOW) / 2
AO = SMA (MEDIAN PRICE, 5) - SMA (MEDIAN PRICE, 34)
ここで、
MEDIAN PRICE = 商品の中央値
HIGH = 最高値
LOW = 最安値
AO = オーサムオシレーターの値
SMA = 単純移動平均
現在では、この指標は手動で計算する必要はなく、取引ターミナルでMetaTrader 5に内蔵されている様々なテクニカル指標から選択するだけでチャート上に表示されるようになっています。
チャートに挿入する方法は以下の通りです。MetaTrader 5取引ターミナルを開き、[挿入] -> [インディケータ] -> [Bill Williams] -> [Awesome Oscillator]をクリックします。
その後、AO指標のパラメータが以下のように表示されます。
ここで、
1 - 上昇した値の色
2 - ヒストグラムの太さ
3 - 下降した値の色
これらのパラメータを決定すると、以下のようにチャートに指標が挿入されることがわかります。
前のチャートでわかるように、チャートの下部にはゼロ付近で振動するヒストグラムバーがあり、これはモメンタムの測定値です。
オーサムオシレーターの戦略
このトピックでは、AO指標の背後にある主要概念に基づいて、教育のみを目的としたいくつかの簡単な戦略を通じて、AO指標の使い方を学びます。実際の口座で使用する前に、その戦略が有用で、収益性が高く、自分の取引に適しているかどうかを確認する必要があります。それに応じて、これらの戦略には最適化が必要であることがわかるかもしれません。これらの戦略の主な目的は教育のためだけであり、そのような状態は正常です。特に、より多くの洞察力を与えてくれる別のテクニカル指標やツールを使用すれば、より効果的な結果を得ることができるため、この指標と別のテクニカル指標を併用するのがよいでしょう。ところで、これはテクニカル分析の最も重要で効果的な特徴の1つです。多くのツールを使って様々な観点から下支えしている商品を見たり評価したりすることができ、それによって適切な投資や取引の決定を下して良い結果を得ることができるのです。今回は、より効果的な売買シグナルを得るために、もう1つのテクニカル指標である移動平均を同じように組み合わせてみましょう。
この戦略では、現在のAO値とゼロレベルの間のクロスオーバーに基づいて強気または弱気のシグナルを取得します。現在のAO値がゼロレベルを上回れば、強気のシグナルとなります。現在のAO値がゼロレベルを下回れば、弱気のシグナルとなります。
単純に言うと次のようになります。
現在のAO > 0 -> 強気
現在のAO < 0 -> 弱気
この戦略では、現在のAOの位置と直近のAOの値の5期間の平均から、AOの動きの強さを知る必要があります。現在のAO値が平均を上回る場合、AOの動きの強さを示すシグナルとなります。現在のAO値がAVGを下回れば、AOの動きの弱さを示すシグナルとなります。
単純に言うと次のようになります。
現在のAO > AOの5期間平均 -> AOが強い
現在のAO < AOの5期間平均 -> AOが弱い
この戦略では、終値と50期間指数移動平均の位置に加えて、現在のAO値とゼロレベルの位置から売買のシグナルを得る必要があります。現在のAO値がゼロレベルを上回り、同時に終値が50期間EMAを上回る場合、買いシグナルとなります。現在のAO値がゼロレベルを下回り、同時に終値がEMAを下回れば、売りシグナルとなります。
単純に言うと次のようになります。
現在のAO > ゼロレベル、かつ、終値 > 50期間EMA -> 買いシグナル
現在AO < ゼロレベル、かつ、終値 < 50期間EMA -> 売りシグナル
オーサムオシレーター戦略の設計図
言及された戦略ごとにステップバイステップの設計図を作成し、アイデアを整理することで簡単に取引システムを作ることができるようにします。
この戦略では、2つの値(現在のAO値とAO指標のゼロレベル)を継続的に比較することによって、強気または弱気のシグナルを生成し、それぞれの値の位置を決定し、市場の像を決定することができる取引システムを作成します。AO値がゼロレベルを上回る場合、取引システムは以下の値でチャート上にコメントを生成する必要があります。
- 強気
- AO値はn
もう1つのシナリオは、現在のAOの値がゼロレベルを下回る場合で、取引システムが以下の値でチャートにコメントを返す必要があります。
- 弱気
- AO値はn
以下は、この取引システムのステップバイステップについてです。
この戦略では、現在のAOと、現在のAOの前の過去5回のAOの平均値の2つの値を連続的に比較してどちらが大きいかを判断して、AOの動きの強さのシグナルを出すような売買システムを作ります。現在のAO値がAVGを上回る場合、取引システムは以下の値(シグナルとこのシグナルの理由となった値)を含むコメントを返す必要があります。
- AOの動きが強い
- AO CurrVal : n
- AO FirstVal : n
- AO SecondVal : n
- AO ThirdVal : n
- AOFourthVal:n
- AO FifthVal : n
- AO AvgVal : n
一方、現在のAOが平均より低い場合、取引システムは以下の値をコメントとして返す必要があります。
- AOの動きが弱い
- AO CurrVal : n
- AO FirstVal : n
- AO SecondVal : n
- AO ThirdVal : n
- AOFourthVal:n
- AO FifthVal : n
- AO AvgVal : n
以下は、この取引システムを作成するためのステップバイステップの設計図です。
前のトピックで学んだように、この戦略では、継続的に4つの値を比較することに基づいて、チャート上の売買の適切なシグナルとコメントを返すために使用することができる取引システムを作成する必要があります、
- 現在のAO
- AO指標のゼロレベル
- 終値
- MAの50期間
現在のAOがゼロレベルを上回り、終値が50期間MAを上回る場合、取引システムが以下の値をチャートにコメントとして返す必要があります。
- 買い
- 終値はn
- AO値はn
- MA値はn
もう1つのシナリオでは、現在のAO値がゼロレベルより低く、終値が50期間MAより低い場合、取引システムは以下の値でチャートにコメントを返す必要があります。
- 売り
- 終値はn
- AO値はn
- MA値はn
以下は、この取引システムを作成するためのステップバイステップの設計図です。
オーサムオシレーター取引システム
このトピックでは、条件した取引戦略のための取引システムを作成するため、この記事で最も興味深いことを学びます。まず、現在のAOの値をチャートにコメントとしてシグナルを発生させる簡単な取引システムを作成し、それに基づいて他の取引システムを構築していきます。
以下は、この希望するシグナルの取引システムを段階的に作成する方法です。
double型のfiArray配列を作成します。
double aoArray[];
aoArrayにAS_SERIESフラグを設定し、ArraySetAsSeries関数で真偽値をブール値として返すようにします。そのパラメータは次の通りです。
- array[]::aoArrayを使用
- flag:配列のインデックス方向としてtrueを使用
ArraySetAsSeries(aoArray,true);
Awesome Oscillator指標のハンドルを返すiAO関数を使ってAO指標を定義します。そのパラメータは次の通りです。
- symbol:現在の銘柄に適用(_Symbolを使用)
- period:現在の期間に適用(_Periodを使用)
int aoDef = iAO(_Symbol,_Period);
CopyBuffer関数を使って、AO指標のバッファからデータを取得します。そのパラメータは次の通りです。
- indicator_handle:定義済み指標ハンドル(aoDefを使用)
- buffer_num:指標バッファの番号(0を使用)
- start_pos:開始位置(0を使用)
- count:コピーする量(3を使用)
- buffer[]:コピー先配列(aoArrayを使用)
CopyBuffer(aoDef,0,0,3,aoArray);
aoVal用のdouble変数を作成し、NormalizeDoubleで正規化してからAO値を定義します。NormalizeDoubleのパラメータは以下の通りです。
- value:正規化された数値(aoArray[0]を使用)
- digits:小数点以下の桁数(7を使用)
double aoVal = NormalizeDouble(aoArray[0],7);
Comment関数を使って、現在のAO値をチャートにコメントとして生成します。
Comment("AO Value is ",aoVal);
この取引システムを作るための設計図は以下の通りです。
//+------------------------------------------------------------------+ //| Simple AO.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" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ void OnTick() { double aoArray[]; ArraySetAsSeries(aoArray,true); int aoDef = iAO(_Symbol,_Period); CopyBuffer(aoDef,0,0,3,aoArray); double aoVal = NormalizeDouble(aoArray[0],7); Comment("AO Value is ",aoVal); } //+------------------------------------------------------------------+
このコードをコンパイルして、エラーがないことを確認すると、ナビゲータウィンドウに次のようなエキスパートアドバイザー(EA)が表示されます。
このEAを目的のチャートにドラッグ&ドロップすると、次のようなウィンドウが表示されます。
[アルゴリズム取引を許可する]の横にチェックを入れて[OK]を押すと、この取引システムのEAが以下のようにチャートに追加されます。
前のチャートで分かるように、右上にEAが接続されています。目的のシグナルを受信する準備ができました。次のようなものになります。
先ほどのチャートでわかるように、左上にコメントとして現在のAOの希望するシグナルが表示されています。
この戦略に基づいて希望するシグナルを受信する取引システムを作成すると、完全なコードは以下になります。
//+------------------------------------------------------------------+ //| AO 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 aoArray[]; ArraySetAsSeries(aoArray,true); int aoDef = iAO(_Symbol,_Period); CopyBuffer(aoDef,0,0,3,aoArray); double aoVal = NormalizeDouble(aoArray[0],7); if(aoVal > 0) { Comment("Bullish","\n" "AO Value is ",aoVal); } if(aoVal < 0) { Comment("Bearish","\n" "AO Value is ",aoVal); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
この戦略の条件は次の通りです。
強気の場合
if(aoVal > 0) { Comment("Bullish","\n" "AO Value is ",aoVal); }
弱気の場合
if(aoVal < 0) { Comment("Bearish","\n" "AO Value is ",aoVal); }
このコードをコンパイルして、エラーがないことを確認したら、先程と同じようにチャートに接続して使用することができます。以下のように接続されます。
チャートで分かるように、右上にEAが接続されています。これで、目的のシグナルを受信する準備が整ったことになります。
強気シグナルの場合
先ほどのチャートで、左上に以下のような値のコメントがあるのがわかると思います。
- 強気
- AO現在値
弱気シグナルの場合
先ほどのチャートでわかるように、以下のような値を持つコメントがシグナルとして表示されています。
- 弱気
- AO現在値
この戦略に基づき、強気と弱気のケースで望ましいシグナルを得ることができました。
この取引システムの完全なコードは以下の通りです。
//+------------------------------------------------------------------+ //| AO 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 aoArray[]; ArraySetAsSeries(aoArray,true); int aoDef = iAO(_Symbol,_Period); CopyBuffer(aoDef,0,0,6,aoArray); double aoCurrVal = NormalizeDouble(aoArray[0],6); double aoFifthVal = NormalizeDouble(aoArray[1],6); double aoFourthVal = NormalizeDouble(aoArray[2],6); double aoThirdVal = NormalizeDouble(aoArray[3],6); double aoSecondVal = NormalizeDouble(aoArray[4],6); double aoFirstVal = NormalizeDouble(aoArray[5],6); double aoAvgVal = NormalizeDouble((aoFifthVal+aoFourthVal+aoThirdVal+aoSecondVal+aoFirstVal)/5,6); if(aoCurrVal > aoAvgVal) { Comment("AO Movement is strong","\n", "AO CurrVal : ",aoCurrVal,"\n", "AO FirstVal : ",aoFifthVal,"\n", "AO SecondVal : ",aoFourthVal,"\n", "AO ThirdVal : ",aoThirdVal,"\n", "AO FourthVal : ",aoSecondVal,"\n", "AO FifthVal : ",aoFirstVal,"\n", "AO AvgVal : ",aoAvgVal ); } if(aoCurrVal < aoAvgVal) { Comment("AO Movement is Weak","\n", "AO CurrVal : ",aoCurrVal,"\n", "AO FirstVal : ",aoFifthVal,"\n", "AO SecondVal : ",aoFourthVal,"\n", "AO ThirdVal : ",aoThirdVal,"\n", "AO FourthVal : ",aoSecondVal,"\n", "AO FifthVal : ",aoFirstVal,"\n", "AO AvgVal : ",aoAvgVal ); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
NormalizeDouble関数を使って、現在のAOの値から5つの値までさかのぼって以下のように定義します。
double aoCurrVal = NormalizeDouble(aoArray[0],6); double aoFifthVal = NormalizeDouble(aoArray[1],6); double aoFourthVal = NormalizeDouble(aoArray[2],6); double aoThirdVal = NormalizeDouble(aoArray[3],6); double aoSecondVal = NormalizeDouble(aoArray[4],6); double aoFirstVal = NormalizeDouble(aoArray[5],6);
AOの5期間平均を定義します。
double aoAvgVal = NormalizeDouble((aoFifthVal+aoFourthVal+aoThirdVal+aoSecondVal+aoFirstVal)/5,6);
この戦略の条件は次の通りです。
AOの動きが強い場合
if(aoCurrVal > aoAvgVal) { Comment("AO Movement is strong","\n", "AO CurrVal : ",aoCurrVal,"\n", "AO FirstVal : ",aoFifthVal,"\n", "AO SecondVal : ",aoFourthVal,"\n", "AO ThirdVal : ",aoThirdVal,"\n", "AO FourthVal : ",aoSecondVal,"\n", "AO FifthVal : ",aoFirstVal,"\n", "AO AvgVal : ",aoAvgVal ); }
AO運動が弱い場合
if(aoCurrVal < aoAvgVal) { Comment("AO Movement is Weak","\n", "AO CurrVal : ",aoCurrVal,"\n", "AO FirstVal : ",aoFifthVal,"\n", "AO SecondVal : ",aoFourthVal,"\n", "AO ThirdVal : ",aoThirdVal,"\n", "AO FourthVal : ",aoSecondVal,"\n", "AO FifthVal : ",aoFirstVal,"\n", "AO AvgVal : ",aoAvgVal ); }
コンパイル後、エラーがないことを確認し、EAを接続します。次と同じであることがわかります。
前のチャートで分かるように、右上にEAが接続されています。
強度の場合:
チャートの左上にあるように、次のような値のコメントがあることがわかります。
- AOの動きが強い
- AO CurrVal : n
- AO FirstVal : n
- AO SecondVal : n
- AO ThirdVal : n
- AOFourthVal:n
- AO FifthVal : n
- AO AvgVal : n
弱い場合
チャートの左上にあるように、次のような値のコメントがあることがわかります。
- AOの動きが弱い
- AO CurrVal : n
- AO FirstVal : n
- AO SecondVal : n
- AO ThirdVal : n
- AOFourthVal:n
- AO FifthVal : n
- AO AvgVal : n
さて、この戦略の取引システムに基づいて、希望するシグナルを得ることができました。
この取引システムを作るための設計図は以下の通りです。
//+------------------------------------------------------------------+ //| AO & 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 aoArray[]; double maArray[]; int Data=CopyRates(_Symbol,_Period,0,1,pArray); ArraySetAsSeries(aoArray,true); ArraySetAsSeries(maArray,true); int aoDef = iAO(_Symbol,_Period); int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE); CopyBuffer(aoDef,0,0,3,aoArray); CopyBuffer(maDef,0,0,3,maArray); double closingPrice = pArray[0].close; double aoVal = NormalizeDouble(aoArray[0],7); double maVal = NormalizeDouble(maArray[0],7); if(aoVal > 0 && closingPrice > maVal) { Comment("Buy","\n" "Closing Price is ",closingPrice,"\n", "AO Value is ",aoVal,"\n", "MA Value is ",maVal); } if(aoVal < 0 && closingPrice < maVal) { Comment("Sell","\n" "Closing Price is ",closingPrice,"\n", "AO Value is ",aoVal,"\n", "MA Value is ",maVal); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
pArray、aoArray、maArrayの3つの配列を作成します。pArray以外は先程と同じようにdoubleを使います。MqlRates関数で価格、出来高、スプレッドの情報を格納していきます。
MqlRates pArray[]; double aoArray[]; double maArray[];
aoArrayとmaArrayの配列にAS_SERIESフラグを設定するのは先程と同じです。MqlRates構造体の履歴データを取得するCopyRates関数を使用したデータの定義とそのパラメータは以下の通りです。
- symbol_name:現在の銘柄に適用(_Symbolを使用)
- timeframe:現在の期間に適用(_Periodを使用)
- start_pos:開始位置(0を使用)
- count:コピーするデータカウント(1を使用)
- rates_array[]: コピー先配列(pArrayを使用)
int Data=CopyRates(_Symbol,_Period,0,1,pArray); ArraySetAsSeries(aoArray,true); ArraySetAsSeries(maArray,true);
AO、MAの定義:
前述したようにAOはiOA関数によって定義します。
MAはiMA関数によって定義します。そのパラメータは以下の通りです。
- symbol:_Symbolを使用
- period:(_periodを使用
- ma_period:移動平均の期間(50を使用)
- ma_shift: 水平方向のシフト(0を使用))
- ma_method: 移動平均の種類(指数MAを使用)
- applied_price:価格の種類(終値を使用)
int aoDef = iAO(_Symbol,_Period); int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
CopyBuffer関数を使って、AO指標とMA指標のバッファからデータを取得します。
CopyBuffer(aoDef,0,0,3,aoArray); CopyBuffer(maDef,0,0,3,maArray);
終値、aoArray、maArrayを定義します。
double closingPrice = pArray[0].close; double aoVal = NormalizeDouble(aoArray[0],7); double maVal = NormalizeDouble(maArray[0],7);
戦略の条件
買いシグナルの場合
if(aoVal > 0 && closingPrice > maVal) { Comment("Buy","\n" "Closing Price is ",closingPrice,"\n", "AO Value is ",aoVal,"\n", "MA Value is ",maVal); }
売りシグナルの場合
if(aoVal < 0 && closingPrice < maVal) { Comment("Sell","\n" "Closing Price is ",closingPrice,"\n", "AO Value is ",aoVal,"\n", "MA Value is ",maVal); }
このコードをコンパイルして接続すると、以下のように接続されていることがわかります。
先ほどのチャートから、左上のチャートに指標が装着されているのがわかると思います。シグナルを受信する準備は整いました。
買いシグナルの場合
左上隅にコメントとしてシグナルがあり、次のような値になっていることがわかります。
- 買い
- 終値はn
- AO値はn
- MA値はn
売りの場合
この場合のコメントは、シグナルの次の値を持ちます。
- 売り
- 終値はn
- AO値はn
- MA値はn
結論
AOとは何か、何を測定するのか、どのように手動で計算するのか、MetaTrader 5の内蔵指標からどのようにチャートに挿入できるのかを学びました。オーサムオシレーター指標を詳しく理解出来たと思います。そして、それを理解した上で、その主旨に基づいた簡単な戦略によって、どのように使うことができるかを学びました。
- 戦略1:AO Zero Crossover - ゼロクロスオーバーに基づいて強気または弱気のシグナルを取得
- 戦略2:AO Strength - 現在のAO値の位置と過去5回のAO値の平均値から、AOの動きの強度のシグナルを取得
- 戦略3:AO & MA戦略 - 現在のAOとゼロレベル、終値と50期間EMAの位置関係から売買のシグナルを取得
その後、各戦略ごとにステップバイステップの設計図を作成し、アイデアを整理した上で、簡単かつスムーズに、そして効果的に取引システムを構築できるようにしました。そして、それぞれの戦略について、MetaTrader 5取引ターミナルで実行した後、自動化シグナルを得るための取引システムを作成しました。
読者が、自分で学んだことを適用しようとしたことを願っています。これは、スキルを向上させるために必要な学習プロセスにおいて非常に重要なステップであり、さらに、学習した内容や関連するトピックについてより多くの洞察を得ることができるからです。ここで再度確認しておきたいのは、すべての人に適した戦略は存在しないため、使用する前に必ずテストし、自分の取引に適しているかどうかを確認する必要があるということです。
この記事が読者の役に立つことを願っています。さらに同様の記事を読みたい方は、この連載の他の記事を読んで、最も人気のあるテクニカル指標に基づいて取引システムを設計する方法について学んでください。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/11468
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索