
アリゲーターによる取引システムの設計方法を学ぶ
はじめに
これは、最も人気のあるテクニカル指標に基づいて取引システムを設計する方法を学ぶための連載の新しい記事です。今回は、アリゲーター指標とは何か、どのように計測するのか、どのように計算するのか、どのように読み、どのように使うのかを学びながら、アリゲーター指標について詳しく学んでいきます。そして、この指標の主旨に基づき、いくつかの簡単な戦略に基づいて取引システムを作成します。この指標を次のトピックを通してカバーしていきます。
特にこの記事で学んだコードを自分で応用してプログラミングスキルを身につけるようにすることをお勧めします。これは、開発のこの目的を達成するための重要なステップです。この記事では、MetaTrader 5取引ターミナルに組み込まれているMQL5(MetaQuotes言語5)IDEを使用します。MetaTrader 5のダウンロード方法とMQL5の使用方法がわからない場合は、「MetaEditorでMQL5コードを書く」のトピックで詳細についてお読みください。
免責条項:すべての情報は「現状有姿」で提供され、情報提供のみを目的としており、取引目的やアドバイスを目的としたものではありません。いかなる結果も保証するものではありません。読者がこれらの資料を自分の取引口座で使用する場合、自己責任でおこなってください。
アリゲーターの定義
アリゲーターは、Bill Williamsが開発したトレンドフォロー型のテクニカル指標です。これは、トレンドが金融市場商品の期間のほとんどの時間ではなくわずか15%〜30%である一方、時間の約85%〜70%がレンジ(横ばい)に消費されるということに基づきます。つまり、トレンドは上昇トレンドか下降トレンドのどちらかですが、ほとんどの場合あるのはレンジ期間です。トレンドやその種類、そしてトレンドの見分け方についてもっと知りたいのであれば、私の前回の記事から「トレンドの定義」トピックを読むことが、この文脈で役に立ちます。これは、5、8、13の期間の数字のセットで3平滑化移動平均を使用して、計算でフィボナッチ数のいくつかを使用しています。アリゲーターは3本の平滑化された移動平均線から構成されていると言いましたが、その移動平均線は次の通りです。
- アリゲーターの顎
- アリゲーターの歯
- アリゲーターの唇
この指標は、以下の手順で手動で計算することができます。
アリゲーターの顎 = SMMA (Median price, 13, 8)
アリゲーターの歯 = SMA (Median price, 8, 5)
アリゲーターの唇 = SMMA (Median price, 5, 3)
Median Price = (High + Low)/2
ここで、
SMMA = 平滑移動平均
Median price = データの中央値
High = 最高値
Low = 最安値
アリゲーター指標は上記の手順で取得されますが、手動で計算する必要はありません。この指標はMetaTrader 5ターミナルの組み込み指標なので、次の用に利用可能なテクニカル指標から選択するだけです。
MetaTrader 5取引ターミナルを開き、[挿入] -> [インディケータ] -> [Bill Williams] -> [Alligator]を選択します。
その後、パラメータが以下のように表示されます。
1 - アリゲーターの顎の期間
2 - アリゲーターの顎の水平方向のずれ
3 - アリゲーターの歯の期間
4 - アリゲーターの歯の水平方向のずれ
5 - アリゲーターの唇の期間
6 - アリゲーターの唇の水平方向のずれ
7 - 平滑化法
8 - 使用可能な価格タイプ
次のウィンドウで、指標のスタイルを決定します。
1 - 顎線の色
2 - 顎線のタイプ
3 - 顎線の太さ
4 - 歯線の色
5 - 歯線のタイプ
6 - 歯線の太さ
7 - 唇線の色
8 - 唇線のタイプ
9 - 唇線の太さ
すべてのパラメータを決定し、[OK]を押すと、以下のようにチャートに指標が接続されます。
先ほどのチャートでわかるように、チャートに指標が挿入され、3本の線が表示されています。
1 - アリゲーターの唇
2 - アリゲーターの歯
3 - アリゲーターの顎
価格からこれらの線の位置を観察するだけで、指標を読み取ることができます。価格が唇、歯、顎の順に上回れば、トレンドは上と言えます。価格が唇、歯、顎の順に下回れば、トレンドは下降していると言えます。価格が3本の線の中を移動している場合は、横ばい状態であると言えます。
アリゲーター戦略
アリゲーター指標の取引での使用方法はたくさんあります。ここでは教育のためにこのトピックの主旨に基づいて使用できる簡単な戦略を挙げるので、実際の口座で使用する前に必ずテストして、利益が出るかどうかを確認してください。言及された戦略を最適化する必要があることがわかるかもしれません。自分の取引スタイルに有用であることができる最高の数式に到達するためにこれをおこなうのは正常です。
この戦略では、特定の条件に基づいて強気と弱気のシグナルを取得します。唇の値が歯の値と顎の値の2つの値を上回り、同時に歯の値が顎の値を上回れば、強気のシグナルとなります。もう1つの場合、唇の値が歯の値や顎の値を下回り、同時に歯の値が顎の値を下回れば、弱気のシグナルとなります。
唇 > 歯の値、唇 > 顎の値、歯 > 顎の値 -> 強気
唇 < 歯の値、唇 < 顎の値、歯 < 顎の値 -> 弱気
この戦略では、唇、歯、顎の値のクロスオーバーによって、売買のシグナルを取得します。唇の値が歯の値や顎の値を上回れば、買いシグナルとなります。また、唇の値が歯や顎の値を下回れば、売りシグナルとなります。
唇 > 歯の値、唇 > 顎の値 -> 買う
唇 < 歯の値、唇 < 顎の値 -> 売る
この戦略では、唇、歯、顎の間のクロスオーバー、その後、終値と歯の値の間のクロスオーバーに基づいて売買のシグナルを取得します。唇の線が歯と顎を下回って終値が歯の値を上回る場合、買いシグナルとなります。また、唇の線が歯や顎を上回って終値が歯の値を下回る場合、売りシグナルとなります。
唇 < 歯の値、唇 < 顎の値、終値 > 歯 -> 買う
唇 > 歯の値、唇 > 顎の値、終値 < 歯 -> 売る
アリゲーター戦略の設計図
次に、前のトピックで述べた戦略をもとに取引システムを作る必要があります。そのために、この取引システムを作るためのステップバイステップの設計図を設計します。
この戦略では、4つの値を連続的に確認することで、強気または弱気のダイバージェンスのシグナルを生成する取引システムを作ります。
- 唇の値
- 歯の値
- 顎の値
取引システムには、これらの数値の位置を判断し、それに基づいて適切なシグナルを生成することが必要です。唇の線が歯の線を上回り、唇の線が顎の線を上回り、歯の線が顎の線を上回る場合、取引システムは以下の値をチャートにコメントとして返します。
- 強気
- 顎の値 = n
- 歯の値 = n
- 唇の値 = n
一方、唇の線が歯の線を下回り、唇の線が顎の線を下回り、同時に歯の線が顎の線を下回る場合、取引システムは以下の値をチャートにコメントとして返します。
- 弱気
- 顎の値 = n
- 歯の値 = n
- 唇の値 = n
以下は、この取引システムを作成するためのステップバイステップの設計図です。
この戦略によれば、以下の値を継続的に確認し、それぞれのポジションを判断して売買のシグナルを発生させるような取引システムを作る必要があります。
- 唇の値
- 歯の値
- 顎の値
唇の線が歯の値を上回り、同時に唇の線が顎の値を上回る場合、取引システムは以下の値をチャートにコメントとして返します。
- 買い
- 顎の値 = n
- 歯の値 = n
- 唇の値 = n
一方、唇の線が歯の値を下回ると同時に唇の線が顎の線を下回る場合、取引システムは以下の値でシグナルとしてチャートにコメントを返します。
- 売り
- 顎の値 = n
- 歯の値 = n
- 唇の値 = n
以下は、この取引システムを作成するためのステップバイステップの設計図です。
この戦略によれば、以下の値を確認してそれぞれのポジションを決定し、売買シグナルを生成する取引システムを作る必要があります。
- 唇の値
- 歯の値
- 顎の値
- 終値
唇の値が歯の値を下回り、唇の線が顎の線を下回り、終値が歯の値を上回った場合、取引システムは以下の値でシグナルとしてチャートにコメントを返します。
- 買い
- 唇の値 = n
- 歯の値 = n
- 終値 = n
- 顎の値 = n
唇の線が歯の線を上回り、唇の線が顎の線を下回り、終値が歯の値を下回る場合、取引システムは以下の値でシグナルとしてチャートにコメントを返します。
- 売り
- 唇の値 = n
- 歯の値 = n
- 終値 = n
- 顎の値 = n
以下は、この取引システムを作成するためのステップバイステップの設計図です。
アリゲーター取引システム
次に、MetaTrader 5ターミナルで実行される各戦略について、希望するシグナルを自動的に生成するための取引システムを作成します。まず、取引システムで使用するアリゲーターコンポーネントの値のシグナルを生成するための基盤となる取引システムを作成します。このようなシステムを作るには、次のような手順があります。
アリゲーターの構成要素(Lips、Teeth、Jaws)を1つずつ配列にします。
double jawsArray[]; double teethArray[]; double lipsArray[];
これらの配列のデータをArraySetAsSeries関数で並び替えます。そのパラメータは次の通りです。
- array[]
- flag
ArraySetAsSeries(jawsArray,true); ArraySetAsSeries(teethArray,true); ArraySetAsSeries(lipsArray,true);
iAlligatorによってアリゲーターを定義します。そのパラメータは次の通りです。
- symbol:現在の銘柄に適用される_Symbolを使用
- period:現在の期間または時間枠に適用される_Periodを使用
- jaw_period:顎の計算期間(13を使用)
- ma_shift:水平方向のシフト(8を使用)
- teeth_period:歯の計算期間(8を使用)
- teeth_shift:歯の水平方向のずれ(5を使用)
- lips_period:唇の計算期間(5を使用)
- lips_shift:唇の水平方向のずれ(3を使用)
- ma_method:移動平均の種類(MODE_SMAを使用)
- applied_price:価格の種類(PRICE_MEDIANを使用)
int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
CopyBuffer関数を使用してデータを定義して結果を保存します。そのパラメータは次の通りです。
- indicator_handle:指標ハンドル(alligatorDefを使用))
- buffer_num: 指標バッファ番号(0は顎、1は歯、2は唇)
- start_pos:開始位置(0を使用)
- count:コピーする量(3を使用)
- buffer[]: コピー先の配列(jawsArray、teethArray、 lipsArrayを使用)
CopyBuffer(alligatorDef,0,0,3,jawsArray); CopyBuffer(alligatorDef,1,0,3,teethArray); CopyBuffer(alligatorDef,2,0,3,lipsArray);
3つのコンポーネントの値を取得します。
double jawsValue=NormalizeDouble(jawsArray[0],5); double teethValue=NormalizeDouble(teethArray[0],5); double lipsValue=NormalizeDouble(lipsArray[0],5);
指標の3つの要素でコメントします。
Comment("jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue);
この取引システムを作るための設計図は以下の通りです。
//+------------------------------------------------------------------+ //| Simple Alligator 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() { //creating price array double jawsArray[]; double teethArray[]; double lipsArray[]; //Sorting data ArraySetAsSeries(jawsArray,true); ArraySetAsSeries(teethArray,true); ArraySetAsSeries(lipsArray,true); //define Alligator int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); //define data and store result CopyBuffer(alligatorDef,0,0,3,jawsArray); CopyBuffer(alligatorDef,1,0,3,teethArray); CopyBuffer(alligatorDef,2,0,3,lipsArray); //get value of current data double jawsValue=NormalizeDouble(jawsArray[0],5); double teethValue=NormalizeDouble(teethArray[0],5); double lipsValue=NormalizeDouble(lipsArray[0],5); //comment on the chart Comment("jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); } //+------------------------------------------------------------------+
このコードをコンパイルすると、ナビゲータでExpert Advisorsフォルダの中に以下のように表示されます。
これを目的のチャートにドラッグ&ドロップすると、次のようなウィンドウが表示されます。
[アルゴリズム取引を許可する]にチェックを入れて[OK]を押すと、次のようにチャートにEAが接続されます。
前のチャートで分かるように、右上にEAが接続されています。これで、シグナルを受信する準備が整いました。以下は、テストによって生成されたシグナルの例です。
先のチャートの左上にあるように、次のような値を持つシグナルがあることがわかります。
顎の値 = n
歯の値 = n
唇の値 = n
この戦略に基づく取引システムを作成するための完全なコードは、次のようになります。
//+------------------------------------------------------------------+ //| Alligator Trend Identifier.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() { //creating three arrays of Alligator components double jawsArray[]; double teethArray[]; double lipsArray[]; //Sorting data ArraySetAsSeries(jawsArray,true); ArraySetAsSeries(teethArray,true); ArraySetAsSeries(lipsArray,true); //define Alligator int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); //define data and store result CopyBuffer(alligatorDef,0,0,13,jawsArray); CopyBuffer(alligatorDef,1,0,13,teethArray); CopyBuffer(alligatorDef,2,0,13,lipsArray); //get value of current data double jawsValue=NormalizeDouble(jawsArray[0],5); double teethValue=NormalizeDouble(teethArray[0],5); double lipsValue=NormalizeDouble(lipsArray[0],5); //conditions of strategy if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue) { Comment("Bullish","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); } if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue) { Comment("Bearish","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
戦略の条件(強気の場合):
if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue) { Comment("Bullish","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); }
弱気の場合
if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue) { Comment("Bearish","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); }
このコードをコンパイルし、作成したエキスパートアドバイザー(EA)を学んだように実行すると、このEAが以下のようにチャートに添付されていることがわかります。
先ほどのチャートでわかるように、EAは右上のチャートに取り付けられており、この戦略に基づいた強気・弱気のシグナルを得る準備が整っています。これらのシグナルの例を以下に示します。
強気の場合:
先ほどのチャートでわかるように、右上にシグナルとしてコメントがあり、その値は以下の通りです。
- 強気
- 顎の値 = n
- 歯の値 = n
- 唇の値 = n
弱気の場合
先のチャートでわかるように、右上に弱気のシグナルとしてコメントがあり、その値は以下の通りです。
- 弱気
- 顎の値 = n
- 歯の値 = n
- 唇の値 = n
3本の線が価格の上で動いているので、弱気のシグナルになります。
次のコードは、この戦略に基づいた取引システムを作成するためのものです。
//+------------------------------------------------------------------+ //| Alligator Signals 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() { //creating three arrays of Alligator components double jawsArray[]; double teethArray[]; double lipsArray[]; //Sorting data ArraySetAsSeries(jawsArray,true); ArraySetAsSeries(teethArray,true); ArraySetAsSeries(lipsArray,true); //define Alligator int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); //define data and store result CopyBuffer(alligatorDef,0,0,13,jawsArray); CopyBuffer(alligatorDef,1,0,13,teethArray); CopyBuffer(alligatorDef,2,0,13,lipsArray); //get value of current data double jawsValue=NormalizeDouble(jawsArray[0],5); double teethValue=NormalizeDouble(teethArray[0],5); double lipsValue=NormalizeDouble(lipsArray[0],5); //conditions of strategy if(lipsValue>teethValue && lipsValue>jawsValue) { Comment("Buy","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); } if(lipsValue<teethValue && lipsValue<jawsValue) { Comment("Sell","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
この戦略の条件は次の通りです。
買いシグナルの場合
if(lipsValue>teethValue && lipsValue>jawsValue) { Comment("Buy","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); }
売りシグナルの場合
if(lipsValue<teethValue && lipsValue<jawsValue) { Comment("Sell","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "lipsValue = ",lipsValue); }
このコードをコンパイルして取引ターミナルで実行すると、次のようにチャートに接続されていることがわかります。
先ほどのチャートの右上にEAが接続され、この戦略に基づいて売買シグナルを受信する準備が整ったことを確認します。
買いシグナルの場合
次のような値で目的のシグナルが得られていることがわかります。
- 買い
- 顎の値 = n
- 歯の値 = n
- 唇の値 = n
売りシグナルの場合
次のような値で目的のシグナルが得られます。
- 売り
- 顎の値 = n
- 歯の値 = n
- 唇の値 = n
3本の線が価格より上に移動しているので、売りシグナルになります。
以下は、この戦略の取引システムを作成するための完全なコードです。
//+------------------------------------------------------------------+ //| Alligator Signals System Enhancement.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() { //creating three arrays of Alligator components double jawsArray[]; double teethArray[]; double lipsArray[]; MqlRates pArray[]; //Sorting data ArraySetAsSeries(jawsArray,true); ArraySetAsSeries(teethArray,true); ArraySetAsSeries(lipsArray,true); int Data=CopyRates(_Symbol,_Period,0,1,pArray); //define Alligator int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); //define data and store result CopyBuffer(alligatorDef,0,0,13,jawsArray); CopyBuffer(alligatorDef,1,0,13,teethArray); CopyBuffer(alligatorDef,2,0,13,lipsArray); //get value of current data double jawsValue=NormalizeDouble(jawsArray[0],5); double teethValue=NormalizeDouble(teethArray[0],5); double lipsValue=NormalizeDouble(lipsArray[0],5); //conditions of strategy if(lipsValue<teethValue && lipsValue<jawsValue && pArray[0].close>teethValue) { Comment("Buy","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "closingPrice = ",pArray[0].close,"\n", "lipsValue = ",lipsValue); } if(lipsValue>teethValue && lipsValue>jawsValue && pArray[0].close<teethValue) { Comment("Sell","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "closingPrice = ",pArray[0].close,"\n", "lipsValue = ",lipsValue); } } //+------------------------------------------------------------------+
このコードの相違点は次の通りです。
MqlRates関数で価格用の配列をもう1つ作成し、価格、数量、スプレッドの情報を格納します。
MqlRates pArray[];
MqlRatesの履歴データをCopyRatesを使って取得します。そのパラメータは次の通りです。
- symbol:銘柄名(_Symbolを使用)
- timeframe:期間(_periodを使用)
- start_pos:開始位置(0を使用)
- count:コピーするデータカウント(1を使用)
- rates_array[]: コピー先配列(pArrayを使用)
int Data=CopyRates(_Symbol,_Period,0,1,pArray);
戦略の条件
買いシグナルの場合
if(lipsValue<teethValue && lipsValue<jawsValue && pArray[0].close>teethValue) { Comment("Buy","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "closingPrice = ",pArray[0].close,"\n", "lipsValue = ",lipsValue); }
売りシグナルの場合
if(lipsValue>teethValue && lipsValue>jawsValue && pArray[0].close<teethValue) { Comment("Sell","\n", "jawsValue = ",jawsValue,"\n", "teethValue = ",teethValue,"\n", "closingPrice = ",pArray[0].close,"\n", "lipsValue = ",lipsValue); }
このコードをコンパイルしてEAを実行すると、以下のようにチャートに貼り付けられ、売買シグナルが表示されることがわかります。
右上にEAが表示され、希望するシグナルを受信することができます(以下はテスト時の例です)。
買いシグナルの場合
左上のコメントには、以下の値を入れています。
- 買い
- 顎の値 = n
- 歯の値 = n
- 終値 = n
- 唇の値 = n
売りシグナルの場合
左上にシグナルとしてコメントを入れています。
- 売り
- 顎の値 = n
- 歯の値 = n
- 終値 = n
- 唇の値 = n
3本の線が価格を下回っていることから、終値がアリゲーターの歯の線の下に閉じていることがわかります。
結論
今回は、売買シグナルだけでなく、トレンドの確認にも使えるテクニカル指標「アリゲーター」について詳しく学びました。手動で計算する方法と、簡単な戦略に基づいた使い方を学びました。
- Alligator Trend Identifier:アリゲーターの三本線(Lips、Teeth、Jaws)の位置から強気・弱気のシグナルを生成
- Alligator Signals System:指標の3本の線の間のクロスオーバーに基づいて、古典的な方法のクロスオーバーによって売買シグナルを生成
- Alligator Signals System Enhancement:別の方法で売買シグナルを生成し、指標の3本の線の位置と終値と歯の間のクロスオーバーに基づいてこれらのシグナルを早期に生成
言及した戦略ごとにステップバイステップの設計図を作成し、取引システムをスムーズかつ簡単に、そして効果的に作成するためのアイデアを整理しました。また、MetaTrader 5の取引ターミナルで使用される各戦略の取引システムを作成し、設計しコード化した内容に従って自動的にシグナルを生成します。ここでもう一度確認する必要がるのは、これらが自分のために有用で有益であることを確認するために、実際の口座でそれを使用する前に、言及されたすべての戦略をテストする必要があるということです。
コーディングスキルを向上させてこの記事を読むことから完全な利益を得るよう助言したように、読者が、自分で学んだことを適用しようとしたことを願っています。この記事が読者の取引のために有用であり、この記事、あるいは任意の関連トピックの話題に有用な洞察を得たことを願っています。ストキャスティクス、RSI、ボリンジャーバンド、移動平均、エンベロープ、MACD、ADXなどの最も人気のあるテクニカル指標と、それらに基づいた取引システムの作り方を紹介しましたので、同様の記事をもっと読みたい方は、本連載の過去の記事をお読みください。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/11549





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