ご訪問ありがとうございます。
元スーパー店員で不労所得生活を目論むひろしです。
前回
今回は、とっても価値の高い方法をお伝えします。
これを知ることであなたは、
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かどうかのチェクも行えそうです。
最後までご覧いただきありがとうございます。
つぎはこちら
コメント