ご訪問ありがとうございます。
元スーパー店員で不労所得生活を目論むひろしです。
前回
今回は、とっても価値の高い方法をお伝えします。
これを知ることであなたは、
MT4とMT5の違いを知ることが
できるのでどちらを使えばいいのかが
わかります。
例えば、あなたの知人Aさんに
Aさん:「あのー、MT4とMT5どっちを使えばいいんですか?」
って聞かれたら、自信を持って
あなた:「あー、君の場合は、〇〇ですよ。」
と答えることができます。
逆に、知らないと
あなた:「えーと、えーと、MT5がいいらしいけど。
なんとなくMT4で。的な」
てな感じのままです。
結論から言うと、スペック的にはMT5が
断然いいのですが、仕様変更がエグすぎて
MT4用のツール(EAやスクリプト)が追従できなかった
わけですね。
なので、ツールを使わず単体で使うなら
MT5がいいですが、
あなたの使用したいツールが
MT5に対応していなければ
MT4で使わざるを得ません。
という前置きの元
TrimPipsもMT5に対応することにしました。
まずは開発環境
エディタの配色をほぼ同じにします。
とりあえず、コピペでコンパイルします。
地獄のようにエラーが出ました。
初っ端の
1 |
ObjectDelete(m_Line_name); |
がエラーになるので、諦めて
ウインドウだけ作ることにしました。
中身を空っぽにすれば
とりあえずできました。
しかもサイズ変更機能付きです^^
MQL4のOrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADE)
がなくなって
1 2 3 |
bool OrderSelect( ulong ticket // 注文チケット ); |
これを宣言して
1 2 |
#include <Trade\Trade.mqh> CTrade m_trade; |
やるといい
注文、約定、ポジンションをまず
理解する必要がある。
注文 ⇔ 取引 ⇒ ポジション(1通貨ペアに1つだけ?)
うーん、成行で注文を出して
売買が成立するまでの期間が「取引」タイム(おそらく)
厳密に細かいことができるみたいだが
とりあえず取引は無視してOK?
オーダー から 取引まで、はてまたDeal 約定まで
ロットが大きいとDealが分割される
いろんな単語が出てくる。
しかもサイトによって、単語の呼び方が違う?
とその前に
ヘッジタイプとネッティングアカウントっていうのがあるらしい。
ネッティングアカウントの場合は、両建てできない、ナンピンできない。
参考URL→https://fxantenna.com/what-difference-mql4-mql5/
まずは、現在のポジションを取得(この言い方が間違い?)
MQL4の場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
for(int i = 0; i < OrdersTotal(); i++) { if(OrderGetTicket(i) > 0) { Print("選択した注文のチケット番号 :", OrderTicket()); Print("選択した注文の注文時間 :", OrderOpenTime()); Print("選択した注文の注文価格 :", OrderOpenPrice()); Print("選択した注文の注文タイプ :", OrderType()); Print("選択した注文のロット数 :", OrderLots()); Print("選択した注文の通貨ペア :", OrderSymbol()); Print("選択した注文のストップロス価格:", OrderStopLoss()); Print("選択した注文のリミット価格 :", OrderTakeProfit()); Print("選択した注文の決済時間 :", OrderCloseTime()); Print("選択した注文の決済価格 :", OrderClosePrice()); Print("選択した注文の手数料 :", OrderCommission()); Print("選択した注文のスワップ :", OrderSwap()); Print("選択した注文の損益 :", OrderProfit()); Print("選択した注文のコメント :", OrderComment()); Print("選択した注文のマジックナンバー:", OrderMagicNumber()); } } |
で、MQL5の場合、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
for(int i = 0; i < OrdersTotal(); i++) { if(OrderGetTicket(i) > 0) { Print("選択した注文のチケット番号 :", OrderGetInteger(ORDER_TICKET)); Print("選択した注文の注文時間 :", OrderGetInteger(ORDER_TIME_SETUP)); Print("選択した注文の注文価格 :", OrderGetDouble(ORDER_PRICE_OPEN)); Print("選択した注文の注文タイプ :", OrderGetInteger(ORDER_TYPE)); Print("選択した注文のロット数 :", OrderGetDouble(ORDER_VOLUME_CURRENT)); Print("選択した注文の通貨ペア :", OrderGetString(ORDER_SYMBOL)); Print("選択した注文のストップロス価格:", OrderGetDouble(ORDER_SL)); Print("選択した注文のリミット価格 :", OrderGetDouble(ORDER_TP)); //Print("選択した注文の決済時間 :", OrderCloseTime()); //Print("選択した注文の決済価格 :", OrderClosePrice()); //Print("選択した注文の手数料 :", OrderCommission()); // Print("選択した注文の保留有効期限 :", OrderExpiration()); //Print("選択した注文のスワップ :", OrderSwap()); Print("選択した注文の損益 :", OrderGetDouble(ORDER_TP)); // Print("選択した注文のコメント :", OrderComment()); Print("選択した注文のマジックナンバー:", OrderGetInteger(ORDER_MAGIC)); } }と |
とやってみたが。。。。
ポジションがあっても 通らない。???
どうやら予約中のチケットが通る。
んんー、やっぱりポジンションでいいみたい。
というわけで、ポジションでそれっぽく
すると。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
for(int i = 0; i < PositionsTotal(); i++) { if(PositionGetTicket(i) > 0) { Print("選択した注文のチケット番号 :", PositionGetInteger(POSITION_TICKET)); Print("選択した注文の注文時間 :", PositionGetInteger(POSITION_TIME)); Print("選択した注文の注文価格 :", PositionGetDouble(POSITION_PRICE_OPEN)); Print("選択した注文の注文タイプ :", PositionGetInteger(POSITION_TYPE)); Print("選択した注文のロット数 :", PositionGetDouble(POSITION_VOLUME)); Print("選択した注文の通貨ペア :", PositionGetString(POSITION_SYMBOL)); Print("選択した注文のストップロス価格:", PositionGetDouble(POSITION_SL)); Print("選択した注文のリミット価格 :", PositionGetDouble(POSITION_TP)); Print("選択した注文の現在価格 :", PositionGetDouble(POSITION_PRICE_CURRENT)); Print("選択した注文のスワップ :", PositionGetDouble(POSITION_SWAP)); Print("選択した注文の損益 :", PositionGetDouble(POSITION_PROFIT)); Print("選択した注文のコメント :", PositionGetString(POSITION_COMMENT)); Print("選択した注文のマジックナンバー:", PositionGetInteger(POSITION_MAGIC)); } }な |
なんとなくよさげです。
MQL4
OrersSend |
成行注文
|
OrderSend |
指値注文
|
OrderModify |
注文変更
|
OrderClose |
ポジション決済
|
OrderDelete |
注文キャンセル
|
は、すべて
OrersSendに集約された
int HistoryDealsTotal(); |
ポジションのクローズ
1 2 3 4 |
bool PositionClose( const string symbol, // シンボル ulong deviation=ULONG_MAX // 偏差値 ) |
1 2 3 4 |
bool PositionClose( const ulong ticket, // Position ticket ulong deviation=ULONG_MAX // Deviation ) |
お~簡単簡単。
と思いきや失敗してしまう。
1 2 3 4 5 6 7 8 |
for(int i = 0; i < PositionsTotal(); i++) { if(! ExtTrade.PositionClose(_Symbol)) { Print("PositionClose失敗"); } } |
とやっても
こういうログは吐かれるのだが
失敗する。
1 |
2021.04.08 21:16:07.066 TrimPips (EURUSD,H1) CTrade::OrderSend: market sell 0.01 position #266147078 EURUSD [auto trading disabled by clientほかにもほ |
ほかにもやってみたが
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if(! ExtTrade.PositionClose(_Symbol)) { Print("PositionClose失敗"); } if(! ExtTrade.PositionClose(i)) { Print("PositionClose失敗=",i); } if(! ExtTrade.PositionClose(Symbol())) { Print("PositionClose失敗=",i); } |
どれもNGである。
なんというか
このインスタンスの実態がわからない
どうやって設定するんだ?
1 |
CTrade ExtTrade; |
わからん
わからん。
わからーーーん。
と思いきや、ちゃんとエラーメッセージを見ると。
auto trading disabled by client
なんとなく設定がdisableになっているっぽい。
で、以下の2つをチェックしてみた。
減少変わらず。
こんな説明が。。
なんかいけそう。
画面左上の「アルゴリズム取引」をONにすると。
できたー。
とりあえず、単一通貨のクローズはできました。
自分に対するマインドセットです。
エラーメッセージをよく読め。
Google先生は何でも知っている。
自分で考える事を避け、
闇雲にサンプルを漁っていました。
ちゃんと対峙すれば
即、解決したのでした。
とはいえ、大きな進歩です。
今回のおかげで、起動時に
「アルゴリズム取引」が
ONかどうかのチェクも行えそうです。
最後までご覧いただきありがとうございます。
つぎはこちら