【MQL4入門】プログラミング未経験者のための基礎文法ガイド
「EAを作りたいけど、プログラミングがわからない...」 「変数?関数?if文?何それおいしいの?」
大丈夫です。この記事を読めば、MQL4でEAを書くために必要な基礎がわかります。
プログラミングって聞くと難しそうですが、実は日常生活でやってることと同じなんです。料理のレシピを書くようなもの。「卵を割る」「フライパンで焼く」「皿に盛る」という手順を、コンピュータがわかる言葉で書くだけ。
この記事で学べること
- 変数 - データを入れる箱
- データ型 - 箱の種類
- if文 - 「もし〜なら」の条件分岐
- for文 - 繰り返し処理
- 関数 - 処理のまとまり
- MQL4の組み込み機能 - すぐ使える便利機能
1. 変数 - データを入れる「箱」
変数って何?
変数はデータを入れておく箱です。
日常生活で例えると:
- 「財布」= お金を入れる箱
- 「冷蔵庫」= 食べ物を入れる箱
- 「本棚」= 本を入れる箱
プログラミングでも同じように、データを入れる箱を作って名前をつけます。
int age = 30; // 「age」という箱に「30」を入れるdouble price = 149.50; // 「price」という箱に「149.50」を入れるstring name = "太郎"; // 「name」という箱に「太郎」を入れるなぜ変数を使うの?
変数を使わないと、同じ値を何度も書かないといけません。
// 変数を使わない場合(面倒...)Print("現在価格は149.50です");Print("149.50で買います");Print("149.50を記録しました");
// 変数を使う場合(楽!)double price = 149.50;Print("現在価格は", price, "です");Print(price, "で買います");Print(price, "を記録しました");価格が変わっても、1箇所直すだけでOKになります。
2. データ型 - 箱の「種類」
箱には種類があります。お金を入れる財布に本は入れませんよね?
MQL4でよく使うデータ型は4つ:
| データ型 | 入れられるもの | 例 |
|---|---|---|
| int | 整数(小数点なし) | 1, 100, -50 |
| double | 小数(小数点あり) | 149.50, 3.14 |
| string | 文字列 | "こんにちは", "USDJPY" |
| bool | true か false | true, false |
使い分けの例
int lotCount = 3; // 注文回数(整数)double price = 149.523; // 価格(小数)string symbol = "USDJPY"; // 通貨ペア(文字)bool isOpen = true; // ポジションがあるか(はい/いいえ)よくある間違い
// ❌ 間違い:整数型に小数を入れようとしているint price = 149.50; // 149になってしまう!
// ✅ 正しい:小数にはdoubleを使うdouble price = 149.50;3. if文 - 「もし〜なら」
if文って何?
if文は条件によって処理を変える仕組みです。
日常生活で例えると:
- 「もし雨が降ったら、傘を持っていく」
- 「もしお腹が空いたら、ご飯を食べる」
if(雨が降っている) { 傘を持っていく; }MQL4での書き方
double price = 150.00;
if(price > 149.00) { Print("価格が149円を超えました!"); }if-else: 「もし〜なら、そうでなければ」
double price = 148.00;
if(price > 149.00) { Print("高い!売りを検討"); }else { Print("まだ安い。様子見"); }if-else if-else: 複数の条件
double price = 150.00;
if(price > 155.00) { Print("かなり高い!"); }else if(price > 150.00) { Print("やや高い"); }else if(price > 145.00) { Print("普通"); }else { Print("安い!"); }条件の書き方
| 記号 | 意味 | 例 |
|---|---|---|
> | より大きい | price > 100 |
< | より小さい | price < 100 |
>= | 以上 | price >= 100 |
<= | 以下 | price <= 100 |
== | 等しい | price == 100 |
!= | 等しくない | price != 100 |
注意: 「等しい」は = じゃなくて ==(2つ)です!
// ❌ 間違いif(price = 100) // これは「代入」になってしまう
// ✅ 正しいif(price == 100) // これが「比較」複数の条件を組み合わせる
// AND(両方満たす): &&if(price > 149.00 && price < 151.00) { Print("149〜151の範囲内"); }
// OR(どちらか満たす): ||if(price < 145.00 || price > 155.00) { Print("145未満か155超過"); }4. for文 - 繰り返し処理
for文って何?
for文は同じ処理を繰り返す仕組みです。
日常で例えると:
- 「腕立て伏せを10回繰り返す」
- 「階段を5段上る」
for(int i = 0; i < 10; i++) { Print("腕立て ", i+1, "回目!"); }出力:
腕立て 1回目!腕立て 2回目!...腕立て 10回目!for文の構造
for(初期値; 条件; 増加) { 繰り返す処理; }- 初期値: カウンターの開始値(
int i = 0) - 条件: 繰り返しを続ける条件(
i < 10) - 増加: 1回ごとにカウンターを増やす(
i++)
EAでの使用例
過去10本分のローソク足の終値を表示する:
for(int i = 0; i < 10; i++) { double closePrice = iClose(NULL, 0, i); Print(i, "本前の終値: ", closePrice); }5. 関数 - 処理のまとまり
関数って何?
関数は処理をまとめて名前をつけたものです。
日常で例えると:
- 「朝の準備」= 起きる→顔洗う→着替える→朝食
- 「料理する」= 材料切る→炒める→味付け→盛り付け
一連の処理をまとめて「朝の準備」と呼ぶのと同じです。
関数の作り方
// 関数の定義(作る)void SayHello() { Print("こんにちは!"); Print("今日もトレード頑張りましょう!"); }
// 関数の呼び出し(使う)void OnTick() { SayHello(); // これで上の2行が実行される }引数(パラメータ)を受け取る関数
// 名前を受け取って挨拶する関数void Greet(string name) { Print("こんにちは、", name, "さん!"); }
// 使い方Greet("太郎"); // → こんにちは、太郎さん!Greet("花子"); // → こんにちは、花子さん!値を返す関数
// スプレッドをpipsで計算して返す関数double GetSpreadPips() { double spread = (Ask - Bid) * 10000; return spread; // 計算結果を返す }
// 使い方void OnTick() { double spread = GetSpreadPips(); Print("現在のスプレッド: ", spread, "pips"); }voidとは?
voidは「何も返さない」という意味です。
void= 処理するだけ、結果は返さないdouble= 計算して小数の結果を返すint= 計算して整数の結果を返すbool= true/falseを返すstring= 文字列を返す
6. MQL4の組み込み機能
MQL4には、最初から使える便利な機能がたくさんあります。
よく使う値(変数)
| 名前 | 意味 | 例 |
|---|---|---|
Ask | 現在の買値 | 149.523 |
Bid | 現在の売値 | 149.520 |
Point | 最小価格単位 | 0.001 |
Digits | 小数点以下の桁数 | 3 |
void OnTick() { Print("買値: ", Ask); Print("売値: ", Bid); Print("スプレッド: ", (Ask - Bid) / Point, "ポイント"); }よく使う関数
| 関数 | 意味 | 使い方 |
|---|---|---|
Print() | ログに出力 | Print("Hello"); |
Symbol() | 現在の通貨ペア | Symbol() → "USDJPY" |
Period() | 現在の時間足 | Period() → 60(1時間足) |
iClose() | 終値を取得 | iClose(NULL, 0, 1) |
iOpen() | 始値を取得 | iOpen(NULL, 0, 1) |
iHigh() | 高値を取得 | iHigh(NULL, 0, 1) |
iLow() | 安値を取得 | iLow(NULL, 0, 1) |
iMA() | 移動平均を取得 | 後述 |
iClose(), iOpen()などの引数
iClose(通貨ペア, 時間足, 何本前のローソク足か);
// 例iClose(NULL, 0, 0); // 現在の足の終値(NULL=現在のチャート)iClose(NULL, 0, 1); // 1本前の足の終値iClose("USDJPY", 60, 5); // USDJPYの1時間足で5本前の終値移動平均線を取得する
iMA(通貨ペア, 時間足, 期間, シフト, 種類, 適用価格, 何本前か);
// 例:20期間の単純移動平均(現在の値)double ma20 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
// 例:5期間の指数移動平均(1本前)double ema5 = iMA(NULL, 0, 5, 0, MODE_EMA, PRICE_CLOSE, 1);実践:学んだことを組み合わせる
これまで学んだことを使って、「スプレッドが狭い時に移動平均を表示する」EAを作ってみましょう。
//+------------------------------------------------------------------+//| 学習用EA |//+------------------------------------------------------------------+#property strict
// スプレッドを計算する関数double GetSpreadPips() { return (Ask - Bid) * 10000; }
// メイン処理void OnTick() { // 変数を使う double spread = GetSpreadPips(); double ma20 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0); double currentPrice = Bid;
// if文で条件分岐 if(spread <= 2.0) { Print("=== スプレッド良好!==="); Print("スプレッド: ", spread, "pips"); Print("現在価格: ", currentPrice); Print("20MA: ", ma20);
// 価格とMAの位置関係をチェック if(currentPrice > ma20) { Print("→ 価格がMAより上(上昇トレンド?)"); } else { Print("→ 価格がMAより下(下降トレンド?)"); } } }よくあるエラーと対処法
「';' expected」
原因: 行末のセミコロン忘れ
// ❌int price = 100
// ✅int price = 100;「'〇〇' - undeclared identifier」
原因: 変数を宣言せずに使おうとしている
// ❌price = 100; // priceが宣言されていない
// ✅double price = 100; // 先に宣言する「'=' - l-value required」
原因: 比較の == を = と書いている
// ❌if(price = 100)
// ✅if(price == 100)まとめ
| 概念 | 一言で | 日常の例え |
|---|---|---|
| 変数 | データを入れる箱 | 財布、冷蔵庫 |
| データ型 | 箱の種類 | 財布にはお金、冷蔵庫には食べ物 |
| if文 | もし〜なら | 雨なら傘を持つ |
| for文 | 繰り返し | 腕立て10回 |
| 関数 | 処理のまとまり | 「朝の準備」 |
これでMQL4の基礎文法は理解できました!
次は実際に、この知識を使って移動平均線クロスで売買するEAを作ってみましょう。
📚 次に読む記事: 移動平均線クロスEAを作ろう
プログラミングは「慣れ」です。最初は意味不明でも、何度も書いているうちに自然と身につきます。焦らず、一歩ずつ進んでいきましょう! 💪
🎁おすすめツール・サービス
※上記リンクにはプロモーション(広告)が含まれています
量子相場謀略|ホソノP
ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。