
平均足インジケーターに基づくトレーディングシステムの例
はじめに
20年以上前に、アメリカのろうそく足チャートの出現から、ブルベアの西洋市場への効果についての理解において革命がありました。ろうそく足は、人気なトレーディング手段であり、チャートの読み取りを容易にするため使用し始めました。しかし、ろうそく足の解釈は人によって異なります。
伝統的なろうそく足チャートやその認識を促すこれらのメソッドは、平均足技術と呼ばれています。
1. «なんですか?»*
最初のこのトピックについての記事は、2004年2月に発行された、«Technical Analysis of STOCKS & COMMODITIES(株と商品先物の技術的分析)»にて掲載され 、Dan Valcu が«Using The Heikin Ashi Technique(平均足技術の使用)»というタイトルにて掲載しました。 (原文へのリンク はこちら)
彼のWebサイトでは、筆者は2003年の夏の間、一目の技術を学び、いくつかの図表を突発的に発見し、そこに市場の明確なトレンドを見つけた、と述べられています。それは、平均足の図表、より詳しくいうと、ろうそく足を少し変化させたタイプの図表だったのです。
この分析のメソッドは、このメソッドを使用し成功した日本人トレーダーにより開発されました。筆者は驚き、書籍やインターネットにて関連した情報がなく、記事にて掲載し全てのトレーダーに使用可能にすることを決定しました。
平均足メソッドは( 平均は、「中立」や「バランス」を意味し、 足は「バー」や「足」を指します)トレンドや方向、強度を評価するビジュアルツールです。これはトレーディングの「ホリーグレイル(聖杯)」ではないが、トレンドの視覚化における使いやすいツールです。
OHLCろうそく足値の計算の実行方法を紹介します:
現在のバーのクローズ: haClose = (Open + High + Low + Close) / 4
現在のバーのオープン: haOpen = (haOpen [before.] + HaClose [before]) / 2
現在のバーの最大値: haHigh = Max (High, haOpen, haClose)
現在のバーの最小値: haLow = Min (Low, haOpen, haClose)
「オープン」、「クローズ」、「高」、「低」における値は、現在のバーを参照しています。接頭辞の「ha」は、平均足の一致する修正された値を指します。
市場の情報の認識を促すために、平均足の技術は、総合的ろうそく足と呼ばれる、通常のチャートの不規則性を除去し、トレンドやコンソリデーションのより良い理解を提供する総合的ろうそく足と呼ばれるものを作成することで伝統的なろうそく足チャートを修正しました。これを用いて作成されたろうそく足のチャートを見ると、市場の概観やスタイルを理解することができます。
図1左には、規則的なろうそく足チャート(a)、右には平均足チャート(b)があります。
図1 平均足と日本のろうそく足の違いを示します。これらのグラフの特徴は、上むきの傾向にて、しろのろうそく足の大半が影がありません。下向きのトレンドでは、黒のろうそくの大半に影が見受けられません。平均足チャートは、カーブを示していないので、新しいろうそくが以前の真ん中ほどのレベルにてオープンになります。
平均足チャートのろうそく足は、伝統的なろうそく足よりトレンドの傾向を大いに示します。トレンドが弱まってきたら、ろうそく足が小さくなり、影が大きくなります。ろうそく足の色の変化は売買のシグナルを意味します。これらのチャートを基に、正確な動きの終了を決定することが簡単にできます。
このインジケーターは、MetaTrader5の一部であり、Indicators \\ Examples \\ Heiken_Ashi.mq5のフォルダーにて保存できます。». チャートにインジケーターをインストールする前に、グラフの線を細くすることを推奨します。また、「Genral (一般)」タブのグラフの属性にて、「from the top graph (上のグラフから)」という項目のチェックを外してください。
注意をもう一度平均足メソッドが「ホリーグレイル(聖杯)」ではないと事実に向けたいと思います。これを証明するために、この技術のみを用いて、簡単なトレーディングシステム(TS)を作成しようと思います。
このために、MQL5プログラミング言語や標準ライブラリクラスを使用し、シンプルなエキスパートアドバイザーを作成する必要があります。それから、MetaTrader5ターミナルのストラテジーテスターを使用し、履歴データによりテストを行います。
2. トレーディングシステムのアルゴリズム
複雑にしすぎずに、Dan Valcuの以下のサイトhttp://www.educofin.com/ にて提案されている平均足の6つの基礎的なルールによりアルゴリズムを作成します。
- 上がりトレンド - 青色ろうそく足 haClose> haOpen
- 下がりトレンド - 赤色ろうそく足 aClose <haOpen
- 強い上がりトレンド - Low haOpen == haLow のない青色ろうそく足
- 強い下がりトレンド - High haOpen == haHighのない赤色ろうそく足
- コンソリデーション - 小さめのろうそく足と長い影の合わさったろうそく足
- トレンドの変化 - ちいさいろうそく足と反対色の長い影いつでも信頼できるシグナルではなく、時折ただのコンソリデーションの一部であることがあります。
(1,2)の傾向はたやすく理解されます - もし取引状態にあれば、1−2ポイント以前のろうそく足から上下させながらポジションを維持します。
強い傾向(3,4)では、同様に動き - ストップレベルを引き下げます。
コンソリデーション(5) とトレンドの変化(6)は(ストップにより終了されていなければ)ポジションを閉じますが、反対のポジションをオープンにすべきかを決める必要があります。決定をするために、コンソリデーションがその逆が起こっているのかを決めなければなりません。インジケーターやろうそく足分析、グラフィカル分析に基づくフィルターが必要です。
この記事の目的として、利益を生む戦略を確立することは含みません。誰が何を行えば結果に結び付くかなんて知っているでしょうか。従って、反対色のろうそくの出現を考え、ポジションを閉じ、逆方向の新いポジションを開きます。
そのアルゴリズムが以下になります:
- 反対色のろうそくの形成後は、もしあれば、以前のポジションを閉じます。そして、新しいろうそくにてポジションを開き、以前のろうそくの最小値/最大値の2ポイント下でストップを設定します。
- 以前のろうそくの最小値/最大値の2ポイント下でストップを設定します。<分節 3798>
- 強いトレンドであれば、ストップ値を動かすといった同様のステップを行います。
全体としてとてもシンプルであり、読者の皆様にとってわかりやすいことを願います。これをMQL5言語にて実行していきます。
3. MQL5のエキスパートアドバイザーのプログラミング
エキスパートアドバイザーを作成するために、入力パラメータのロットのサイズ、OnInit ()、 OnTick ()の二つのイベントハンドラ関数と、CheckForOpenClose ()関数のみを必要とします。
MQL5にて入力パラメータを設定するため、 入力 変数を利用します。
//--- input parameters input double Lot=0.1; // Port size
OnInit () 関数は、 Initのイベントハンドラです。Initイベントは、エキスパートアドバイザーをロード後すぐに生成されます。
この関数のコードにて、エキスパートアドバイザーにインジケーターを接続します。上述した通り、標準のMetaTrader5は、Heiken_Ashi.mq5インジケータを含みます。
インジケーターの計算の公式があるとなぜこれほど複雑さがますのかと考えれられているかもしれません。エキスパートアドバイザー内のコードにて値を計算できます。はい、可能ですが、それらの一つを注意してみてみましょう。
haOpen=(haOpen[prev.]+haClose[prev])/2
独立した計算に不便さを追加する以前の値を使用し、複雑化することがおわかりでしょう。従って、独立した計算の代わりに、 特にiCustom関数などのカスタムインジケーターの接続に関するMQL5の機能を除外しています。
このために、OnInit()関数に以下を追加します。
hHeiken_Ashi=iCustom(NULL,PERIOD_CURRENT,"Examples\\Heiken_Ashi");
そして、グローバル変数hHeiken_Ashiを取得します。これは、hHeiken_Ashi.mql5.indicatorのハンドラで、今後必要となってきます。
OnTick ()関数は、NewTick () イベントのハンドラであり、新しいティックの出現時に生成されます。
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- check the ability of trading and the calculated number of bars if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) if(BarsCalculated(hHeiken_Ashi)>100) { CheckForOpenClose(); } //--- }
TerminalInfoInteger (TERMINAL_TRADE_ALLOWED)関数はトレーディングが認可されたか否かをチェックします。 BarsCalculated (HHeiken_Ashi)の関数を使用し、Heiken_Ashi.mq5の場合に、要求されたインジケーターのために計算されたデータ量をチェックします。
そして、もし両方の状態が満たされれば、主な作業がなされるCheckForOpenClose ()関数が満たされることを確認できます。より詳しく見ていきましょう。
TSの条件が注文のインストールが新しいろうそく足のオープン時に起こることを明記しているため、新規ろうそく足がオープンか否かを決定する必要があります。これを実行する方法は様々にありますが、最もシンプルな方法は、ティックの量を見ることです。従って、もしティックの量が0に等しければ、これは、新規バーのオープンを指し、TSの条件をチェック後、注文を取り消してください。
以下の方法を実行してください:
//--- process the orders only after receiving the first tick of the new candlestick MqlRates rt[1]; if(CopyRates(_Symbol,_Period,0,1,rt)!=1) { Print("CopyRates of ",_Symbol," failed, no history"); return; } if(rt[0].tick_volume>1) return;
1要素を持ったMqlRates型の配列を作成してください。CopyRates ()関数を使用し、最後のバーの値をその配列に格納します。それから、ティックの量をチェックし、もし1以上であれば、関数を終了させ、もしそうでないのであれば、計算を続けてください。
次に、#defineを使用し、いくつかの記憶を助ける定数を宣言します:
//--- to check the conditions we need the last three bars #define BAR_COUNT 3 //--- the number of indicator buffer for storage Open #define HA_OPEN 0 //--- the number of the indicator buffer for storage High #define HA_HIGH 1 //--- the number of indicator buffer for storage Low #define HA_LOW 2 //--- the number of indicator buffer for storage Close #define HA_CLOSE 3
それから、配列を宣言します:
double haOpen[BAR_COUNT],haHigh[BAR_COUNT],haLow[BAR_COUNT],haClose[BAR_COUNT];
CopyBuffer ()関数を使用し、適切な配列にインジケーターの値を挿入します。
if(CopyBuffer(hHeiken_Ashi,HA_OPEN,0,BAR_COUNT,haOpen)!=BAR_COUNT || CopyBuffer(hHeiken_Ashi,HA_HIGH,0,BAR_COUNT,haHigh)!=BAR_COUNT || CopyBuffer(hHeiken_Ashi,HA_LOW,0,BAR_COUNT,haLow)!=BAR_COUNT || CopyBuffer(hHeiken_Ashi,HA_CLOSE,0,BAR_COUNT,haClose)!=BAR_COUNT) { Print("CopyBuffer from Heiken_Ashi failed, no data"); return; }
配列の変数にどのようにデータが保存されているかについて焦点を当てたいと思います。
(履歴状)「最も古い」バーは、配列の0要素に保存されています。
「最も新しい」(現在の)バーの後部、BAR_COUNT-1 (Fig. 2).
図2. ろうそく足の順序と、配列のインデックス値
OHLC平均足値を獲得したので、ポジションのオープンや維持におけるコンディションを確証できています。
売りシグナルの処理 について詳しく見ていきましょう。
以前指摘した通り、平均足のろうそく足3つの値を得ました。現在の値は、[BAR_COUNT-1 = 2]の数を持つセルに位置しており、必要ではありません。以前の値は、[BAR_COUNT-2 = 1],のセルにあり、バーは、[BAR_COUNT-3 = 0] (図2を参照)にあります。これらの二つのバーに基づき、トレードを行うの条件や状況をチェックします。
金融商品におけるオープンポジションのチェックをする必要があります。このためには、標準ライブラリのトレーディングクラスのCPositionInfoを使用します。このクラスは、オープンポジションについての情報を提供します。 Select (_Symbol)メセッドを使用し、金融商品におけるオープンポジションの存在を確認します。もしオープンポジションがあれば、 Type () メソッドを使用し、オープンポジションの種類を決定します。
もし現在買いのポジションがあれば、クローズする必要があります。
このために、標準クラスライブラリのCTrade クラスのメソッドを使用します、これはトレード処理を実行するよう設計されています。
PositionClose (const string symbol, ulong deviation)メソッドを使用し、シンボルが金融商品名であり、二番目のパラメーターが終了値から逸脱しているところにて、購入を終了します。
それから、TSに沿ってろうそく足の組み合わせをチェックします。(インデックスが[BAR_COUNT-2]の)、新しく形成されたろうそく足の方向はすでにチェックしているので、(インデックスが[BAR_COUNT-3])ろうそく足の前の足をチェックする必要があり、ポジションをオープンにする上で必要なステップを実行しなければなりません。
//--- check if there is an open position, and if there is, close it if(posinf.Select(_Symbol)) { if(posinf.Type()==POSITION_TYPE_BUY) { // lot=lot*2; trade.PositionClose(_Symbol,3); } } //--- check and set Stop Loss level double stop_loss=NormalizeDouble(haHigh[BAR_COUNT-2],_Digits)+_Point*2; double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point; if(stop_loss<stop_level) stop_loss=stop_level; //--- check the combination: the candle with the opposite color has formed if(haOpen[BAR_COUNT-3]<haClose[BAR_COUNT-3]) { if(!trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),stop_loss,0)) Print(trade.ResultRetcodeDescription()); } else if(posinf.Select(_Symbol)) { if(!trade.PositionModify(_Symbol,stop_loss,0)) Print(trade.ResultRetcodeDescription()); }
ここでは、CTrade クラスの3つのメソッドの使用に注意を向ける必要があります。
- PositionOpen (symbol, order_type, volume, price, sl, tp, comment)メソッドは、シンボルが金融商品名であり、order_typeは、注文種類, volumeはロットのサイズ、price - 購入価格、 sl - ストップ、 tp - 利益、 comment - コメントを指し、ポジションをオープンにするために使用されます。
- PositionModify (symbol, sl, tp) は、ストップや利益の値を変更するために使用され、symbol -金融商品名、 sl - ストップ、 tp - プロフィットを指します。このメソッドを使用する以前に、オープンポジションがあるかチェックする必要があるということに注意を向けたいと思います。
- ResultRetcodeDescription ()関数は、コードエラーの内容を取得するために使用されます。
stop_loss変数を計算する際に、haHigh [BAR_COUNT-2]の値は、インジケーターから取得された計算結果であり、正しく使用されるためにNormalizeDouble (haHigh [BAR_COUNT-2], _Digits)を使用し、標準化される必要があります。
これで、売りのシグナルの処理が完成です。
買いに関しては同じような原則を使用します。
こちらは、エキスパートアドバイザーの完成版のコードです。
//+------------------------------------------------------------------+ //| Heiken_Ashi_Expert.mq5 | //| Copyright VDV Soft | //| vdv_2001@mail.ru | //+------------------------------------------------------------------+ #property copyright "VDV Soft" #property link "vdv_2001@mail.ru" #property version "1.00" #include <Trade\AccountInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> //--- the list of global variables //--- input parameters input double Lot=0.1; // Lot size //--- indicator handles int hHeiken_Ashi; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- hHeiken_Ashi=iCustom(NULL,PERIOD_CURRENT,"Examples\\Heiken_Ashi"); //--- return(0); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- trading should be allowed and number of bars calculated>100 if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) if(BarsCalculated(hHeiken_Ashi)>100) { CheckForOpenClose(); } //--- } //+------------------------------------------------------------------+ //| Checking of the position opening conditions | //+------------------------------------------------------------------+ void CheckForOpenClose() { //--- process orders only when new bar is formed MqlRates rt[1]; if(CopyRates(_Symbol,_Period,0,1,rt)!=1) { Print("CopyRates of ",_Symbol," failed, no history"); return; } if(rt[0].tick_volume>1) return; //--- to check the conditions we need the last three bars #define BAR_COUNT 3 //--- number of the indicator buffer for storage Open #define HA_OPEN 0 //--- number of the indicator buffer for storage High #define HA_HIGH 1 //--- number of the indicator buffer for storage Low #define HA_LOW 2 //--- number of the indicator buffer for storage Close #define HA_CLOSE 3 double haOpen[BAR_COUNT],haHigh[BAR_COUNT],haLow[BAR_COUNT],haClose[BAR_COUNT]; if(CopyBuffer(hHeiken_Ashi,HA_OPEN,0,BAR_COUNT,haOpen)!=BAR_COUNT || CopyBuffer(hHeiken_Ashi,HA_HIGH,0,BAR_COUNT,haHigh)!=BAR_COUNT || CopyBuffer(hHeiken_Ashi,HA_LOW,0,BAR_COUNT,haLow)!=BAR_COUNT || CopyBuffer(hHeiken_Ashi,HA_CLOSE,0,BAR_COUNT,haClose)!=BAR_COUNT) { Print("CopyBuffer from Heiken_Ashi failed, no data"); return; } //---- check sell signals if(haOpen[BAR_COUNT-2]>haClose[BAR_COUNT-2])// bear candlestick { CPositionInfo posinf; CTrade trade; double lot=Lot; //--- check if there is an open position, and if there is, close it if(posinf.Select(_Symbol)) { if(posinf.Type()==POSITION_TYPE_BUY) { // lot=lot*2; trade.PositionClose(_Symbol,3); } } //--- check and set Stop Loss level double stop_loss=NormalizeDouble(haHigh[BAR_COUNT-2],_Digits)+_Point*2; double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point; if(stop_loss<stop_level) stop_loss=stop_level; //--- check the combination: the candle with the opposite color has formed if(haOpen[BAR_COUNT-3]<haClose[BAR_COUNT-3]) { if(!trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),stop_loss,0)) Print(trade.ResultRetcodeDescription()); } else if(posinf.Select(_Symbol)) { if(!trade.PositionModify(_Symbol,stop_loss,0)) Print(trade.ResultRetcodeDescription()); } } //---- check buy signals if(haOpen[BAR_COUNT-2]<haClose[BAR_COUNT-2]) // bull candle { CPositionInfo posinf; CTrade trade; double lot=Lot; //--- check if there is an open position, and if there is, close it if(posinf.Select(_Symbol)) { if(posinf.Type()==POSITION_TYPE_SELL) { // lot=lot*2; trade.PositionClose(_Symbol,3); } } //--- check and set Stop Loss level double stop_loss=NormalizeDouble(haLow[BAR_COUNT-2],_Digits)-_Point*2; double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_BID)-SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point; if(stop_loss>stop_level) stop_loss=stop_level; //--- check the combination: the candle with the opposite color has formed if(haOpen[BAR_COUNT-3]>haClose[BAR_COUNT-3]) { if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lot,SymbolInfoDouble(_Symbol,SYMBOL_ASK),stop_loss,0)) Print(trade.ResultRetcodeDescription()); } else if(posinf.Select(_Symbol)) { if(!trade.PositionModify(_Symbol,stop_loss,0)) Print(trade.ResultRetcodeDescription()); } } } //+------------------------------------------------------------------+
添付ファイルのHeiken_Ashi_Expert.mq5にてエキスパートアドバイザーの完成版テキストがあります。カタログへのコピー\\ MQL5 \\ メニューの"Tools >Editor MetaQuotes Language»を通してMetaEditorを起動するか、«F4»キーを使用してください。次に"Navigator"ウィンドウにて、«Experts»タブを開き、Heiken_Ashi_Expert.mq5をダブルクリックしダウンロードし、そのファイルをエディットウィンドウに挿入し、 «F7»を押しコンパイルしてください。
もしすべての処理が正しく実行されれば、「エキスパートアドバイザー」タブの「ナビゲーター」ウィンドウにて、Heiken_Ashi_Expertファイルが作成されます。Heiken_Ashi.mq5インジケーターは、同様にコンパイルされる必要があり、\\ MQL5 \\ Indicators \\ Examples \\のカタログに保存されます。
4. 履歴データによるトレーディングシステムのテスト
トレーディングシステムの実行可能性をチェックするために、プラットフォームの一部であるMetaTrader5ストラテジーテスターを使用します。テスターは、ターミナルメニューの「View Strategy Tester」から起動することができ、また、« Ctrl + R ».を合わせて押すことでも起動できます。開始されれば、「Settings」タブをを開きます。(図3)
図3. ストラテジーテスター設定
エキスパートアドバイザーを設定する- エキスパートadviserのリストから選択し、2000から2009の終わりまでの期間にて初期デポジットは、10,000USDであり、最適化は不可能である。(一つの入力パラメータしかなく、TSの実行可能性をチェックしたいだけであるからです。)
テストは、二つの通貨ペアを使用して行われます。EURUSDとGBPUSDの通貨ペアを選択し決定しました。
テストとして、以下のタイムインターバルを決定しました: H3, H6、H12の3つです。その理由について尋ねたいですか?答えは、MetaTrader4ターミナルにないインターバルにてTSをテストしたかったためというものです。
それでは続けましょう。テスト通貨のEURUSD、テスト期間のH3を選択し、「スタート」をクリックします。テストが完了すると、二つの新しいタブがテスターウィンドウに表示されます。「結果」(図4)と「グラフ」(図5)です。
図4. EURUSD H3におけるテストの結果
テストの結果(図4)から、2000から2009の終わりまでの期間において、与えられたパラメータにて、TSは -2560,60 USDの損失を生んでいます。
グラフ(図5)は、TSのパフォーマンスを再検討する機会となる利益と損失が分配されている状態を示し、システムのエラーの分析を行います。
図5. 「グラフ」 タブ (EURUSD H3)
「結果」タブは標準としてシンプルなレポートを作成するということを言及するのを忘れていました。さらに、取引や注文、記述されたレポートを見ることができます。
このためには、タブの上にカーソルを合わせ、右クリックをし、適切なメニューの項目を選択してください。
図6. 結果タブのストラテジーテスターにおけるコンテクストメニュー
こちらに(H6)6時間の期間設定のテスト結果があります。
図7. ストラテジーテスター結果タブ (EURUSD H6)
12時間以上の期間(H12)
図8. ストラテジーテスター結果タブ (EURUSD H12)
EURUSDのような通貨ペアにて、私たちの戦略は効果的ではないように思われます。しかし、作業期間のバリエーションが大いに結果に影響するということが言えると思います。
TSの効果についての最終的な判断を下すために、GBPUSDの通貨ペアへもテストを行いました。
図9. ストラテジーテスター 結果タブ (GBPUSD H3)
図10. ストラテジーテスター 結果タブ (GBPUSD H6)
図11. ストラテジーテスター 結果タブ(GBPUSD H12)
図12. ストラテジーテスターグラフタブ (GBPUSD H12)
テスト結果を分析したのち、GBPUSDを使用し、私たちのシステムは二つの個別なケースにおいてポジティブな結果を示しました。12時間以上の期間にて、8903,23 USDの利益を受け取った。ただ、9年かけて受け取られた利益です。
興味のある方は他の通貨にてテストしてください。ペアがより変動気味なら、より良い結果を得られただろう、そして、より長い期間が使用される必要だと想定します。.
結論
結論として、このトレーディングシステムは、「ホリーグレイル」ではなく、それ自体のみで使用されません。
しかしながら、もし追加のシグナル(ろうそく足分析、波動分析、インジケーター、トレンドなど)にて、コンソリデーションシグナルとリバーサルシグナルを分けるなら、より「おかしい」利益を生むことはないが、変動の高いトレーディング商品にて、実行可能です。
__________________________________
* 「なんですか」 - これは何? (日本語訳)
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/91





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