// Пример неправильного считывания торгового окружения на каждом тике// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.#include <Trade/Trade.mqh>
// Возвращает количество позиций по символуint GetAmountPositions( conststring Symb )
{
int Res = 0;
// Этот MQL5-код с ошибкойfor (int i = PositionsTotal() - 1; i >= 0; i--)
if (PositionGetSymbol(i) == Symb)
Res++;
/*
// В MT4 такой код выполняется без ошибки
for (int i = OrdersTotal() - 1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
Res++;
*/return(Res);
}
// Пример OnTickvoid ExampleOnTick()
{
static CTrade Trade;
// Если нет позиции, открываемif (!GetAmountPositions(_Symbol))
Trade.Buy(1);
}
// Эмуляция прихода двух Tick-событийvoidOnStart()
{
ExampleOnTick();
Sleep(10); // Между двумя тиками ~10 мс.
ExampleOnTick();
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//....int total=0; // для расчета количества открытых советником позиций//....//--- main cyclefor(int i=PositionsTotal()-1;i>=0;i--)
if(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
total++; // расчет количества открытых позиций//....if(total==0) // Если нет открытых советником позиций
{
if(!RefreshRates())
{
PrevBars=iTime(1);
return;
}
//--- open BUY if(MACD_MAIN_2>MACD_SIGNAL_2 && MACD_MAIN_4<MACD_SIGNAL_4) // Сигнал на покупку
{
double sl=(InpStopLoss!=0)?m_symbol.Ask()-ExtStopLoss:0.0;
double tp=(InpTakeProfit!=0)?m_symbol.Ask()+ExtTakeProfit:0.0;
OpenBuy(sl,tp); // Отправка маркет-ордера на покупкуreturn;
}
//--- open SELLif(MACD_MAIN_2<MACD_SIGNAL_2 && MACD_MAIN_4>MACD_SIGNAL_4) // Сигнал на продажу
{
double sl=(InpStopLoss!=0)?m_symbol.Bid()+ExtStopLoss:0.0;
double tp=(InpTakeProfit!=0)?m_symbol.Bid()-ExtTakeProfit:0.0;
OpenSell(sl,tp); // Отправка маркет-ордера на продажу
}
}
return;
}
При поступлении сигнала противоположная позиция закрывается. Также советник может закрывать половину позиции (параметр Profit for closing half of the position), может переводить позицию в безубыток (параметр Breakeven). Размер открываемой позиции может задавать вручную (параметр Lots) или в процентах риска от свободной маржи (параметр Risk in...
关于交易、自动交易系统和交易策略测试的论坛
如何识别图表的替换?
fxsaber, 2018.02.08 12:39
某些函数中的ChartID输入参数为零,不会导致数值的重新计算。如果你想要当前图表的实际数据,你需要使用完整的ID。
关于交易、自动交易系统和策略测试的论坛
position_ticket != position_identifier
fxsaber, 2018.02.12 20:14
结论
如果我们假设这是正常的MT5行为,而不是经纪人黑客的特殊性,那么
弱点
ZZY 完全证实的假说。
关于交易、自动交易系统和交易策略测试的论坛
position_ticket != position_identifier
Pavel Kolchin, 2018.02.12 13:31
(不确定,很难检查,类似于部分位置关闭)
这一切都像这样运作。
1) 挂单被部分触发 - Position_ID = Order_Ticket1的头寸被打开
2)剩余的订单形成一个新的订单Order_Ticket2 并等待执行;新的Order_Ticket2 !=Order_Ticket1,因为在历史上不可能有两个相同的Order_Ticket订单。
3) 剩余的订单已被执行 - 开立一个Position_ID = Order_Ticket2的头寸。
在历史上有两个订单,在终端有两个位置,一切都对应着
关于交易、自动交易系统和测试交易策略的论坛
关于 "交易者的生活秘诀:将ForEach混入定义中(#define)"的讨论
fxsaber, 2018.02.14 10:54
绩效评估
结果
我完全错了!SymbolInfoDouble的速度是SymbolInfoTick的两倍。
关于交易、自动交易系统和交易策略测试的论坛
关于 "交易者的生活秘诀:将ForEach混入定义中(#define)"的讨论
fxsaber, 2018.02.14 11:58
无能。测试结果。
在需要性能的地方(优化器),最好使用SymbolInfoDouble。在现实世界中,这没有什么区别。
ZZY功能速度测量应该在一个性能很重要的环境中进行测量--测试者。
关于交易、自动交易系统和交易策略测试的论坛
虫子,虫子,问题
fxsaber, 2018.02.12 23:10
在两个交易模拟服务器上手工开立BUY头寸
RoboForex-MetaTrader 5
FXOpen-MT5
相同颜色的线条表示相同的事情。然而,我们可以清楚地看到,它们的顺序是不同的。对于Robo来说,关于订单执行的信息是在交易执行后出现的。在公开的情况下,它是在前面的!由于这个原因,OrderSend返回幸运,但还没有交易。也就是说,我们得到了不同步的OrderSend与历史记录。
FXOpen-MT5的代码
结果
这种情况有如下解释
关于交易、自动交易系统和策略测试的论坛
虫子,虫子,问题
Rashid Umarov, 2018.02.15 06:25
如果一个订单被发送到外部交易系统,MetaTrader 5交易服务器不会等待它的响应,并立即将请求的结果返回为 "下单"。出于这个原因,OrderSend将总是返回deal=0,因为还没有关于已执行交易的信息。在OnTrade或OnTradeTransaction中抓住它。
在 创建MOEX交易机器人时从哪里开始- TradeTransactionListener.mq5一文中给出了一个交易事件监听器的例子。
OrderSend - 发送订单以执行市场交易。订单被放置- 我们需要读取Result.order。但没有人等待交易--可能有很多交易,而且执行的总时间也没有确定。
这取决于经纪人一方对输出的具体实现。在一般情况下,它没有被定义。
因此,我强烈建议使用FXOpen-MT5的模拟账户作为你的代码测试,因为它与其他模拟账户不同。
例如,我建议尝试在MQL5中写一个具有这样交易逻辑的脚本(MQL4风格仅用于快速感知显示)
这一点也不容易。我还推荐所提到的演示服务器来进行部分执行的工作。
删除了一个对MT5最常见错误之一进行解释的帖子。
这个帖子很大。没想到会被删除。我想听听删除的原因。因为再次被删除是受虐狂的表现。
关于交易、自动交易系统和测试交易策略的论坛
组织一个订单循环
fxsaber, 2018.02.16 09:40
在MT5中,事情进展得一点也不顺利。显示问题的例子
你认为如果你在一个没有位置的符号上运行这个脚本,最终会发生什么?
正确的答案是,将开设一个或两个职位。
发生这种情况的原因。在第一次OrderSend之后,出现了一个市场订单,如果在执行订单的时刻之前出现了一个新的tick,那么还没有头寸,就会进行第二次OrderSend。
正因为如此,一个看似正常的MT5模式 将无法正常工作,因此,codobase中的大多数MT5专家顾问。同时,几乎相同的MT4模板 将继续工作,没有任何问题。
在MT5中还需要分析市场订单的OrdersTotal,这让PositionsTotal这个看似不错的想法有些黯然失色。
要小心!
正因为如此,一个看似正常的MT5模式 将无法正常工作,因此,kodobase中的大多数MT5 EAs。
作为这一声明的证明,我们可以采取MT5 kodobase中几乎所有的专家顾问。我们不要挑三拣四,而是以目前最新的专家顾问 为例。很好的是,它是由一个在QB的MT5-出版方面有丰富经验的作者写的。
源代码中有以下字符串(我的评论被高亮显示)。
我们有一个与上述情况相同的情况。
关于交易、自动交易系统和策略测试的论坛
mql5语言的特殊性,技巧和窍门
fxsaber, 2018.02.16 19:52
在第一次OrderSend之后,出现了一个市场订单,如果在其执行之前出现了一个新的tick,那么就还没有头寸,就会进行第二次OrderSend。
在MT5中还需要分析市场订单的OrdersTotal,这让PositionsTotal这个看似不错的想法有些黯然失色。
这意味着,在一般情况下,专家顾问将打开两个、三个等,而不是一个位置。取决于接收点子的频率和执行市场订单的时间。
由于kodobase中几乎所有的MT5 EAs都是用与MT5模板 相同的逻辑编写的,它们也有相同的错误,这些错误包含在其中。不幸的是,KB中几乎所有的MT5 EAs都是如此。
在净值交易中,可以有一个未结头寸,同时在同一符号上有几个方向的市场订单。例如,一个买入头寸和一个买入订单。这是真的,我没有设法找到这样的模拟账户,因为到处都有异步的规则。
关于交易、自动交易系统和交易策略测试的论坛
虫子,虫子,问题
fxsaber, 2018.02.14 08:58
整个OnTradeTransaction 事件序列是在OrderSend完成之后。
EA
手动发送交易指令。
纪录
2018.02.14 09:41:46.671 '8854170': instant sell 1.00 EURUSD at 1.23673 2018.02.14 09:41:46.853 '8854170': accepted instant sell 1.00 EURUSD at 1.23673 2018.02.14 09:41:46.853 '8854170': deal #192088422 sell 1.00 EURUSD at 1.23673 done (based on order #208541700) 2018.02.14 09:41:46.853 '8854170': order #208541700 sell 1.00 / 1.00 EURUSD at 1.23673 done in 190.608 ms
专家顾问结果
我们完全可以从时间栏和EA的数字数据中看到,交易订单执行的时间对OnTradeTransaction事件的顺序没有影响。所有的异步都下地狱了!他们设法把事情搞得如此糟糕。建于1755年。
例如,当OrderSendAsync市场订单在终端放置时,市场订单甚至不会出现片刻。也许开发商决定这样做是为了加快事情的进展。
关于交易、自动交易系统和交易策略测试的论坛
讨论文章 "MetaTrader 5中交易策略优化的可视化"
fxsaber, 2018.02.22 08:39
在框架模式下,OnInit、OnDeinit、OnTick、OnTrade、OnTradeTransaction和OnTimer被忽略。只有OnChartEvent有效。
当然,由于OnChartEvent异常,它需要强制检查frame-mode标志。