ライブラリ: MT4Orders - ページ 11 1...456789101112131415161718...95 新しいコメント fxsaber 2017.02.08 11:01 #101 Aliaksandr Kryvanos: なるほど、GetLastError() にトレードサーバーのエラーも出力させる方法を教えてください。ありがとうございます。 OrdersTotalが実装されているのと同じラインです。おそらく拡張GetLastErrorを 書きます。そしてGetLastTradeRequest()とGetLastTradeResult()も。 fxsaber 2017.02.08 14:16 #102 fxsaber: おそらく、拡張GetLastErrorを書くことになるだろう。そしてGetLastTradeRequest()とGetLastTradeResult()も。GetLastErrorを研究した 結果、補足するのは不都合だという結論に達した。確認後、アップデートが利用可能になります。// 変更リスト:// 08.02.2017:// 追加: MT4ORDERS::LastTradeRequest および MT4ORDERS::LastTradeResult 変数には、対応する MT5-OrderSend データが含まれます。これで、MT5-OrderSend データをすべて受信できるようになりました。 fxsaber 2017.02.08 14:19 #103 // このスクリプトを使用すると、MT5-OrderSend で MT5 準拠の MT4-analogue MqlTradeRequest-request を形成する方法をすばやく把握できます。#define TOSTRING(A) #A + " = " + (string)(A) + "\n"#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"string ToString( const MqlTradeRequest &Request ){ return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) + TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) + TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) + TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) + TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) + TOSTRING(Request.position) + TOSTRING(Request.position_by));}string ToString( const MqlTradeResult &Result ){ return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) + TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) + TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) + TOSTRING(Result.retcode_external));}#include <MT4Orders.mqh>#define PRINT(A) A; Print(#A + "\n" + ToString(MT4ORDERS::LastTradeRequest) + ToString(MT4ORDERS::LastTradeResult));#define Point _Point #define Bid (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)) #define Ask (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK))void OnStart(){ Print(TOSTRING(AccountInfoString(ACCOUNT_SERVER))); // オープンポジション const int TicketPosition = PRINT(OrderSend(NULL, OP_BUY, 1, Ask, 100, 0, 0, "My Position")) if (OrderSelect(TicketPosition, SELECT_BY_TICKET)) { // SL/TPの設定 PRINT(OrderModify(OrderTicket(), OrderOpenPrice(), Bid - 100 * Point, Bid + 100 * Point, 0)) // ポジションをクローズ PRINT(OrderClose(OrderTicket(), OrderLots(), Bid, 100)) } // 保留注文を設定する const int TicketOrder = PRINT(OrderSend(NULL, OP_BUYLIMIT, 1, Ask - 100 * Point, 100, 0, 0, "My Order")) if (OrderSelect(TicketOrder, SELECT_BY_TICKET)) { // 令状は削除された PRINT(OrderDelete(OrderTicket())) }} mql5言語の特徴、微妙なニュアンスとテクニック Unsupported filling mode MetaEditor build 1490 削除済み 2017.02.09 18:40 #104 最高です。 fxsaber 2017.02.10 12:01 #105 スクリプト作業の結果AccountInfoString(ACCOUNT_SERVER) = FXOpen-MT5OrderSend(NULL,OP_BUY,1,Ask,100,0,0,My Position) Request.action = TRADE_ACTION_DEAL (1) Request.magic = 0 Request.order = 0 Request.symbol = EURUSD Request.volume = 1.0 Request.price = 1.06455 Request.stoplimit = 0.0 Request.sl = 0.0 Request.tp = 0.0 Request.deviation = 100 Request.type = ORDER_TYPE_BUY (0) Request.type_filling = ORDER_FILLING_IOC (1) Request.type_time = ORDER_TIME_GTC (0) Request.expiration = 1970.01.01 00:00:00 Request.comment = My Position Request.position = 0 Request.position_by = 0 Result.retcode = 10009 Result.deal = 9320 Result.order = 57775 Result.volume = 1.0 Result.price = 0.0 Result.bid = 0.0 Result.ask = 0.0 Result.comment = My Position Result.request_id = 589 Result.retcode_external = 0OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-100*Point,OrderOpenPrice()+100*Point,0) Request.action = TRADE_ACTION_SLTP (6) Request.magic = 0 Request.order = 0 Request.symbol = EURUSD Request.volume = 0.0 Request.price = 0.0 Request.stoplimit = 0.0 Request.sl = 1.06355 Request.tp = 1.06555 Request.deviation = 0 Request.type = ORDER_TYPE_BUY (0) Request.type_filling = ORDER_FILLING_FOK (0) Request.type_time = ORDER_TIME_GTC (0) Request.expiration = 1970.01.01 00:00:00 Request.comment = Request.position = 57775 Request.position_by = 0 Result.retcode = 10009 Result.deal = 0 Result.order = 0 Result.volume = 1.0 Result.price = 0.0 Result.bid = 0.0 Result.ask = 0.0 Result.comment = Request executed Result.request_id = 590 Result.retcode_external = 0OrderClose(OrderTicket(),OrderLots(),Bid,100) Request.action = TRADE_ACTION_DEAL (1) Request.magic = 0 Request.order = 0 Request.symbol = EURUSD Request.volume = 1.0 Request.price = 1.0645 Request.stoplimit = 0.0 Request.sl = 0.0 Request.tp = 0.0 Request.deviation = 100 Request.type = ORDER_TYPE_SELL (1) Request.type_filling = ORDER_FILLING_IOC (1) Request.type_time = ORDER_TIME_GTC (0) Request.expiration = 1970.01.01 00:00:00 Request.comment = Request.position = 57775 Request.position_by = 0 Result.retcode = 10009 Result.deal = 9321 Result.order = 57776 Result.volume = 1.0 Result.price = 0.0 Result.bid = 0.0 Result.ask = 0.0 Result.comment = Request executed Result.request_id = 591 Result.retcode_external = 0OrderSend(NULL,OP_BUYLIMIT,1,Ask-100*Point,100,0,0,My Order) Request.action = TRADE_ACTION_PENDING (5) Request.magic = 0 Request.order = 0 Request.symbol = EURUSD Request.volume = 1.0 Request.price = 1.06356 Request.stoplimit = 0.0 Request.sl = 0.0 Request.tp = 0.0 Request.deviation = 100 Request.type = ORDER_TYPE_BUY_LIMIT (2) Request.type_filling = ORDER_FILLING_IOC (1) Request.type_time = ORDER_TIME_GTC (0) Request.expiration = 1970.01.01 00:00:00 Request.comment = My Order Request.position = 0 Request.position_by = 0 Result.retcode = 10009 Result.deal = 0 Result.order = 57777 Result.volume = 1.0 Result.price = 1.06356 Result.bid = 0.0 Result.ask = 0.0 Result.comment = My Order Result.request_id = 592 Result.retcode_external = 0OrderDelete(OrderTicket()) Request.action = TRADE_ACTION_REMOVE (8) Request.magic = 0 Request.order = 57777 Request.symbol = Request.volume = 0.0 Request.price = 0.0 Request.stoplimit = 0.0 Request.sl = 0.0 Request.tp = 0.0 Request.deviation = 0 Request.type = ORDER_TYPE_BUY (0) Request.type_filling = ORDER_FILLING_FOK (0) Request.type_time = ORDER_TIME_GTC (0) Request.expiration = 1970.01.01 00:00:00 Request.comment = Request.position = 0 Request.position_by = 0 Result.retcode = 10009 Result.deal = 0 Result.order = 57777 Result.volume = 1.0 Result.price = 1.06356 Result.bid = 0.0 Result.ask = 0.0 Result.comment = My Order Result.request_id = 593 Result.retcode_external = 0 これで、MT5で適切な取引要求を 正しく生成する方法を理解するのは簡単です。 Errors, bugs, questions エラー、バグ、質問 MetaEditor build 1490 fxsaber 2017.02.12 09:55 #106 変換のもう一つの例 取引、自動取引システム、取引戦略のテストに関するフォーラム エキスパートアドバイザー:NewMartin fxsaber, 2017.02.12 09:54. クロスプラットフォームの変種。 fxsaber 2017.02.16 15:16 #107 // スクリプトは、MT5 の主なタイプの取引注文の処理速度特性をチェックします。#define TOSTRING(A) #A + " = " + (string)(A) + "\n"#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"string ToString( const MqlTradeRequest &Request ){ return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) + TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) + TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) + TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) + TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) + TOSTRING(Request.position) + TOSTRING(Request.position_by));}string ToString( const MqlTradeResult &Result ){ return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) + TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) + TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) + TOSTRING(Result.retcode_external));}ENUM_DAY_OF_WEEK GetDayOfWeek( const datetime time ){ MqlDateTime sTime = {0}; ::TimeToStruct(time, sTime); return((ENUM_DAY_OF_WEEK)sTime.day_of_week);}bool SessionTrade( const string Symb ){ datetime TimeNow = ::TimeTradeServer(); const ENUM_DAY_OF_WEEK DayOfWeek = GetDayOfWeek(TimeNow); TimeNow %= 24 * 60 * 60; bool Res = false; datetime From, To; for (int i = 0; (!Res) && ::SymbolInfoSessionTrade(Symb, DayOfWeek, i, From, To); i++) Res = ((From <= TimeNow) && (TimeNow < To)); return(Res);}bool SymbolTrade( const string Symb ){ MqlTick Tick; return(::SymbolInfoTick(Symb, Tick) ? ((Tick.bid != 0) && (Tick.ask != 0) && SessionTrade(Symb) && ((ENUM_SYMBOL_TRADE_MODE)::SymbolInfoInteger(Symb, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL)) : false);}#define MT4ORDERS_BENCHMARK Alert(MT4ORDERS::LastTradeRequest.symbol + " " + \ (string)MT4ORDERS::LastTradeResult.order + " " + \ MT4ORDERS::LastTradeResult.comment); \ Print(ToString(MT4ORDERS::LastTradeRequest) + \ ToString(MT4ORDERS::LastTradeResult));#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006#define Point (SymbolInfoDouble(Symb, SYMBOL_POINT))#define Bid (SymbolInfoDouble(Symb, SYMBOL_BID))#define Ask (SymbolInfoDouble(Symb, SYMBOL_ASK))void Benchmark( string Symb = NULL, uint LimitOffset = 1000 ){ if (Symb == NULL) Symb = _Symbol; if (SymbolTrade(Symb)) { const bool DemoAccount = ((ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_DEMO); const double MinLot = SymbolInfoDouble(Symb, SYMBOL_VOLUME_MIN); const uint StopLevel = (uint)SymbolInfoInteger(Symb, SYMBOL_TRADE_STOPS_LEVEL); if (StopLevel != 0) LimitOffset = StopLevel; if (DemoAccount && OrderSelect(OrderSend(Symb, OP_BUY, MinLot, Ask, 100, 0, 0, __FUNCTION__ + "_Position"), SELECT_BY_TICKET)) { OrderModify(OrderTicket(), OrderOpenPrice(), 0, Bid + LimitOffset * Point, 0); OrderClose(OrderTicket(), OrderLots(), Bid, 100); } double PriceMin = SymbolInfoDouble(Symb, SYMBOL_SESSION_PRICE_LIMIT_MIN); if (PriceMin < Point) PriceMin = MathMax(Ask - LimitOffset * Point, Point); if ((PriceMin < Ask) && OrderSelect(OrderSend(Symb, OP_BUYLIMIT, MinLot, PriceMin, 100, 0, 0, __FUNCTION__ + "_Order"), SELECT_BY_TICKET) && (!OrderDelete(OrderTicket())) && (!DemoAccount)) { Alert("OrderDelete ERROR, Check Now!"); ExpertRemove(); } }}void OnStart(){ if ((ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_DEMO) // 本物をチェックしたい場合はコメントアウトしてください。 { Alert(TOSTRING(AccountInfoString(ACCOUNT_SERVER))); Alert(TOSTRING(TerminalInfoInteger(TERMINAL_PING_LAST))); while (!IsStopped()) for (int i = SymbolsTotal(true) - 1; (i >= 0) && (!IsStopped()); i--) Benchmark(SymbolName(i, true)); }}このスクリプトの助けを借りて、私はMT5での実行の問題を見つけることができました。ターミナル+トレーディングサーバーをチェックし、問題があればサービスデスクに報告することをお勧めします。 mql5言語の特徴、微妙なニュアンスとテクニック エラー、バグ、質問 Features of the mql5 削除済み 2017.02.17 09:47 #108 fxsaber:このスクリプトの助けを借りて、私はMT5での実行の問題を見つけることができました。ターミナル+トレーディングサーバーをチェックし、問題があればサービスデスクに報告することをお勧めします。 I.e.ビルド1533では、result.comment? fxsaber 2017.02.17 10:04 #109 Alexey Kozitsyn: では、ビルド1533はすでにresult.commentに遅延情報を与えているのか?いいえ、これはライブラリによって行われます。2つ目の数字は、OrderSendの実行後(OnTradeTransactionの 対応するイベントを受信してから)、注文(取引)の履歴を同期するのにかかる時間です。スクリーンショットでは、この数値は 28 ミリ秒に達しています。SD もこの問題に対処しています。MT5がこのストレステストを問題なくパスすれば、それは非常に良いことです。皆さんもMT5をテストしてみてください。 fxsaber 2017.03.30 14:57 #110 取引、自動取引システム、取引戦略のテストに関するフォーラム スクリプト: CloseAllPositions fxsaber, 2017.03.30 14:11 // MQL4&5コード #property script_show_inputs #include <MT4Orders.mqh> sinput int RTOTAL = 4; // 失敗したトランザクションの繰り返し回数 sinput int SLEEPTIME = 1; // 繰り返し間のポーズ時間(秒 sinput int Deviation_ = 10; // 価格偏差 sinput bool exAllSymbols = false; // false - 現在の文字のみ、true - すべての文字 #define _CS(A) ((!IsStopped()) && (A)) bool CloseAllPositions( const bool AllSymbols = true, const int Slippage = 0 ) { bool Res = true; MqlTick Tick; for (int i = OrdersTotal() - 1; _CS(i >= 0); i--) if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (AllSymbols ? true : (OrderSymbol() == Symbol())) && SymbolInfoTick(OrderSymbol(), Tick)) Res &= OrderClose(OrderTicket(), OrderLots(), (OrderType() == OP_BUY) ? Tick.bid : Tick.ask, Slippage); return(Res); } void OnStart() { for (int i = 0; _CS((i < RTOTAL) && (!CloseAllPositions(exAllSymbols, Deviation_))); i++) Sleep(SLEEPTIME * 1000); } 1...456789101112131415161718...95 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
なるほど、GetLastError() にトレードサーバーのエラーも出力させる方法を教えてください。ありがとうございます。
おそらく、拡張GetLastErrorを書くことになるだろう。そしてGetLastTradeRequest()とGetLastTradeResult()も。
GetLastErrorを研究した 結果、補足するのは不都合だという結論に達した。
確認後、アップデートが利用可能になります。
// 08.02.2017:
// 追加: MT4ORDERS::LastTradeRequest および MT4ORDERS::LastTradeResult 変数には、対応する MT5-OrderSend データが含まれます。
これで、MT5-OrderSend データをすべて受信できるようになりました。
#define TOSTRING(A) #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"
string ToString( const MqlTradeRequest &Request )
{
return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) +
TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
TOSTRING(Request.position) + TOSTRING(Request.position_by));
}
string ToString( const MqlTradeResult &Result )
{
return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
TOSTRING(Result.retcode_external));
}
#include <MT4Orders.mqh>
#define PRINT(A) A; Print(#A + "\n" + ToString(MT4ORDERS::LastTradeRequest) + ToString(MT4ORDERS::LastTradeResult));
#define Point _Point
#define Bid (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID))
#define Ask (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK))
void OnStart()
{
Print(TOSTRING(AccountInfoString(ACCOUNT_SERVER)));
// オープンポジション
const int TicketPosition = PRINT(OrderSend(NULL, OP_BUY, 1, Ask, 100, 0, 0, "My Position"))
if (OrderSelect(TicketPosition, SELECT_BY_TICKET))
{
// SL/TPの設定
PRINT(OrderModify(OrderTicket(), OrderOpenPrice(), Bid - 100 * Point, Bid + 100 * Point, 0))
// ポジションをクローズ
PRINT(OrderClose(OrderTicket(), OrderLots(), Bid, 100))
}
// 保留注文を設定する
const int TicketOrder = PRINT(OrderSend(NULL, OP_BUYLIMIT, 1, Ask - 100 * Point, 100, 0, 0, "My Order"))
if (OrderSelect(TicketOrder, SELECT_BY_TICKET))
{
// 令状は削除された
PRINT(OrderDelete(OrderTicket()))
}
}
OrderSend(NULL,OP_BUY,1,Ask,100,0,0,My Position)
Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.06455
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 100
Request.type = ORDER_TYPE_BUY (0)
Request.type_filling = ORDER_FILLING_IOC (1)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = My Position
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 9320
Result.order = 57775
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = My Position
Result.request_id = 589
Result.retcode_external = 0
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-100*Point,OrderOpenPrice()+100*Point,0)
Request.action = TRADE_ACTION_SLTP (6)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 0.0
Request.price = 0.0
Request.stoplimit = 0.0
Request.sl = 1.06355
Request.tp = 1.06555
Request.deviation = 0
Request.type = ORDER_TYPE_BUY (0)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment =
Request.position = 57775
Request.position_by = 0
Result.retcode = 10009
Result.deal = 0
Result.order = 0
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = Request executed
Result.request_id = 590
Result.retcode_external = 0
OrderClose(OrderTicket(),OrderLots(),Bid,100)
Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.0645
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 100
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_IOC (1)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment =
Request.position = 57775
Request.position_by = 0
Result.retcode = 10009
Result.deal = 9321
Result.order = 57776
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = Request executed
Result.request_id = 591
Result.retcode_external = 0
OrderSend(NULL,OP_BUYLIMIT,1,Ask-100*Point,100,0,0,My Order)
Request.action = TRADE_ACTION_PENDING (5)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.06356
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 100
Request.type = ORDER_TYPE_BUY_LIMIT (2)
Request.type_filling = ORDER_FILLING_IOC (1)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = My Order
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 0
Result.order = 57777
Result.volume = 1.0
Result.price = 1.06356
Result.bid = 0.0
Result.ask = 0.0
Result.comment = My Order
Result.request_id = 592
Result.retcode_external = 0
OrderDelete(OrderTicket())
Request.action = TRADE_ACTION_REMOVE (8)
Request.magic = 0
Request.order = 57777
Request.symbol =
Request.volume = 0.0
Request.price = 0.0
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_BUY (0)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment =
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 0
Result.order = 57777
Result.volume = 1.0
Result.price = 1.06356
Result.bid = 0.0
Result.ask = 0.0
Result.comment = My Order
Result.request_id = 593
Result.retcode_external = 0
取引、自動取引システム、取引戦略のテストに関するフォーラム
エキスパートアドバイザー:NewMartin
fxsaber, 2017.02.12 09:54.
クロスプラットフォームの変種。
#define TOSTRING(A) #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"
string ToString( const MqlTradeRequest &Request )
{
return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) + TOSTRING(Request.tp) +
TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
TOSTRING(Request.position) + TOSTRING(Request.position_by));
}
string ToString( const MqlTradeResult &Result )
{
return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
TOSTRING(Result.retcode_external));
}
ENUM_DAY_OF_WEEK GetDayOfWeek( const datetime time )
{
MqlDateTime sTime = {0};
::TimeToStruct(time, sTime);
return((ENUM_DAY_OF_WEEK)sTime.day_of_week);
}
bool SessionTrade( const string Symb )
{
datetime TimeNow = ::TimeTradeServer();
const ENUM_DAY_OF_WEEK DayOfWeek = GetDayOfWeek(TimeNow);
TimeNow %= 24 * 60 * 60;
bool Res = false;
datetime From, To;
for (int i = 0; (!Res) && ::SymbolInfoSessionTrade(Symb, DayOfWeek, i, From, To); i++)
Res = ((From <= TimeNow) && (TimeNow < To));
return(Res);
}
bool SymbolTrade( const string Symb )
{
MqlTick Tick;
return(::SymbolInfoTick(Symb, Tick) ? ((Tick.bid != 0) && (Tick.ask != 0) && SessionTrade(Symb) &&
((ENUM_SYMBOL_TRADE_MODE)::SymbolInfoInteger(Symb, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL)) : false);
}
#define MT4ORDERS_BENCHMARK Alert(MT4ORDERS::LastTradeRequest.symbol + " " + \
(string)MT4ORDERS::LastTradeResult.order + " " + \
MT4ORDERS::LastTradeResult.comment); \
Print(ToString(MT4ORDERS::LastTradeRequest) + \
ToString(MT4ORDERS::LastTradeResult));
#include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006
#define Point (SymbolInfoDouble(Symb, SYMBOL_POINT))
#define Bid (SymbolInfoDouble(Symb, SYMBOL_BID))
#define Ask (SymbolInfoDouble(Symb, SYMBOL_ASK))
void Benchmark( string Symb = NULL, uint LimitOffset = 1000 )
{
if (Symb == NULL)
Symb = _Symbol;
if (SymbolTrade(Symb))
{
const bool DemoAccount = ((ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_DEMO);
const double MinLot = SymbolInfoDouble(Symb, SYMBOL_VOLUME_MIN);
const uint StopLevel = (uint)SymbolInfoInteger(Symb, SYMBOL_TRADE_STOPS_LEVEL);
if (StopLevel != 0)
LimitOffset = StopLevel;
if (DemoAccount && OrderSelect(OrderSend(Symb, OP_BUY, MinLot, Ask, 100, 0, 0, __FUNCTION__ + "_Position"), SELECT_BY_TICKET))
{
OrderModify(OrderTicket(), OrderOpenPrice(), 0, Bid + LimitOffset * Point, 0);
OrderClose(OrderTicket(), OrderLots(), Bid, 100);
}
double PriceMin = SymbolInfoDouble(Symb, SYMBOL_SESSION_PRICE_LIMIT_MIN);
if (PriceMin < Point)
PriceMin = MathMax(Ask - LimitOffset * Point, Point);
if ((PriceMin < Ask) &&
OrderSelect(OrderSend(Symb, OP_BUYLIMIT, MinLot, PriceMin, 100, 0, 0, __FUNCTION__ + "_Order"), SELECT_BY_TICKET) &&
(!OrderDelete(OrderTicket())) && (!DemoAccount))
{
Alert("OrderDelete ERROR, Check Now!");
ExpertRemove();
}
}
}
void OnStart()
{
if ((ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE) == ACCOUNT_TRADE_MODE_DEMO) // 本物をチェックしたい場合はコメントアウトしてください。
{
Alert(TOSTRING(AccountInfoString(ACCOUNT_SERVER)));
Alert(TOSTRING(TerminalInfoInteger(TERMINAL_PING_LAST)));
while (!IsStopped())
for (int i = SymbolsTotal(true) - 1; (i >= 0) && (!IsStopped()); i--)
Benchmark(SymbolName(i, true));
}
}
このスクリプトの助けを借りて、私はMT5での実行の問題を見つけることができました。ターミナル+トレーディングサーバーをチェックし、問題があればサービスデスクに報告することをお勧めします。
このスクリプトの助けを借りて、私はMT5での実行の問題を見つけることができました。ターミナル+トレーディングサーバーをチェックし、問題があればサービスデスクに報告することをお勧めします。
では、ビルド1533はすでにresult.commentに遅延情報を与えているのか?
いいえ、これはライブラリによって行われます。
2つ目の数字は、OrderSendの実行後(OnTradeTransactionの 対応するイベントを受信してから)、注文(取引)の履歴を同期するのにかかる時間です。
スクリーンショットでは、この数値は 28 ミリ秒に達しています。SD もこの問題に対処しています。
MT5がこのストレステストを問題なくパスすれば、それは非常に良いことです。皆さんもMT5をテストしてみてください。
取引、自動取引システム、取引戦略のテストに関するフォーラム
スクリプト: CloseAllPositions
fxsaber, 2017.03.30 14:11