如何在MT5中正确使用OrderSend? - 页 9 12345678910111213 新评论 fxsaber 2016.11.14 20:46 #81 prostotrader: https://www.mql5.com/ru/forum/97557/page4#comment_2891988 关于交易、自动交易系统和策略测试的论坛 如何在MT5中正确使用OrderSend? fxsaber, 2016.11.14 20:20 脚本 在这方面有问题。 Документация по MQL5: Программы MQL5 / Выполнение программ www.mql5.com Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5 prostotrader 2016.11.14 20:48 #82 fxsaber: 对不起,没有意愿去处理你的脚本由以下人员添加但有一个办法可以解决这个问题。由于OrderrSend()函数是同步的,在收到订单后,我们 确保历史记录在OnTradeTransaction()中是同步的。//+------------------------------------------------------------------+// Expert TradeTransaction function |//+------------------------------------------------------------------+void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { switch(trans.type) { case TRADE_TRANSACTION_ORDER_UPDATE: switch(trans.order_state) { case ORDER_STATE_PLACED: if(order_ticket==trans.order) { Print(__FUNCTION__," Order plased done. Ticket = ",trans.order); if(order_ticket>0) { if(OrderSelect(order_ticket)) { //Ордер синхронизирован с историей } else { Print(__FUNCTION__," Order not select! Ticket = ",trans.order); } } else { Print(__FUNCTION__," Wrong order ticket = ",trans.order); } } break; } break; } }而且不能跳舞! How to work correctly 堡垒。执法问题 我如何正确地开立市场订单? fxsaber 2016.11.15 12:04 #83 prostotrader:不要跳舞! 关于交易、自动交易系统和策略测试的论坛 如何在MT5中正确使用OrderSend? fxsaber, 2016.11.10 10:00 请注意,这是一个脚本,不可能有任何Event-over。唯一的出路是一个愚蠢的睡眠。如果你用SB重写这个脚本,什么也不会改变。 prostotrader 2016.11.15 12:11 #84 fxsaber: 你可以通过Sleep....,尽情地扭曲自己的想法。 fxsaber 2016.11.15 12:30 #85 prostotrader: 你可以随心所欲地搞砸睡眠....为什么要重复以前别人已经建议 和表达过的事情?该主题说的都是OnTradeTransaction可能出现的问题。特别是,它涉及同时操作多个专家顾问系统。人们在制作拐杖,这并不意味着他们不熟悉文档,不知道如何使用功能。OnTrade和OnTradeTransaction正是为此目的而开发的。当他们开始时,开发人员认为在一个账户中同时处理一个以上的专家顾问是很白痴的。好吧,他们在这方面错了。试着在你的专家顾问中编写以下函数i = 0.我们在符号[i]处开了一个头寸。如果i++>=5,我们退出。如果没有滑移,我们就回到第2步,如果有滑移,我们就退出。 prostotrader 2016.11.15 12:36 #86 fxsaber:为什么要重复以前别人已经建议 和表达过的事情?该主题说的都是OnTradeTransaction可能出现的问题。特别是,它涉及同时操作多个专家顾问系统。人们在制作拐杖,这并不意味着他们不熟悉文档,不知道如何使用功能。OnTrade和OnTradeTransaction正是为此目的而开发的。当他们开始时,开发人员认为在一个账户中同时处理一个以上的专家顾问是很愚蠢的。好吧,他们在这方面错了。试着在你的专家顾问中编写以下函数i = 0.我们在符号[i]处开了一个头寸。如果i++>=5,我们退出。如果没有滑移,我们就回到第2步,如果有滑移,我们就退出。目前,我有41个专家顾问在一个真实账户上工作(在一个终端中),在一个交易日中一起工作他们设置了2000个订单的开仓和平仓,我完全没有遇到任何困难!"。添加至于我们拥有的功能,应该是基于我们所拥有的,而不是基于我们 "需要 "的。开发人员,如果可能的话,修复bug和bug,考虑到的愿望是用户(尽管非常缓慢)。 我想他们很快也会处理OederSend()。 fxsaber 2016.11.15 13:14 #87 prostotrader:我的真实账户上有41个专家顾问(在一个终端),在一个交易日内全部工作。他们设置了2000个订单,开仓和平仓,我一点问题都没有!"。这就是所谓的偏离主题。当涉及到即使是最简单的逻辑。 关于交易、自动交易系统和测试交易策略的论坛 如何在MT5中正确使用OrderSend? fxsaber, 2016.11.15 13:30 尝试在你的EA中编写以下函数i = 0.在符号[i]上开立一个头寸。如果i++>=5,我们退出。如果新的头寸没有滑点,我们回到第二步。 如果有滑点,我们退出。 有人立即将其交易。// MQL4&5-code#property strict#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006void Func( const string &Symbols[] ){ const int Total = ArraySize(Symbols); for (int i = 0; i < Total; i++) { const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK); const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS); if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) || (NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // если не получилось открыть или есть проскальзывание - выходим break; }}void OnStart() // OnTick{ const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"}; Func(Symbols);} 还有人在等待开发商的法力。 我如何正确地开立市场订单? How do I open How to work correctly prostotrader 2016.11.15 19:18 #88 我已经说过,你可以随意扭曲它(每个人都有这个权利)。 Denis Sartakov 2016.11.17 18:26 #89 prostotrader:我已经说过,你可以随心所欲地扭曲(每个人都有这个权利)。那是很久以前的事了,但我记得这个人,嗯,这个fxsaber 创造了奇迹。他的代码仍然保存在MT4代码库中,他在WinInet上读取网站的代码仍然被很多程序员所使用...因此,在我看来,他不是一个变态...... fxsaber 2016.11.19 22:59 #90 从这里的库中翻出了OrderSendSync。uint OrderSend_MaxPause = 1000000; // максимальное время на синхронизацию в мкс.const bool IsTester = (::MQLInfoInteger(MQL_TESTER) || ::MQLInfoInteger(MQL_OPTIMIZATION) || ::MQLInfoInteger(MQL_VISUAL_MODE) || ::MQLInfoInteger(MQL_FRAME_MODE)); bool Waiting( const bool FlagInit = false ){ static ulong StartTime = 0; if (FlagInit) StartTime = ::GetMicrosecondCount(); const bool Res = (::GetMicrosecondCount() - StartTime < OrderSend_MaxPause); if (Res) ::Sleep(0); return(Res);}bool EqualPrices( const double Price1, const double Price2, const int digits){ return(::NormalizeDouble(Price1 - Price2, digits) == 0);}#define WHILE(A) while (!(Res = (A)) && Waiting())bool OrderSendSync( const MqlTradeRequest &Request, MqlTradeResult &Result ){ bool Res = ::OrderSend(Request, Result); if (Res && !IsTester && (Result.retcode < TRADE_RETCODE_ERROR) && (OrderSend_MaxPause > 0)) { Res = (Result.retcode == TRADE_RETCODE_DONE); Waiting(true); if (Request.action == TRADE_ACTION_DEAL) { WHILE(::HistoryOrderSelect(Result.order)) ; Res = Res && (((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_FILLED) || ((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_PARTIAL)); if (Res) WHILE(::HistoryDealSelect(Result.deal)) ; } else if (Request.action == TRADE_ACTION_PENDING) { if (Res) WHILE(::OrderSelect(Result.order)) ; else { WHILE(::HistoryOrderSelect(Result.order)) ; Res = false; } } else if (Request.action == TRADE_ACTION_SLTP) { if (Res) { bool EqualSL = false; bool EqualTP = false; const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS); if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position)) { EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits); EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits); } WHILE((EqualSL && EqualTP)) if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position)) { EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits); EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits); } } } else if (Request.action == TRADE_ACTION_MODIFY) { if (Res) { bool EqualSL = false; bool EqualTP = false; const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS); if (::OrderSelect(Result.order)) { EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits); EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits); } WHILE((EqualSL && EqualTP)) if (::OrderSelect(Result.order)) { EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits); EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits); } } } else if (Request.action == TRADE_ACTION_REMOVE) if (Res) WHILE(::HistoryOrderSelect(Result.order)) ; } return(Res);}#undef WHILE 代码的想法应该是明确的。我可能忽略了一些东西。我没有注意到操作中的任何错误。 MetaEditor build 1490 mql5语言的特点、微妙之处以及技巧 How to work correctly 12345678910111213 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
https://www.mql5.com/ru/forum/97557/page4#comment_2891988
关于交易、自动交易系统和策略测试的论坛
如何在MT5中正确使用OrderSend?
fxsaber, 2016.11.14 20:20
脚本 在这方面有问题。对不起,没有意愿去处理你的脚本
由以下人员添加
但有一个办法可以解决这个问题。
由于OrderrSend()函数是同步的,在收到订单后,我们
确保历史记录在OnTradeTransaction()中是同步的。
// Expert TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_ORDER_UPDATE:
switch(trans.order_state)
{
case ORDER_STATE_PLACED:
if(order_ticket==trans.order)
{
Print(__FUNCTION__," Order plased done. Ticket = ",trans.order);
if(order_ticket>0)
{
if(OrderSelect(order_ticket))
{
//Ордер синхронизирован с историей
}
else
{
Print(__FUNCTION__," Order not select! Ticket = ",trans.order);
}
}
else
{
Print(__FUNCTION__," Wrong order ticket = ",trans.order);
}
}
break;
}
break;
}
}
而且不能跳舞!
不要跳舞!
关于交易、自动交易系统和策略测试的论坛
如何在MT5中正确使用OrderSend?
fxsaber, 2016.11.10 10:00
请注意,这是一个脚本,不可能有任何Event-over。唯一的出路是一个愚蠢的睡眠。
如果你用SB重写这个脚本,什么也不会改变。
你可以随心所欲地搞砸睡眠....
为什么要重复以前别人已经建议 和表达过的事情?
该主题说的都是OnTradeTransaction可能出现的问题。特别是,它涉及同时操作多个专家顾问系统。
人们在制作拐杖,这并不意味着他们不熟悉文档,不知道如何使用功能。
OnTrade和OnTradeTransaction正是为此目的而开发的。当他们开始时,开发人员认为在一个账户中同时处理一个以上的专家顾问是很白痴的。
好吧,他们在这方面错了。
试着在你的专家顾问中编写以下函数
为什么要重复以前别人已经建议 和表达过的事情?
该主题说的都是OnTradeTransaction可能出现的问题。特别是,它涉及同时操作多个专家顾问系统。
人们在制作拐杖,这并不意味着他们不熟悉文档,不知道如何使用功能。
OnTrade和OnTradeTransaction正是为此目的而开发的。当他们开始时,开发人员认为在一个账户中同时处理一个以上的专家顾问是很愚蠢的。
好吧,他们在这方面错了。
试着在你的专家顾问中编写以下函数
目前,我有41个专家顾问在一个真实账户上工作(在一个终端中),在一个交易日中一起工作
他们设置了2000个订单的开仓和平仓,我完全没有遇到任何困难!"。
添加
至于我们拥有的功能,应该是基于我们所拥有的,而不是基于我们 "需要 "的。
开发人员,如果可能的话,修复bug和bug,考虑到的愿望是
用户(尽管非常缓慢)。
我想他们很快也会处理OederSend()。
我的真实账户上有41个专家顾问(在一个终端),在一个交易日内全部工作。
他们设置了2000个订单,开仓和平仓,我一点问题都没有!"。
这就是所谓的偏离主题。
当涉及到即使是最简单的逻辑。
关于交易、自动交易系统和测试交易策略的论坛
如何在MT5中正确使用OrderSend?
fxsaber, 2016.11.15 13:30
尝试在你的EA中编写以下函数
#property strict
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
void Func( const string &Symbols[] )
{
const int Total = ArraySize(Symbols);
for (int i = 0; i < Total; i++)
{
const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS);
if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) ||
(NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // если не получилось открыть или есть проскальзывание - выходим
break;
}
}
void OnStart() // OnTick
{
const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"};
Func(Symbols);
}
还有人在等待开发商的法力。
我已经说过,你可以随意扭曲它(每个人都有这个权利)。
我已经说过,你可以随心所欲地扭曲(每个人都有这个权利)。
那是很久以前的事了,但我记得这个人,嗯,这个fxsaber 创造了奇迹。
他的代码仍然保存在MT4代码库中,他在WinInet上读取网站的代码
仍然被很多程序员所使用...
因此,在我看来,他不是一个变态......
const bool IsTester = (::MQLInfoInteger(MQL_TESTER) || ::MQLInfoInteger(MQL_OPTIMIZATION) ||
::MQLInfoInteger(MQL_VISUAL_MODE) || ::MQLInfoInteger(MQL_FRAME_MODE));
bool Waiting( const bool FlagInit = false )
{
static ulong StartTime = 0;
if (FlagInit)
StartTime = ::GetMicrosecondCount();
const bool Res = (::GetMicrosecondCount() - StartTime < OrderSend_MaxPause);
if (Res)
::Sleep(0);
return(Res);
}
bool EqualPrices( const double Price1, const double Price2, const int digits)
{
return(::NormalizeDouble(Price1 - Price2, digits) == 0);
}
#define WHILE(A) while (!(Res = (A)) && Waiting())
bool OrderSendSync( const MqlTradeRequest &Request, MqlTradeResult &Result )
{
bool Res = ::OrderSend(Request, Result);
if (Res && !IsTester && (Result.retcode < TRADE_RETCODE_ERROR) && (OrderSend_MaxPause > 0))
{
Res = (Result.retcode == TRADE_RETCODE_DONE);
Waiting(true);
if (Request.action == TRADE_ACTION_DEAL)
{
WHILE(::HistoryOrderSelect(Result.order))
;
Res = Res && (((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_FILLED) ||
((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_PARTIAL));
if (Res)
WHILE(::HistoryDealSelect(Result.deal))
;
}
else if (Request.action == TRADE_ACTION_PENDING)
{
if (Res)
WHILE(::OrderSelect(Result.order))
;
else
{
WHILE(::HistoryOrderSelect(Result.order))
;
Res = false;
}
}
else if (Request.action == TRADE_ACTION_SLTP)
{
if (Res)
{
bool EqualSL = false;
bool EqualTP = false;
const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS);
if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position))
{
EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits);
EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits);
}
WHILE((EqualSL && EqualTP))
if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position))
{
EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits);
EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits);
}
}
}
else if (Request.action == TRADE_ACTION_MODIFY)
{
if (Res)
{
bool EqualSL = false;
bool EqualTP = false;
const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS);
if (::OrderSelect(Result.order))
{
EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits);
EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits);
}
WHILE((EqualSL && EqualTP))
if (::OrderSelect(Result.order))
{
EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits);
EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits);
}
}
}
else if (Request.action == TRADE_ACTION_REMOVE)
if (Res)
WHILE(::HistoryOrderSelect(Result.order))
;
}
return(Res);
}
#undef WHILE