
初心者向け MQL4 言語はじめに
はじめに
この記事シリーズは、プログラミングのことは何も知らないが、最短の時間、最小の労力でできるだけ速く MQL4 言語を学びたいという願いを持つトレーダーを対象としています。みなさんが『オブジェクト指向』、『三次元配列』などのフレーズに恐れをいだいているなら、本稿はそんな人が必要とするものです。レッスンは最大に迅速な結果を出すために作成されています。そのうえ、情報は理解しやすいように提供されています。理論を深く掘り下げすぎることはしませんが、初回レッスンですでに実用的な効用を得ることでしょう。
アドバイス
これまでプログラミングをしたことが一度もない場合、最初一度読んだところでは、一部のケースの意味を理解するのが困難であると思われるかもしれません。テキストを再度ゆっくりと読み直し、一文ずつに思いを巡らせてください。最後にはすべてを理解しているものです。なぜならむつかしいことは何もないのですから。前の情報を理解しないまま先に進むことはしないでください。コード例の学習すでに理解していることを基にして自分のコード例を書いてみます。
MQL4 の最初の知識
まず、この言語を使って一体何ができるのか見てみます。それはスクリプト、カスタムインディケータ、エキスパート アドバイザー、ライブラリを書くためのものです。
- スクリプトとは一連のコマンドで、依頼に応じて一度だけプログラムを実行するものです。トレードで毎日行う処理を代行してくれます。たとえば、インデントを開くときです。スクリプトは特定の関数も操作します。たとえばチャート分析、統計的情報作成です。
- カスタムインディケータはテクニカルインディケータで、内蔵インディケータに追加して書かれるものです。チャートやその他視覚情報を作成します。スクリプトとは異なり、カスタムインディケータは価格変化するたびに、すなわちティック毎に動作します。インディケータが表示するものを決定するのは、みなさん自身だけです。使い物にならない空のチャートである可能性もあれば、市場の状況においてみなさんを正しい方向に導くのに役立つものともなります。たとえば、市場が経験しているトレンドがどんな状況なのか、それがいつなのか正確にわかっていれば、それをインディケータとして書くことができます。
- エキスパート アドバイザーは機械的なトレーディングシステムで、あらゆる金融商品に対応します。カスタムインディケータのように、エキスパート アドバイザーはティック毎に動作しますが、インディケータと異なるのは、市場の状況に関して情報を伝えたり(たとえば、売りや買いの特定のアドバイスを与えます)、みなさんの助けなしに自分で取引を行います。ターミナルは戦略が検証を行うのを支援します。それはみなさんのエキスパートアドバイザーの収益性を迅速に評価できるようにするものです。みなさんがご自身の戦略を MQL4 言語で記述すると、ターミナルがすべての指令に冷静に従います。
- ライブラリは特定タスクを行うための関数セットです。たとえば、アドバイザーの1つは、いつ売り、いつ買うか判断をするのに特殊な数学関数を使用します。
本項では、一般的なスクリプトを書く方法を学習します。このために、特別なプログラム- MetaEditor 4、が使用されます。開いたカスタムターミナルで F4 キーを押し、このプログラムを起動します。新規スクリプトを作成するには、MetaEditor 4 のメニューでボタン「 File → New」とクリックするか、Ctrl+N ボタンを使用します。
表示されるウィンドウで、作成しようとしているものを選択します。「Script 」を選択し、「 Next」をクリックします。
次のウィンドウでNameフィールドにスクリプト名を記入します。Author フィールドにご自分の名前を、LinkフィールドにEメールアドレスまたはウェブアドレスを追加します。そしてOK をクリックします。
その後、新しいウィンドウが表示されます。そこで作業をほとんど行うことになります。そこには元のテキストが表示されます。
実行されない空のスクリプトにもコードがあることに留意ください。これでプログラミング開始準備完了です。ただ、残念ながらみなさんにはどうやればいいのかわかっていませんね。その状態をなんとかしていきましょう。
ソースコード、コンパイル、その他
ひとつ重要な事柄を理解する必要があります。MetaEditor で書かれるのはソースコードです。すなわち、ターミナルが上から下へ一つずつ従う一連の命令です。ただし、ターミナルはソースコードに従うことはできません。ソースコードはみなさんにとって理解できるもので、MetaTraderにとってではないのです。ソースコードがターミナルにとって理解できるものとするには、適切な『言語』に『翻訳する』必要があります。これには MetaEditor のF5 キーを押します。その後、ソースコードは実行ファイルにコンパイルされます。 コンパイルとは、みなさんによって書かれみなさんが理解できるソースコードを、MetaTrader が理解し処理できる特殊ファイルに『翻訳する』手続きです。それはご自身で確認してください。『Test1』という名前で新規スクリプトを作成、保存しますが、コンパイルはしません。『ナビゲータ』を使用してターミナルを開き、『Scripts』フォルダに入ります。そこには『Test1』というスクリプトがないのがわかります。」
ここでこのスクリプトをコンパイルします(F5 キーで)。
再びターミナルに入ります。そこには『Test1』という名前のスクリプトが存在します。
ターミナルの「ナビゲータ」でスクリプト名をダブルクリックするとそれが開きます。ですが、何も起こりません。というのもスクリプトが空だからです。
スクリプト書き込み手順がどんなものか、すでにお分かりのことでしょう。それは、ソースコードを書き、それをコンパイルし、ターミナルでスクリプトを開き、結果を見、指定コードを変更し、コンパイルして結果を見る、等々で必要な結果を得るまでこの繰り返しです。
スクリプトはどこに書くのか?
すでにごらんのとおり、空のスクリプトには特定のコードがあります。しかし動作するソースコードはどこに書き込めばよいのでしょうか?画像にあるように行 int start(){ andreturn(0);}の間に書き込むのです。
私がみなさんに提供するものはなにもかもここに書きます。そうすればすべて動作します。のちに、こういった行が何を意味するか詳しく検討します。
変数
変数とは?ご自分でこの問に答えてみてください。そうすることは役に立ちます。あなたはおいくつですか?5年後、あなたはいくつになっていますか?いいですか。あなたの年齢が変数なのです。年齢は、その他の変数同様、時間の経過とともに変化します。すなわち、変数の第1の特徴は時間の経過とともに変化することです。別の例です。5歳のときのあなたの身長はいくらでしたか?おそらく今よりずっと低かったでしょう。身長も変数の別の例です。ただし一つ重要な違いがあります。年齢は整数で計算されることに注意が必要です。身長は少数(『浮動小数点数」)で測定する方が適しています。年齢:20歳、30歳。身長:1.8メートル、1.95メートル。これはひじょうに重要な特徴です。変数にはそれぞれ一定のタイプがあるのです。その他どのような変数タイプがあるのか確認します。数字では数多くのパラメータを記述しますが、テキストはどのように記述するのでしょうか?テキストには特殊な文字列タイプが使用されます。そのような変数タイプには行しかありません。では MQL4 言語で変数を作成し記述する方法を見ていきます。例:
int age = 25;
ここでは整数タイプの変数(int - integer)が見られます。Int は言語のキーワードで、それはすべての番号タイプを使うことを示します。そうして『年齢』を書きました。それは変数名、すなわちそれを使用してこの変数に格納されている意味を知ることができる言葉です。その後、記号“=”を使って変数に値 25 を割り当てました。各指示の後には“;”を入れます。すべての変数の宣言と初期化は、以下の形式の変数になることに注意します。
[ 変数タイプ] [ 変数名] = [ 変数 値];
ところで、変数に値を割り当てる(初期化する)必要はありません。それはそのように書けばよいのです。
int age;
もう一例です。
double height = 1.95;
ここで、double タイプ(浮動小数点数、小数)の値を格納し、演算子“=” によって値 1.95 を割り当てる『身長』という変数を宣言しています。
文字列変数を確認します。
string name = "Janet";
string は変数タイプで、name は変数名、“Janet”は変数値です。文字列タイプの値はダブルクオーテーションマーク(“)の間に置かれることに注意します。
もうひとつひじょうに便利な変数タイプがあります。 bool タイプです。このタイプの変数は値を2つだけ受け取ります。それは真または偽です。例:
bool trend = false;
ここで簡単な事を覚えてください。MQL4 言語は大文字小文字を区別します。すなわちコードを「大文字」で書くか「小文字」でかくかはひじょうに重要なのです。たとえば、複数の変数を同じ名前で大文字小文字を変えて宣言する場合、完全に異なる変数となります。
double HIGHTPRICE; double hightprice; double HightPrice; double hightPrice;
上のコードはまったく異なる4つの変数を作成することになるのです。また、MQL4 言語のキーワードはすべて小文字で書かれることにも注意が必要です。
次の例:
DOUBLE hightPrice1; Double hightPrice2;
上述のコードは動作しません。というのも、『ダブル』という語が MQL4 言語のキーワードとして受けつけられないからです。もうひとつ重要なことは、変数名は数字や特殊記号(*,&,,%,$)で始めることはできない、ということです。例:
double 1price; double %price;
あと一つ、言語エレメントにはコメントがあります。行の前に“//”と書けば、それは全体がコメントです。ということは、コンパイル中その部分は無視されます。例:
// this is a comment
これで、空のスクリプトコードに数多く情報を含む文字のコメントがあることがわかります。コードにコメントを付けます。それで時間の節約につながることもあります。
変数を使用した作業
ここから変数を宣言したあとそれをどうするのか確認します。簡単な例を見ます。
double a = 50.0;// declare a value with a floating point and // assign the value 50 to it double b = 2.0; double c; c = a + b; // assign to the variable c sum of variables // a and b. Now the value is equal to 52. Like after // any other instruction put a semicolon (“;”) c = a - b; // diminution, c = 48 c = a*b; // multiplication, c = 100 c = a / b; // division, c = 25 c = (a + b)*a; // place the operations that should be performed // first inside the brackets. In our cas。 // first we get the sum of a and b // after that this sum will be multiplied by a and assigned to c c = (a + b) / (a - b); // if there are several operations in brackets, // they will be performed c = a + b*3.0; // according to mathematic rules first you will get // multiplication b and 3, and then the sum
変数で処理をおこない、結果をそこに割り当てる必要がある場合、たとえば5を追加するなら、次のどれか一つの方法で行います。
int a = 5; a = a + 5; // add 5 a += 5; // analogous a = a*5; a *= 5; // multiply a by 5 and assign to it a /= 5; // divide and assign
足したり引いたりしたければ、以下の方法を使います。
int a = 5; a++; // add1, it is called increment а--; // subtract 1, it is decrement
それですべてOKですが、そのようはスクリプト処理を行うと、すべてうまくいっているだろうと推測することしかできません。なぜなら画面上には何も表示されないからです。
結果を表示するのが便利な理由はそこにあります。このために、統合関数 MessageBox() があるのです。
MessageBox()
関数とは命令セットで、それがパラメータを受け取り、そのパラメータに応じて結果を表示するものです。われわれの場合、関数 MessageBox() はパラメータを2ツ受け取ります。1番目はメッセージテキスト、2番目はタイトルテキストです。以下がその例です。
MessageBox("Hello, World! There is some text.","caption");
関数を実行するには、まずその名前を書きます。大文字小文字のことを忘れないでください!そして括弧を開き、コンマを使ってパラメータを書き込みます。われわれの場合、パラメータは文字列タイプです。記憶しているとおり、行はすべてクオーテーションマーク(“)の間に書きます。すべての指示同様、最後にはセミコロンを入れます。正しく理解するために画像で確認します。以下はコードおよび結果がどのようになるかを示しています。
もちろん、すべてOKです。ただ、別のタイプの変数はどのように表示することができるのでしょうか?簡単に覚えておきます。
int a = 50; int b = 100; MessageBox("It is very simple. a+b=" + (a + b), "a+b=?")
以下が取得する結果です。
すでにご推察どおり、MQL4 は、ある行に別の数字タイプを追加しようとする場合、それを行内で自動的に数字に変換し、コンバインするようにできています。ひじょうにすぐれた特性ですね!文字列変数でもそのような処理が可能です。
int a = 50; int b = 100; string str1 = "a + b ="; str1 += a + b; // now str1 = "a + b = 150" // now use the variable str1 as // a first parameter MessageBox(str1, "a + b = ?");
これで MessageBox() 関数によって異なるデータを引き出す方法がわかりました。しかし簡単な数学演算結果を表示する意図は何なのでしょうか?われわれが必要としているのは MQL4 が単純に加算や乗算結果を求めることではありませんよね?
配列
怖がらないでください。とても簡単ですから。さて、5つの価格を記憶したいと仮定します。なにをすべきでしょうか?以下がその方法です。
double price1 = 1.2341; double price2 = 1.2321; double price3 = 1.2361; double price4 = 1.2411; double price5 = 1.2301;
変数を5個取得します。それはデータタイプが1つで、パラメータである価格を1つ記述するものです。別の方法もあります。配列を使うのです。配列とは、変数のセットで、インデックスは異なりますが、同じ名前を持つものです。以下が5つの要素から配列を1つ宣言する方法です。
double price[5];
共通形式:
(配列タイプ)(配列名)[エレメント数];
われわれの場合、以下です。:配列タイプ-double、名前-価格、エレメント数-5。配列エレメントを参照する方法を確認します。
double price[5]; // declare an array of 5 elements price[0] = 1.2341; // refer to the first element of the array and // assign a price to it. Note // that the index of the first element starts with 0 // It is an important feature, // you should get used to it. price[1] = 1.2321; // refer to the second element price[2] = 1.2361; // and so on price[3] = 1.2411; price[4] = 1.2301;
どのような処理も、一般変数同様、配列エレメントによって行うことが可能です。実質上、配列のエレメントは一般変数なのです。
double price[2]; price[0] = 1.2234; price[1] = 1.2421; MessageBox("Middle price is " + (price[0] + price[1]) / 2.0,"middle price");
配列を宣言するとき、全エレメントに初期値を割り当てます。
double price[2] = {1.2234, 1.2421};
エレメントの初期値は括弧内にコンマで区切って列挙するだけです。そのような場合、自分で書く代わりに編集機能に自動でエレメント数を入れされます。
double price[] = {1.2234, 1.2421};
確かにすべてOKですが、残念ながらそれは使い物になりません。なんらかの形で実データを取得する必要があるのです。たとえば、現行価格、時刻、自由資金額、などです。
統合配列または内蔵配列と変数
もちろん実データなしではできません。実データにアクセスするには対応する組み込み配列を参照するだけです。そのようは配列は複数あります。たとえば以下です。
High[0]; // refer to the last maximal price, // that the bar has achieved in the current timeframe // and current currency pair. Currency pair and // the timeframe depend on the chart, on which you // have started a script. It is very important to remember! Low[0]; // minimal price of the last bar // in the current chart. Volume[0]; // value of the last bar in the current chart.
組み込み配列やインデックスを正しく理解するために、以下を見ます。
最後のバーインデックス(番号)が 0、最後から2番目が 1、などとなっているのがわかります。
組み込み一般変数もあります。たとえば、Bars は現行チャート内のバー番号を示します。それは一般変数ですが、みなさんが変数宣言を行う前にスクリプト外で宣言されたものです。この変数は、他の組み込み配列や変数同様、つねに存在します。
サイクル
チャートにある全バーの最高価格の平均値を計算することにしたと仮定します。それには、各エレメントを交代で変数に追加します。たとえば以下のようにです。
double AveragePrice = 0.0; AveragePrice += High[0]; AveragePrice += High[1]; AveragePrice += High[2]; AveragePrice += High[3]; AveragePrice += High[4]; // ... and so on AveragePrice /= Bars;
私としては、これは動作だろうが、ばかげている、としか言えません。そこで、サイクルです。処理はすべてまったく似通っていて、インデックスだけが 0 から変数 Bars-1 の値まで変化するだけであることに注意します。カウンターを決定し、配列エレメントを参照するためにそれを使用すればもっとずっと便利だろうと思われます。サイクルを使用してこのタスクを行います。
double AveragePrice = 0.0; for(int a = 0; a < Bars; a++) { AveragePrice += High[a]; }
一行ずつ確認します。
double AveragePrice = 0.0; // everything is clear // this is a cycle. or(int a = 0; a < Bars; a++)
サイクルはキーワードforで開始しているのがわかります。(サイクルには別タイプのものもあります。たとえばwhileですが、ここでは学習しません。)そして括弧内では、セミコロンで区切られたカウンター、サイクル処理条件、カウンター増加処理を指示しています。一般的には、以下のようになります。
for(declaration of a counter; the cycle operation conditions; counter changes) { // the source code, that will be repeated is in braces, }
サイクル宣言の各段階をもっと詳しく見ていきます。
カウント宣言:カウンターには int タイプが使用されます。変数名-カウンターには重要ではありません。たとえば 0 からなど、第 1 の値を設定します。
カウンター操作条件:すべて簡単です。ここでは条件を決め、それが真であればサイクルが継続します。それ以外であれば、サイクルは終了します。たとえばわれわれの場合、以下です。
a < Bars
変数カウンターが変数 Bars の値より小さいとき、サイクルが続くのは明白です。変数 Bars=10 だとすると、サイクルが一巡すると変数は10まで1ずつ増加します。その後、サイクルは停止します。
カウンター変更:カウンターを変更しないかどうか(われわれの場合増加します)。条件が満たされないと、サイクルは決して終了ません。サイクルの意味をもっとよく理解できるよう、説明するコメント付のサイクルを操作するコードを書きました。
// the cycle: // double AveragePrice=0.0; // // for(int a=0;a> // { // AveragePrice+=High[a]; // } // // will be performed in this way: // double AveragePrice=0.0; int a=0; AveragePrice+=High[a]; a++; // now a=1, suppose Bars=3. // then the cycle goes on, because Bars > a AveragePrice+=High[a]; a++; // a=2 AveragePrice+=High[a]; а++; // a=3 // the conditions is not fulfilled any more, so the cycle // stops, because a=3 and Bars=3
ここからサイクルがどのように動作するか理解します。ただし、もう少し詳細を知る必要があります。
サイクル操作条件は変えることができます。たとえば以下のように、です。
a>10 // the cycle works while a>10 a!=10 // the cycle works while a is not equal to 10 a==20 // while a is not equal to 20 a>=2 // while a is more or equal to 2 a<=30 // while a is less or equal to 30
カウンターは異なる方法で変更します。たとえば、毎回1ずつ増やす必要はありません。これは以下のように行います。
a-- // the counter will each time decrease by 1 a += 2 // the counter will each time increase by 2
また、サイクル本文にカウンター変化を入れることができます。以下がその例です。
for(int a=0; a<Bars;) { AveragePrice+=High[a]; a++; // the counter changes inside the cycle body } >
そしてサイクル内で変数カウンターを宣言する必要はありません。それを別の方法で行うこともできます。
int a = 0; for(;a < Bars;) { AveragePrice += High[a]; a++; // the counter changes inside the cycle body }
以下のようにサイクル本文に演算子が1つしかなければ、
for(int a = 0; a < Bars; a++) { AveragePrice += High[a]; }
括弧を入れる必要はありません。
for(int a = 0; a < Bars; a++) AveragePrice += High[a];
そろそろサイクルについては終わりです。別のサイクルタイプもありますが、それについては次のレッスンで行います。ここではサイクルをいつ使うか理解しておくことと、構文を覚えておくことです。関数によってカウンター値を表示するサイクルをいくつか書いてみることです。不連続サイクルを書いてみて、開始後何がおこるか確認します。
条件
常に使うものでもうひとつ重要な項目があります。それは条件です。われわれの生活は数多くの条件とその条件に従う行動で構成されています。われわれはひじょうに頻繁に条件節で物事を考えます。たとえば、「十分時間があればこの本をよむのだが、時間がなければ雑誌を読んだほうがよい。」このような条件と行動を何百と産み出します。ですが MQL4 ではそれをどのように書けばよいのでしょうか?以下がその例です。
// of course the conditionsn should be written in MQL4 if( I have enough time ) { // here we place any actions, directions in MQL4 will read this book; } // if the first condition is not fulfilled, // the second is fulfilled else { read a magazine; // code }
条件の構文を理解します。完全に MQL4 言語で書かれた条件を考察します。
int a = 10; int b = 0; if(a > 10 ) { b = 1; } else { b = 2; } MessageBox("b=" + b,".");
ひじょうに簡単です。完了後 b の値は何になりますか?もちろん b=2 です。これは条件 a > 10 が満たされていないためです。 簡単なことです。他のキーワードを使用する必要はありません。
int a = 10; int b = 0; if(a > 10) { b = 1; }
この場合、条件が満たされなければ、括弧内で条件に従うコードブロックは飛ばされます。われわれの場合、b = 0 が満たされたあとです。また途中で条件が作成されていることに注意します。異なる変数タイプは異なる値を取得することがわかっています。例えば以下です。
- int -整数(1, 60, 772)
- double -浮動小数点を伴う(1.0021, 0.221)
- string -行のみ(『語』、『なんらかのテキスト』)
- bool -真または偽のみ(真、偽)
よって、結論です。変数は条件内で受け取る値とだけ比較する。たとえば以下です。
int Integer=10; double Double=1.0; string String="JustWord"; bool Bool=true; if(Integer<10) // the condition is correct { MessageBox("It works!","Really!"); } if(Double!=1.0) // the condition is correct { MessageBox("works!","Simple!"); } if(String==10) // this is nonsense!! // we found the variable //String with string type, but 10 is int { MessageBox("Wrong type","u can't c this"); } if(String!="Word") // ok {{ // ... } if(Bool==true) // correct { // ... }
比較は条件演算子(==, !=, >, <, >=, <=)を用いて比較することに注意が必要です。文字列タイプと bool タイプには == および != の比較のみ使用します。
ここからはインクルードの意味を理解します。サイクル内で条件を、条件内でサイクルを、条件を別の条件内で使用できる、ということです。例:
int a=0; double b=0.0; bool e; if(a==0) { for(int c=0;c<Bars;c++) { b+=High[c]; } if(b>500.0) { e=true; } else { e=false; } }
次の例は条件使用の別の方法を示しています。
int a=0; int result; if(a==0) { result=1; } else if(a==1) { result=2; } else if(a==2) { result=3; } else { result=4; }
ある条件のデフォルトに別の条件を入れる場合は、上の例のようにそれをキーワード“else”の後に書きます。これもまた動作します。他の条件の数に制限はありません。条件を満たすアクションが1つの処理にあてはまれば、サイクル同様括弧は飛ばすことができます。
if(a==1) { b=2; } // or this way: if(a==1) b=2;
複雑な条件
条件1つでは十分でないことはよくあることです。数多くのパラメータを比較する必要があるのです。それは複雑な条件で行わなければなりません。たとえば、私に十分な時間と忍耐があれば、MQL4 言語を学ぼうと思うます、という条件があります。それをコードで書くことができます。
if((enough time) && (enough oatience))
{
I will learn MQL4 language;
}
まず複雑な条件をシンプルな条件に分け、それらを括弧に入れ、その間に &&(理論積)または ||(論理和)を入れます。どちらの条件も真であれば &&(AND)を入れます。どちらか一方の条件が真である場合は、 ||(OR)を入れます。以下がその例です。
nt a=10; int b=20; if((a>5) && (b<50)) MessageBox("Its works!","Yes");
条件は必要なだけエンクローズまたコンバインすることができます。
int a=10; int b=20; if ( ((a>5) || (a<15)) && ( b==20)) MessageBox("It works, too!","Yes");
すべてまとめて
複雑な条件と単純な条件を共に使用することで、みなさんが書くサイクルはひじょうに複雑なコードになる可能性があります。ほとんどすべてのメカニズムは、MQL4 言語のこういった簡単なストラクチャを用いて記述できます。このシンプルなものの書き方と操作方法を理解しているなら、MQL4 またはその他プログラム言語の半分は理解していることになります。それはほんとうにとても簡単です。必要なのは練習です。構文を覚え練習をするため、できるだけたくさんスクリプトを書くようにしてください。また、添付のファイル examples.mq4 にあるサンプルを見て、それの理解に努めてください。
その他の内蔵変数および配列
みなさんは High[]、Low[]、Volume[] などの配列や変数 Bars はすでにご存じです。以下により便利な変数の一部を挙げています。
double Open[] // the array of prices of the current // chart opening bars double Close[] // the array of prices of the current // chart closing bars double Bid // the last known buying price in // the current currency pair double Ask // the last known selling price in // the current currency pair
おわりに
これでみなさんは新しい事柄を数多く学びました。おそらく頭の中はぐちゃぐちゃでしょう。テキストを読み、覚え、練習して意味を理解するように努力してください。そうすればすべてすぐにはっきりします。本稿に書かれていることがらは MQL4 言語全体の基礎です。本稿をよりよく理解するほど今後の学習が簡単になるのです。もう一言。今後の学習は簡単なものとなるでしょう。なぜなら本稿で説明している内容はもっともむつかしい部分だからです。次の記事では、MQL4 言語の他の特殊な点について学習し、プログラミングに大きな可能性をもたらす他の統合関数を考察します。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/1475





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