for (int i = 0; i < ArraySize(Lots); i++) if (OrderSelect(0, SELECT_BY_POS) && SymbolInfoTick(_Symbol, Tick)) OrderClose(OrderTicket(), Lots[i], Tick.bid, 0);
constint Total = OrdersHistoryTotal();
for (int i = 0; i < Total; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) OrderPrint(); } }
テスターで実行 mt4orders_exampleexpert.mq5
このライブラリを書いているとき、私はユーザーとの間に起こりうる問題の全容を十分に理解していなかった。あなたの前に、それらのすべてが指示なしで動作しました。
EA変換の簡潔な例は、ライブラリの説明だけでなく、その議論 - コメントの中にもあります(そこではさらに明確)。
ilan1_4_strict.mq4のおかげですべてがうまくいきましたが、私のEAは75のエラーを出しました。エラーはこのようなものです:
ilan1_4_strict.mq4ではすべてうまくいったが、私のeaでは75のエラーが出た。エラーはこのようなものです:
少なくとも、グラフィックの部分を全部捨ててください。
なぜテスターにそれが必要なのですか?
少なくとも、グラフィックはすべて捨ててください。
なぜテスターに必要なんだ?
ilan1_4_strict.mq4ではすべてうまくいったが、私のeaでは75のエラーが出た。エラーはこのようなものです:
ディスカッションと説明文に次のような言葉があります。
この作業は注文システムにのみ 影響します。
MQL4コードが変更なしで MetaTrader 5で動作する場合、そのような完全なライブラリを作成する可能性についての疑問は解決されていません。
ご注意ください!
ライブラリはMT4Orders.mqhという1つのファイルだけに含まれています。その他のファイルはすべて、ライブラリの使用例として添付されています。これらのファイルはライブラリの使用には必要ありません。
MT4からMT5への移行中、最も困難な障害は新しい注文システムです。MT4Ordersはこの難関を完全に取り除きます。その他の違いはそれほどがっかりするものではありません。簡単に書き換えることができますし、このトピックに関する便利な参考データも あります。さて、ライブラリの作業の正しさは次のように実証された。
ピップス、ニュース、マーチン、マルチカレンシーなどです。
取引、自動取引システム、取引戦略のテストに関するフォーラム。
エラー、バグ、質問
fxsaber, 2016.10.20 15:54
#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>
// MT5標準ライブラリ経由 - MT5のみ
// SellLimitを設定し、SL/TPを設定する。
void MT5Order( const double Price )
{
CTrade Trade;
if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
Trade.SetTypeFilling(ORDER_FILLING_RETURN);
Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);
const ulong Ticket = Trade.ResultOrder();
if (Ticket > 0)
{
COrderInfo Order;
if (Order.Select(Ticket))
Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
}
}
#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006
// MT4-OSJS経由 - クロスプラットフォーム対応(MT4/5)
// SellLimitを設定し、SL/TPを設定する。
void MT4Order( const double Price )
{
const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}
void OnTick()
{
static bool FirstRun = true;
if (FirstRun)
{
const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
MT5Order(Price); // MT5標準ライブラリ経由 - MT5のみ
MT4Order(Price); // MT4-OSJS経由 - クロスプラットフォーム対応(MT4/5)
FirstRun = false;
}
}
黄色くハイライトされたMT4Order関数は、MT5Order関数と同じことを行います。どのフォーラムでも、黄色のコードはすぐに理解されますが、代替のMT5のコードは理解されません。
そして、MT5用にどのように書くかは、誰もが自分で決めます。例えば、私はMT4Ordersを使うし、まれに 純粋な(SBは機能が弱い)MQL5も使う。両方の書き方が並行して機能します。しかし、MT4Ordersだけで書くと、注文システムはクロスプラットフォームになります。そのため、私は両方のプラットフォームで変更なしに動作するコードを書く練習をしています。
だから、どちらのプラットフォームでも変わらないコードを書く練習をしているんだ。
取引、自動取引システム、取引戦略のテストに関するフォーラム
注文(MQL5)の最終決済価格を決定する方法は?
fxsaber, 2016.12.05 10:25 AM
void OnStart()
{
if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
Alert(OrderClosePrice());
}
{
int oldticket=0;
int Ticket=0;
ArrayResize(Mas_LOT,OrdersTotal(),3);
ArrayInitialize(Mas_LOT,0);
for(int i=0; i <= OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){
if (OrderSymbol()==Symbol()&& OrderMagicNumber() == Magik){
Mas_LOT[i][0] = OrderTicket();
Mas_LOT[i][1] = OrderLots();
Mas_LOT[i][2] = OrderType();
Mas_LOT[i][3] = (OrderProfit() + OrderSwap() + OrderCommission());
Mas_LOT[i][4] = OrderStopLoss();
Mas_LOT[i][5] = OrderOpenPrice();
Mas_LOT[i][6] = OrderTakeProfit();
}}}}
MT4Orders.mqhライブラリを使用してMT5用に変換する方法
取引、自動取引システム、取引戦略のテストに関するフォーラム
MetaTrader 5ビルド1525の新バージョン:ポジション形式での履歴の提示とテスターの改善
fxsaber, 2017.01.27 19:20
クロスプラットフォームスクリプトの実行
#property strict
#include <MT4Orders.mqh>
void OnStart()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick) && (OrdersTotal() == 0) &&
(OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0) > 0))
{
const double Lots[] = {0.6, 0.3, 0.1};
for (int i = 0; i < ArraySize(Lots); i++)
if (OrderSelect(0, SELECT_BY_POS) && SymbolInfoTick(_Symbol, Tick))
OrderClose(OrderTicket(), Lots[i], Tick.bid, 0);
const int Total = OrdersHistoryTotal();
for (int i = 0; i < Total; i++)
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
OrderPrint();
}
}
まずはMT5-Hedgeで。このような素敵なMT4プリントアウト
#114769087 2017.01.27 19:57:25 buy 0.60 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -5.40 0
#114769088 2017.01.27 19:57:25 buy 0.30 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -2.70 0
#114769089 2017.01.27 19:57:25 buy 0.10 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:26 1.06829 0.00 0.00 -0.90 0
クラシックレポート
確認として、同じスクリプトをMT4で実行する。
クラシックMT4レポート
スクリプトログのプリントアウト
#170039287 2017.01.27 20:00:57 buy 0.60 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:57 1.06836 0.00 0.00 -10.80 to #170039289 0
#170039289 2017.01.27 20:00:57 buy 0.30 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -5.40 to #170039290 0
#170039290 2017.01.27 20:00:57 buy 0.10 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -1.80 from #170039289 0
MT4とMT5のスクリプトログが一致していることがよくわかります。
ZY スクリプトのロジックがSB経由でMT5用に書かれている場合、スクリプトは正しく動作しません。一般的に、このような単純なMQL4のロジックをMT5用に書くのは難しいとさえ言えます。
シンボルとmajicによる選択は動作しません
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}
OrderSelectが 動作しない注文(インデックスによるチケット)を選択して動作しません。