このテーマだけで本が書けてしまうので、簡単に説明します。端的に言うと現在実現可能などんなプログラムも数値の読み書きと条件分岐だけで実現できます。
コメント
// に続く文は改行までがコメントとして無視される
/* */ で囲まれた文はコメントとして無視される(改行OK)
// 1行コメント
a = a + 1; // a を1つ増やす
/*
ブロック単位
での
コメント
*/
命令文
一つの命令文(処理)は;(セミコロン)で区切ります。改行、空白は無視されます。
a = a + 1;
// セミコロンまでが1つの命令なので上と同じ
a
=
a
+
1;
データ型
数値や文字列など扱うデータによって型が定義されています。mqlでよく使うのは以下になります。
型名 | 説明 | 例 |
int | 整数 | int a = 1; |
double | 実数 | double lots = 1.0; |
string | 文字列 | string symbol = “USDJPY”; |
bool | 論理値 | bool ret = true; |
void | 空(値がない特殊な型) | void OnTick(){ } |
変数
データを読み書きするための入れ物。システム内部だけでなく、システム外部からの入力を覚えたり、処理した結果をシステム外部に出力するのに使います。
// valという名前の変数を定義
int val = 0;
データ処理・計算
複数の変数や値を使って計算・処理すること
val = val + 10;
条件分岐
複数の変数や値を比べて、結果に応じて別々の処理に分岐すること
if
文法
条件式が成り立つ場合とそれ以外で別々の処理をするのに使います。
if (条件式) {
条件式が成り立つ場合の処理;
}
else {
それ以外の場合の処理;
}
例
if (rsi > 75) {
ret = true;
}
else {
ret = false;
}
for
処理を決まった回数繰り返すのに使います。
文法
for (初期化;条件式;変化式) {
実行する処理;
}
最初に初期化を処理し、条件式が成り立っていれば処理を実行します。
実行後に変化式を処理し条件式が成り立っていれば繰り返します。
while
文法
while (条件式) {
条件式が成り立つ間実行する処理
}
while文は条件式が成り立つ間処理を繰り返します。for文と同じ処理をwhile文でも書くことができます。繰り返す回数が決まっているときはfor文のほうが読みやすいです。
関数
引数を受け取って戻り値を返す一連の処理をまとめたもの
文法
戻り値の型 関数名(引数) {
処理;
return xx;
}
例
// 買シグナル判定関数
bool is_buy_signal() {
bool ret = false;
if ((iRSI(NULL, 0, 14, PRICE_CLOSE, 0)) < buy_threshold) {
ret = true;
}
return ret;
}
データ構造
複数のデータを組みにして扱う事が出ます。
配列
複数の値を扱う変数の集合(リスト)。変数名[添字]の形で使う。添字の値は0から始まる整数。
// 最新の始値 Open[0] 1つ前はOpen[1]
double open_val = Open[0];
構造体
型の違う複数の値を一つの集合として扱う
文法
struct 構造体名 {
データ型 フィールド名;
};
// 変数の宣言
構造体名 変数名;
// フィールドの参照
変数名.フィールド名
例
MqlTickは通貨ペアの最新の価格を格納する為の定義済み構造体です。
// 定義
struct MqlTick
{
datetime time; // 最後に価格を更新した時間
double bid; // 現在の売値
double ask; // 現在の買値
double last; // 最後の取引価格
ulong volume; // 出来高
};
// 使用例
void OnInit(){
// last_tick が変数名
MqlTick last_tick;
// SymbolInfoTickで通貨ペアの最新価格を取得する
if( true == SymbolInfoTick(Symbol(),last_tick)) {
// 価格情報を表示 last_tick.bid が売値、last_tick.askが買値
Print( "更新時間:",TimeToStr(last_tick.time),", 売値:",last_tick.bid,
", 買値:",last_tick.ask,", 出来高:",last_tick.volume);
}
}
オブジェクト
class
構造体に処理する関数を追加した物。詳しく書くと長くなるので、もっと適当な本で勉強してください。
// 状態基底クラス
class CStatus {
private:
// 現在の状態(メンバー変数)
int m_status;
protected:
// ポジションのチケット番号(静的クラス変数)
static int g_ticket;
public:
// メンバー関数
CStatus(int st) { m_status = st; }
virtual int sell_signal() { return status(); }
virtual int buy_signal() { return status(); }
virtual int check() { return status(); }
int status() { return m_status; }
static int ticket() { return g_ticket; }
void ticket(int tk) { g_ticket = tk; }
};