まくまく投資ノート

更新:
作成:

経済的に独立し、自由な生き方を手に入れる FIRE (Financial Independence, Retire Early) という言葉が流行ってはや数年。 FIRE するには、ちゃんと金銭的な計算をすることが必要だと気付かせてくれる本です。 何かを学ぶにはお金がかかります。その学習コストは見合ったものなのか?目をそらしたくなるような計算結果があったりしますが、それが現実なのです。

  • (まだ)情熱には従うな!
    • 情熱に従うのが人生のカギだ!という言葉は嘘である。統計的に見ると、情熱に従った先には、失業や不完全就業が待っている。必ずしも情熱は良い仕事には繋がらない。好きなことをすればお金は後からついてくると考えるのは間違いである。まずはお金を追いかけましょう。好きなことはその後でもできるのです。
    • 需要のあるスキルを磨く ことによって、あなたは特別になれる。
  • ドーパミン/幸福感
    • より多くのモノを所有するほど、人は不幸になり、ストレスを抱える。逆に、より少ないモノを所有し、旅行や新たなスキルの習得など、経験にお金を使う ほど、人はより幸福になり、より人生に満足する。
    • モノが増えると、それに伴う出費や心配事が増えることになる。モノを手に入れた瞬間の喜びは大きいが、幸福感は徐々に薄れていく。一方、経験にはまったく同じものはない ため、経験にお金を使うたびに幸福感は上がっていく。経験は保管する必要がなく、想定外の費用が発生することもない。
  • パーセンテージで考える
    • 貧しい人の考え方 … わたしの時給はたったの 6 ドルです!
    • お金持ちの考え方 … 去年の儲けはたったの 3 パーセントだった!
  • 株の暴落を乗り切る
    • 現代ポートフォリオ理論は、株式と債権の両方を抱えているときのみ有効なアプローチである。なぜなら、株式の暴落時に債権を売ってリバンランシングすることが必要だから。いかに積極的な投資家でも、株式の保有を 8 割以上にはしない方がよい
    • 現代ポートフォリオ理論に従って運用するポートフォリオでは、個別銘柄を保有してはいけない
  • フリーダムマインド
    • お金ではなく、自由こそが最も重要だ
  • 魔法の数字「4 %ルール」
    • ポートフォリオの 4 %の資産で 1 年間の生活費を賄えれば、貯蓄が 30 年以上持続する可能性は 95 %以上。
    • つまり、生活費 × 25 が FIRE に必要な資金の基準になる。
      • 生活費が 500 万円なら … 12,500 万円
      • 生活費が 400 万円なら … 10,000 万円
      • 生活費が 300 万円なら … 7,500 万円
  • FIRE までにかかる年数
    • 早期リタイアのためには、貯蓄率を上げる ということが極めて重要。言い換えると、生活費を下げて、投資金額を増やす ということ。
    • リタイアまで何年かかるかは、年収には依存せず、貯蓄率(と想定する投資リターン)のみに依存する。なぜなら、貯蓄率が分かれば、自ずと年間で減らす資産の量を計算できるから(具体的なグラフは書籍を参照)。
  • FIRE 後の資産減少
    • リタイア後に資産が底をつくリスクが最も高いのは、下落相場のときに資産を売ってしまったとき。そうならないために、約 5 年分の現金クッション を用意しておき、下落相場ではそっちのお金を使うようにする。
    • 例えば、年間支出が 400 万円なら、400 万円 × 5 年分 = 2,000 万円を現金で保持しておく。下落相場で現金クッションを使ったら、次の 上昇相場中に補充する。これは大きな金額に見えるかもしれないが、ETF の配当などを差し引いて考えればよい。こういった収入を増やすことを、著者は「利回りシールド」と呼んでいる。
      • 現金クッション =(年間支出 − 年間利回り)× 年数

関連記事

更新:
作成:

Point と Digits とは(Pips とは違う?)

ポイントサイズ (Point) は具体的には 0.001 や 0.0001 などの数値であり、ブローカーが各通貨ごとに提示 (quote) する価格表示の最小単位を示しています。 ポイントの単位は決済通貨です。 下記はあるブローカーを使用した場合の、MetaTrader の取引パネルの表示例(ドル円とユーロドル)です。

/p/gkcxsb2/img-001.png

USDJPY は 0.001(円)の単位まで表示されているので、1 point = 0.001 です。 EURUSD は 0.00001(ドル)の単位まで表示されているので、1 point = 0.00001 です。 同様の概念として 桁数 (Digits) がありますが、これは小数点以下何桁まで提示するかであり、本質的には Point と同じ情報を示しています。 これらの値は、通貨ごとに異なるだけでなく、ブローカーによって異なること に注意してください。 提示パターンは大きく下記の 2 通りに分かれるようです。

  • 3/5 digit broker … USDJPY が x.xxX、EURUSD が x.xxxxX と提示される。
  • 4/6 digit broker … USDJPY が x.xxxX、EURUSD が x.xxxxxX と提示される。

OrderSend 関数や CTrade クラスで注文を出す 場合、最大許容スリッページ (Deviation) などをポイント数で指定する必要があります。 例えば、USDJPY のポイントサイズが 0.001 のときに、最大許容スリッページを 0.005 円 (0.5 pips) にしたければ、5 ポイントと指定する必要があります。

ちなみに、FX の世界では Pips (percentage in point) という単位もよく使われており、取引の成績を表現するときに利用されています(例:「ドル円で 10 ピップとった!」)。 ある通貨の 1 pip がいくらかは世界共通で決められていて、USDJPY の 1 pip = 0.01 円(1 銭)、EURUSD の 1 pip は 0.0001 ドルです。 上の取引パネルの図で、大きく表示されている数値が Pips を表しています。 つまり、このブローカーの場合、1 pip = 10 points です。

カレントチャートの通貨のポイントサイズを取得する (Point, Digits)

カレントチャートで表示している通貨のポイントサイズを調べるには、Point 関数、桁数を調べるには Digits 関数 を使用します。

Scripts/ShowPointAndDigits.mq5
void OnStart() {
    const string symbol = Symbol();  // カレントチャートのシンボル(例: "USDJPY)
    double point = Point();  // ポイントサイズ(例: USDJPY なら 0.001 や 0.0001)
    int digits = Digits();   // 小数点以下桁数(例: USDJPY なら 3 や 4)

    MessageBox(StringFormat("Symbol=%s, Point=%f, Digits=%d", symbol, point, digits));
}
表示例
Symbol=EURUSD, Point=0.000010, Digits=5

指定した通貨のポイントサイズを取得する (CSymbolInfo クラス、SymbolInfoXXX 関数)

CSymbolInfo クラスを使う方法

取引クラス のひとつである CSymbolInfo クラス を使用すると、指定したシンボル(通貨)の情報を取得することができます。 例えば、通貨ペア “USDJPY” のポイントサイズや桁数を知らべるには次のようにします。

CSymbolInfo クラスで USDJPY のポイントサイズを調べる
#include <Trade\SymbolInfo.mqh>

void OnStart() {
    CSymbolInfo sym;
    if (!sym.Name("USDJPY")) {  // 扱う通貨を指定
        Alert(StringFormat("Symbol name [%s] is invalid", sym.Name()));
        return;
    }

    MessageBox(StringFormat(
        "Symbol=%s, Point=%f, Digits=%d",
        sym.Name(), sym.Point(), sym.Digits()
    ));
}

SymbolInfoXXX 関数をつかう方法

シンボル情報は、SymbolInfoDouble 関数SymbolInfoInteger 関数 で取得することもできます。 こちらは、毎回対象のシンボル名を指定する必要があります。 1 つのシンボルからいろいろな情報を取得したい場合は、CSymbolInfo クラスを使った方がコードがすっきりします。

SymbolInfoXXX 関数で USDJPY のポイントサイズを調べる
void OnStart() {
    const string symbol = "USDJPY";
    double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
    long digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
    if (digits == 0) {
        Alert(StringFormat("%s の情報を取得できません", symbol));
        return;
    }

    MessageBox(StringFormat("Symbol=%s, Point=%f, Digits=%d", symbol, point, digits));
}

SymbolInfoDouble(Symbol(), SYMBOL_POINT) とした場合は、Point() と同じ意味になります。 不正なシンボル名などを指定して情報が取れない場合は、SymbolInfoInteger が 0 を返すことを利用してある程度のエラー処理を行えますが、ちゃんとエラー処理を行いたい場合は、3 つの引数を取るバージョンの SymbolInfoDouble/Integer 関数を使用します。

void OnStart() {
    const string symbol = "USDJPY";
    double point;
    long digits;

    bool isOk = SymbolInfoDouble(symbol, SYMBOL_POINT, point);
    isOk &= SymbolInfoInteger(symbol, SYMBOL_DIGITS, digits);
    if (!isOk) {
        Alert(StringFormat("%s の情報を取得できません", symbol));
        return;
    }

    MessageBox(StringFormat("Symbol=%s, Point=%f, Digits=%d", symbol, point, digits));
}

MarketInfo 関数をつかう方法(MT4 のみ)

MQL4 では次のように MarketInfo 関数を使っても同様にポイントサイズを取得することができますが、MQL4/5 共通で SymbolInfoDouble 関数が使えるので、そちらを使っておけばよいでしょう。

MarketInfo を使う方法 (MT4)
void OnStart() {
    const string symbol = "USDJPY";
    double point = MarketInfo(symbol, MODE_POINT);
    MessageBox(StringFormat("%s のポイントサイズは %f です", symbol, point));
}

関連記事

更新:
作成:

MT5 の OrderSend 関数

MT5 で注文を出すには OrderSend 関数日本語)を使用します。

MT5 の OrderSend 関数
bool OrderSend(
  MqlTradeRequest& request,  // 注文内容を指定する
  MqlTradeResult&  result    // 注文結果が格納される
)

ここでは、注文結果が格納される MqlTradeResult 構造体日本語)と、注文結果が格納される MqlTradeResult 構造体日本語)について説明します。

MqlTradeRequest 構造体(注文内容を指定する)

MqlTraderRequest 構造体には次のようなフィールドが定義されています。 各フィールドにどのような値を設定すべきかを順に説明していきます。

MqlTradeRequest 構造体
struct MqlTradeRequest {
  ENUM_TRADE_REQUEST_ACTIONS action;  // アクション(取引タイプ)
  ulong   magic;      // EA のマジックナンバー
  ulong   order;      // オーダーのチケット番号(待機注文を操作する場合)
  string  symbol;     // シンボル名
  double  volume;     // ロット数
  double  price;      // 価格
  double  stoplimit;  // ストップ・リミット注文発火時に使われる指値価格
  double  sl;         // 利確の価格
  double  tp;         // 損切の価格
  ulong   deviation;  // 最大許容スリッページ(ポイント)
  ENUM_ORDER_TYPE          type;          // 売買のタイプ
  ENUM_ORDER_TYPE_FILLING  type_filling;  // フィル・タイプ
  ENUM_ORDER_TYPE_TIME     type_time;     // 有効期限タイプ
  datetime  expiration;   // 有効期限
  string    comment;      // 注文コメント
  ulong     position;     // ポジションのチケット番号(ポジションを操作する場合)
  ulong     position_by;  // 反対ポジションのチケット番号(ポジション相殺用)
};

ENUM_TRADE_REQUEST_ACTIONS action(必須)

ENUM_TRADE_REQUEST_ACTIONS 列挙値 でアクション(取引タイプ)を指定します。 つまり、この OrderSend 関数を何のために使用するかを示します。 この値によって、残りのパラメータに何を設定すべきかがガラリと変わってきます。

TRADE_ACTION_DEAL
Place a market order
成行注文 を出します。
TRADE_ACTION_PENDING
Place a pending order
待機注文(指値/逆指値) を出します。
TRADE_ACTION_SLTP
Modify the stop loss (sl) and/or take profit (tp) of the current position
オープンポジションの損切/利確価格を、設定/修正 します。
TRADE_ACTION_MODIFY
Modify the previously placed pending order
待機注文の内容を修正 します。
TRADE_ACTION_REMOVE
Cancel a previously placed pending order
待機注文を削除 します。
TRADE_ACTION_CLOSE_BY
Close a position by an opposite one
2 つの反対方向の オープンポジションを相殺 することでクローズします。MT5 の新機能で、ヘッジアカウントを使っている場合のみ利用可能です。通常 2 回の取引が必要ですが、このアクションを指定することで、1 回分のスプレッドで 2 つのポジションをクローズできます。どちらかのポジションの方が多い場合は、差し引き分がオープンポジションとして残ります。ネットアカウントを使用している場合は、そもそも反対方向のポジションを持つことはできないので、このアクションは使用できません。

MT5 で追加されたアクション TRADE_ACTION_CLOSE_BY は要注目です。 両建てを活用する EA では、このアクションを活用することでスプレッドの支払額を減らして成績を上げることができます。

ulong magic(EA ならおそらく必須)

EA ごとに一意なマジックナンバーを設定します。 マジックナンバーは こちらの自動生成ツール で生成したものを指定すれば OK です。 EA でも magic 引数を省略 (=0) することはできますが、その場合はマニュアル注文と区別できなかったりと色々問題があるので、EA の場合は通常はこの引数は必須です。

ulong order(オプショナル)

発注済みの待機注文 (pending order) を削除/修正するときに、待機注文を特定するためのオーダーチケット番号(注文番号)です。 action 引数で TRADE_ACTION_REMOVE(待機注文の削除)や TRADE_ACTION_MODIFY(待機注文の修正)を指定した時に必須になります。

string symbol(新規売買時に必須)

トレード対象のシンボル名("USDJPY" など)を指定します。 カレントチャートのシンボルであれば、Symbol()_Symbol を指定すれば OK です。

待機注文の削除/修正(action 引数が TRADE_ACTION_REMOVE あるいは TRADE_ACTION_MODIFY)の場合)は symbol 引数は省略することができます(order 引数のオーダーチケット番号で対象となる注文を特定できるため)。

double volume(必須)

トレードの量をロット数で指定します。 USDJPY のトレードであれば、通常 0.1 ロットが 1 万通過を表します(1 万ドルの売買)。 実際にどれだけ約定するかは、Filling policy(type_filling 引数)によって変わってくることに注意してください。

double price(オプショナル)

売買の価格を指定します。

price 引数が必須になるのは、action 引数が TRADE_ACTION_DEAL かつ ブローカーの注文執行方式 が Instant execution か Request execution に設定されている場合、あるいは、action 引数が TRADE_ACTION_PENDINGTRADE_ACTION_MODIFY のいずれかである場合です。 それ以外の注文では、price 引数の値は無視されます。

成行の買い注文であれば現在の Ask 価格 (SymbolInfoDouble(Symbol(), SYMBOL_ASK))、売り注文であれば現在の Bid 価格 (SymbolInfoDouble(Symbol(), SYMBOL_BID)) を指定すれば OK です。 待機注文 (action == TRADE_ACTION_PENDING) の場合は、type 引数によって指値価格(現在より有利な価格)と逆指値価格(現在より不利な価格)のどちらの価格を指定するかが変わってきます。

☝️ ワンポイント 成行注文の注文執行方式が、ブローカーによって Market execution か Exchange execution に設定されている場合は、price 引数の値は使用されないということになっています。 なぜなら、それらの注文執行方式の場合は、常に最終的な市場価格で約定されるからです。 一方、Instant execution か Request execution の場合は、ユーザー側から注文価格 (price) と許容スリッページポイント (deviation) の両方を指定する必要があります。 なぜなら、ブローカー側は「売買価格」と「スリッページ」の両方の情報をもって初めてスリッページを考慮したリクオート(約定拒否)判断を行えるからです。

double stoplimit(オプショナル)

ストップ・リミット注文時のトリガー価格(逆指値)を指定します。 ストップ・リミット注文を出すには、action 引数で TRADE_ACTION_PENDING を指定し、type 引数で ORDER_TYPE_BUY_STOP_LIMIT あるいは ORDER_TYPE_SELL_STOP_LIMIT を指定する必要があります。

例えば、「買い」のストップ・リミット注文 (type=ORDER_TYPE_BUY_STOP_LIMIT) の場合、price の価格まで上昇したときに、stoplimit の価格で買いの指値注文が入ります。 このとき、stoplimit で指定した価格より高い価格で買ってしまうことはありません(トリガー後に買い指値注文になるので)。 価格が上抜けしたときに、このくらいの価格なら買ってもよいよというブレークアウト戦略で利用できます。

逆に、「売り」のストップ・リミット注文 (type=ORDER_TYPE_SELL_STOP_LIMIT) の場合、price の価格まで下落したときに、stoplimit の価格で売りの指値注文が入ります。 このとき、stoplimit で指定した価格より低い価格で売ってしまうことはありません(トリガー後に売り指値注文になるので)。 価格が下抜けしたときに、このくらいの価格なら売ってもよいよというブレークアウト戦略で利用できます。

double sl(オプショナル)

損切りのための逆指値価格 (Stop loss) を指定します。 指定した価格に到達すると、このポジションはすべて決済されます。 損切り設定しない場合は、sl 引数に 0 を指定します。

☝️ ワンポイント 古いバージョンでは、ブローカーの注文執行方式が Market execution のときに、sl 引数は指定できませんでしたが、現在は指定可能です。

double tp(オプショナル)

利食いのための指値価格 (Take profit) を指定します。 指定した価格に到達すると、このポジションはすべて決済されます。 利食い設定しない場合は、tp 引数に 0 を指定します。

☝️ ワンポイント 古いバージョンでは、ブローカーの注文執行方式が Market execution のときに、tp 引数は指定できませんでしたが、現在は指定可能です。

ulong deviation(注文執行方式により必須)

price 引数で指定した価格からの許容スリッページ(ポイント数)を指定します。 ブローカーの注文執行方式が、Instant execution あるいは Request execution のときのみ有効です。 注文後に許容スリッページ以上の価格変化があった場合、ブローカーからリクオート(約定拒否)されます。

ENUM_ORDER_TYPE type(必須)

注文タイプ(買い/売りのどちらなのか、成行/待機注文のどちらなのか)を指定します。 指定可能な注文タイプには以下のようなものがあります。

  • ORDER_TYPE_BUY … 買いの成行注文
  • ORDER_TYPE_SELL … 売り成行注文
  • ORDER_TYPE_BUY_STOP … 買いの逆指値注文(つまり、上抜けブレーク時に成行買い)
  • ORDER_TYPE_SELL_STOP … 売りの逆指値注文(つまり、下抜けのブレーク時に成行売り)
  • ORDER_TYPE_BUY_LIMIT … 買いの指値注文(つまり、安くなったら成行買い)
  • ORDER_TYPE_SELL_LIMIT … 売りの指値注文(つまり、高くなったら成行売り)
  • ORDER_TYPE_BUY_STOP_LIMIT … 買いのストップ・リミット注文(つまり、上抜けブレーク時に指値買い注文)
  • ORDER_TYPE_SELL_STOP_LIMIT … 売りのストップ・リミット注文(つまり、下抜けブレーク時に指値売り注文)
  • ORDER_TYPE_CLOSE_BY … 反対方向のポジションを相殺する注文

ENUM_ORDER_TYPE_FILLING type_filling(オプショナル)

注文の フィル・ポリシー (fill policy)、約定形式日本語) を指定します。 注文時に指定したロット数(volume 引数)が一度に約定させられない場合にどう処理するかを指定します。

  • ORDER_FILLING_FOK (0) … Fill or Kill. 全約定できなければ全ロットをキャンセル。
  • ORDER_FILLING_IOC (1) … Immediate or Cancel. できるだけ約定させ、残りをキャンセル。
  • ORDER_FILLING_RETURN (2) … Return. 取引サーバー側で全約定するまで市場に注文を出し続ける。

フィル・ポリシーに関しては複雑な事情があるので、下記ページで別途説明しています。

ENUM_ORDER_TYPE_TIME type_time(オプショナル)

待機注文を出す時に、その注文の 有効期限タイプ日本語)を指定します。

  • ORDER_TIME_GTC (0) … Good till canceled. 待機注文の有効期限を設定しません(明示的にキャンセルされるまで有効です)
  • ORDER_TIME_DAY (1) … 待機注文はその日の間だけ有効です。
  • ORDER_TIME_SPECIFIED (2) … 待機注文は datetime 引数で指定した日時まで有効です。
  • ORDER_TIME_SPECIFIED_DAY (3) … 待機注文は datetime 引数で指定した日が終わるまで有効です(23:59:59 あるいはその日の最終取引時刻までです)。

datetime expiration(オプショナル)

待機注文の有効期限を指定します。 有効期限タイプ(type_time 引数)の値に、ORDER_TIME_SPECIFIED あるいは ORDER_TIME_SPECIFIED_DAY が指定されている場合のみ有効です。

string comment(オプショナル)

注文にコメントテキストを設定します。

ulong position(オプショナル)

ヘッジアカウントにおいて、ポジションの内容を修正(TRADE_ACTION_SLTP)したり、決済 (TRADE_ACTION_CLOSE / TRADE_ACTION_CLOSE_BY) したりするときにポジションのチケット番号を指定します。 ネットアカウントの場合は、すべてのポジションはシンボル(銘柄)ごとに集約されるため、このパラメーターは必要ありません(symbol の指定だけで OK)。

ulong position_by(オプショナル)

action 引数で TRADE_ACTION_CLOSE_BY を指定して 2 つの反対ポジションを相殺させるときに、2 つ目のポジションのチケット番号を指定します。1 つ目のポジションは position 引数で指定します。 両建てが可能なヘッジアカウントのみで有効です。

MqlTradeResult 構造体(注文結果が格納される)

(追記予定)

MqlTraderResult 構造体には次のようなフィールドが定義されています。 各フィールドにどのような値を設定すべきかを順に説明していきます。

MqlTradeResult 構造体
struct MqlTradeResult {
  uint    retcode;  // 操作のリターンコード
  ulong   deal;     // 実行された場合の 約定チケット
  ulong   order;    // 注文された場合のチケット
  double  volume;   // ブローカーによって確認された約定ボリューム
  double  price;    // ブローカーによって確認された約定価格
  double  bid;      // 現在の売値
  double  ask;      // 現在の買値
  string  comment;  // 操作に対するブローカーコメント(デフォルトは取引サーバの返したコードの記述)
  uint    request_id;  // ディスパッチの際に、端末によって設定されたリクエストID
  uint    retcode_external;  // 外部取引システムのリターンコード
};

uint retcode

ulong deal

ulong order

double volume

double price

double bid

double ask

string comment

uint request_id

uint retcode_external

関連記事

メニュー

まくまく投資ノート
サイトマップまくへのメッセージ