2018年7月28日土曜日
EA を使った自動売買派でも、MetaTrader のモバイルアプリは便利に使えます。
特に通知機能。
注文が通った時など、EA の中から任意のタイミングでモバイル端末に通知を送る事が出来ます。
EA からメールを送信することも出来ますが、通知の方が速く届くことが多いです
。
設定の仕方は以下の通り。
EA を使った自動売買派でも、MetaTrader のモバイルアプリは便利に使えます。
特に通知機能。
注文が通った時など、EA の中から任意のタイミングでモバイル端末に通知を送る事が出来ます。
EA からメールを送信することも出来ますが、通知の方が速く届くことが多いです特に Build 1129 以降はプッシュ通知になった模様。
設定の仕方は以下の通り。
FXで重要なのは資産管理。 1トレードで許容されるリスクは、総資産の N% 以内に収めるべし。という教えはよくききます。 これを実現するには、最大ストップロスが総資産の N% になるよう、1トレードのロット数を求めれば良いわけです。 Metatrader ではこれも自動化することが出来ます。
「ストップロスに引っかかったらどれくらいの損失になるのか」等、値幅を基準通貨の金額に換算したいケースがあります。 そういった場合、[SystemInfoDouble()](https://docs.mql4.com/marketinformation/symbolinfodouble) の `SYMBOL_TRADE_TICK_VALUE` を使うと、値幅を基準通貨の金額に換算することが出来ます。 なお、[SystemInfoDouble()](https://docs.mql4.com/marketinformation/symbolinfodouble) の代わりに [MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) を使っても同じ結果が出るとは思いますが、 環境によっては、どちらか一方しか動かない可能性もあるので、事前に確認してください。 > 参考 > > [[MQL4] MarketInfo は使わない方が良いらしい | Strategy of C](https://strategyofc.blogspot.com/2018/07/mql4-marketinfo.html) ### 1ロットあたりの金額を求める ある値幅を基準通貨の金額に換算するには、以下のようにします。 この時の金額は 1ロット分です。 ```mq4 // (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ロットではなく、0.1 や 0.01 のところが多い。もはやロットは何だっけという話。で取引した場合の金額を求める方法です。 ```mq4 // 最小ロットでの金額を求める。 double price_per_min_lot = price_per_lot * MarketInfo(Symbol(), MODE_MINLOT); ``` なお、ロットに関する情報は [SystemInfoDouble()](https://docs.mql4.com/marketinformation/symbolinfodouble) で取れないようなので、[MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) を使用しています。 ### 基準通貨を含まない通貨ペアは不正確 この方法、便利なのですが、基準通貨を含まない通貨ペアの場合、正確な値は求められないので注意してください。 例えば、基準通貨が日本円で EUR/GBP の取引をする場合、値幅を円に変換するには GBP/JPY の値を(内部で)使用します。しかし、GBP/JPY も変化していますし、将来どのように動くかはわかりません。 つまり、あくまで現在の GBP/JPY を使った換算値しか求められないということになります。 ### 決済済みポジションの損益 余談ですが、決済済みポジションの損益は、[OrderProfit()](https://docs.mql4.com/trading/orderprofit) で求められます。2019/4/13 追記ここで紹介している `SYMBOL_TRADE_TICK_VALUE` は Strategy Tester の中では使用できないのでご注意ください。
[[MQL4] SYMBOL_TRADE_TICK_VALUE は過去の値がとれない | Strategy of C](https://strategyofc.blogspot.com/2019/03/mql4-symboltradetickvalue.html)
[Account Information - MQL4 Reference](https://docs.mql4.com/account) で得られる情報の中で、口座残高に関わるものをまとめました。
こんな投稿をみつけた。 > [MarketInfo(Symbol(), MODE_POINT) failed to return valid value in MT4 - MetaTrader 4 - General - MQL5 programming forum](https://www.mql5.com/en/forum/4846) 大分昔のもので、かつ MQL5 の話だけど… [MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) を使うのではなく [SymbolInfoDouble()](https://www.mql5.com/en/docs/marketinformation/symbolinfodouble) 等を使ったほうが良いらしい。 MQL5 から移ってきた機能は動作が不安定なものもあるので、一概に良いとは言えないですが、将来的な移行も見据えるのなら動作確認をしっかりした上で従っておくのが良いかもしれません。
[MarketInfo()](https://docs.mql4.com/marketinformation/marketinfo) で指定できるモードには `MODE_POINT` と `MODE_TICKSIZE` という項目があります。 何が違うのか気になりつつ、今まで放置してきたのですが、今回ちょっと時間が出来たので調べてみました。 結論としては…やはりよくわかりません。 私の環境では `MODE_POINT` と `MODE_TICKSIZE` は常に同じ値を返すので、検証しようにも出来ないのです。 ただ、ドキュメント等を読んで推測した結果、以下のような状況があり得るのではないかと思われます。
MODE_POINT | 0.001 |
MODE_TICKSIZE | 0.025 |
@MetaTrader 4 (Version 4.00 Build 1090) MT4 のカスタムインジケーターでは計算用のバッファーを用意する機能があり、計算の途中結果等を保存しておくことが出来ます。 当然、それは非表示になる…はずなのですが、普通に作ると何故か表示されてしまうのです。 これを想定通りに動作させるには少し工夫が必要なので書いておきます。