2018年7月28日土曜日

[MT4] MetaQuotes ID が勝手に変わった

ここ数日、MetaTrader から Android への通知が届かないと思っていたら、MetaQuotes ID が勝手に変わっていました。

2018年7月27日金曜日

MetaTrader の EA から Android, iOS に通知を送る方法

EA を使った自動売買派でも、MetaTrader のモバイルアプリは便利に使えます。

特に通知機能。 注文が通った時など、EA の中から任意のタイミングでモバイル端末に通知を送る事が出来ます。 EA からメールを送信することも出来ますが、通知の方が速く届くことが多いです1

設定の仕方は以下の通り。

2018年7月13日金曜日

[MQL4] リスク許容額からロット数を求める方法

FXで重要なのは資産管理。 1トレードで許容されるリスクは、総資産の N% 以内に収めるべし。という教えはよくききます。

これを実現するには、最大ストップロスが総資産の N% になるよう、1トレードのロット数を求めれば良いわけです。 Metatrader ではこれも自動化することが出来ます。

2018年7月12日木曜日

[MQL4] 値幅を基準通貨の金額に換算する方法

2019/4/13 追記

ここで紹介している SYMBOL_TRADE_TICK_VALUE は Strategy Tester の中では使用できないのでご注意ください。
[MQL4] SYMBOL_TRADE_TICK_VALUE は過去の値がとれない | Strategy of C

「ストップロスに引っかかったらどれくらいの損失になるのか」等、値幅を基準通貨の金額に換算したいケースがあります。 そういった場合、SystemInfoDouble()SYMBOL_TRADE_TICK_VALUE を使うと、値幅を基準通貨の金額に換算することが出来ます。

なお、SystemInfoDouble() の代わりに MarketInfo() を使っても同じ結果が出るとは思いますが、 環境によっては、どちらか一方しか動かない可能性もあるので、事前に確認してください。

参考

[MQL4] MarketInfo は使わない方が良いらしい | Strategy of C

1ロットあたりの金額を求める

ある値幅を基準通貨の金額に換算するには、以下のようにします。 この時の金額は 1ロット分です。

1
2
3
4
5
6
// (high - low) = 値幅が与えられているとして (high > low)
// 値幅が 何 ticks 相当か計算する
double ticks = (high - low) / SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
 
// SYMBOL_TRADE_TICK_VALUE は 1 tick 当たりの基準通貨の金額になるので、ticks とかけると金額が求まる
double price_per_lot = ticks * SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE);

実際の金額に変換する

上記の値は 1ロット当たりの金額なので、実際に取引するロット数をかければ基準通貨での金額になります。

例えば、以下は最小ロット1で取引した場合の金額を求める方法です。

1
2
// 最小ロットでの金額を求める。
double price_per_min_lot = price_per_lot * MarketInfo(Symbol(), MODE_MINLOT);

なお、ロットに関する情報は SystemInfoDouble() で取れないようなので、MarketInfo() を使用しています。

基準通貨を含まない通貨ペアは不正確

この方法、便利なのですが、基準通貨を含まない通貨ペアの場合、正確な値は求められないので注意してください。

例えば、基準通貨が日本円で EUR/GBP の取引をする場合、値幅を円に変換するには GBP/JPY の値を(内部で)使用します。しかし、GBP/JPY も変化していますし、将来どのように動くかはわかりません。 つまり、あくまで現在の GBP/JPY を使った換算値しか求められないということになります。

決済済みポジションの損益

余談ですが、決済済みポジションの損益は、OrderProfit() で求められます。

  1. 国内の業者の場合、最小ロットは1ロットではなく、0.1 や 0.01 のところが多い。もはやロットは何だっけという話。 
?
2018年7月11日水曜日

[MQL4] Metatrader の口座残高に関わる情報 6種

2018年7月10日火曜日

[MQL4] MarketInfo() は使わない方が良いらしい

こんな投稿をみつけた。

MarketInfo(Symbol(), MODE_POINT) failed to return valid value in MT4 - MetaTrader 4 - General - MQL5 programming forum

大分昔のもので、かつ MQL5 の話だけど…

MarketInfo() を使うのではなく SymbolInfoDouble() 等を使ったほうが良いらしい。

MQL5 から移ってきた機能は動作が不安定なものもあるので、一概に良いとは言えないですが、将来的な移行も見据えるのなら動作確認をしっかりした上で従っておくのが良いかもしれません。

2018年7月9日月曜日

[MQL4] Point と Tick の違い

MarketInfo() で指定できるモードには MODE_POINTMODE_TICKSIZE という項目があります。

何が違うのか気になりつつ、今まで放置してきたのですが、今回ちょっと時間が出来たので調べてみました。

結論としては…やはりよくわかりません。 私の環境では MODE_POINTMODE_TICKSIZE は常に同じ値を返すので、検証しようにも出来ないのです。

ただ、ドキュメント等を読んで推測した結果、以下のような状況があり得るのではないかと思われます。

MODE_POINT0.001
MODE_TICKSIZE0.025

つまり、MODE_POINT は最小の桁を表すので必ず 10 の N乗になる1。 それに対し、MODE_TICKSIZE は最小変動幅を表すので、様々な値を取りうる、ということです2

しつこいですが、あくまで推測です。 誰か詳しい方がいたら教えてください。

なお、MODE_TICKSIZE が最後の変動幅を返すという記述を見かけたのですが、動作を確認してみたところ、少なくとも私の環境ではそのような動きはしませんでした。

2018/7/10 追記

MarketInfo は使わない方が良いらしい ので、SymbolInfoDoubleSYMBOL_POINTSYMBOL_TRADE_TICK_SIZE でもやってみましたが、結果変わらず。

  1. Nは整数 
  2. ただし、最小桁は一致するはず 
?
2018年7月7日土曜日

[MQL4] INDICATOR_CALCULATIONS を有効にするには IndicatorBuffers を使う

@MetaTrader 4 (Version 4.00 Build 1090)

MT4 のカスタムインジケーターでは計算用のバッファーを用意する機能があり、計算の途中結果等を保存しておくことが出来ます。 当然、それは非表示になる…はずなのですが、普通に作ると何故か表示されてしまうのです。

これを想定通りに動作させるには少し工夫が必要なので書いておきます。