程序库: MT4Orders - 页 55

 
fxsaber:

MT4Orders 是 MT5 中的 MT4 风格。因此,OrderSend 的行为与 MT4 相同。

是的,这部分是有效的,挂单票据会转到头寸票据,一切都会被修改,但并不是一直有效。在平仓 时,会出现 SL 或 TP 订单交易,而在平仓市场订单时,订单票上的检查不起作用。

真让我头疼。通过 SL 平仓。在测试器中,如果订单票为 3,则与交易票一致,最后一个选择器正常。如果是 2,则选择错误为 4754。在实际/演示中总是不一致。

Лог
2020.10.22 16:46:14.665 Trades  '25610628': accepted modify #745859775 sell 1 EURUSD sl: 1.18258, tp: 1.18197 -> sl: 1.18254, tp: 1.18194
2020.10.22 16:46:14.672 Trades  '25610628': modify #745859775 sell 1 EURUSD -> sl: 1.18254, tp: 1.18194 done in 129.694 ms
2020.10.22 16:48:06.783 Trades  '25610628': deal #725926213 buy 1 EURUSD at 1.18254 done (based on order #745887632)

// 检查位置是否关闭
if(OrderSelect(Tickets, SELECT_BY_TICKET)==true) //由 SL 关闭时,返回错误 4754。
        {
         if(OrderCloseTime()==0)              //替换 什么,如何知道该位置不在历史上
           {
            ModifyTral();
            return;
           }
         if(OrderCloseTime()!=0)              //然后替换它,发现该位置已成为历史
           {
            End=true;
            Alert("我们的市场订单已关闭。顾问的工作已经完成"。,
                  " 交换 = ", OrderSwap(), " 委员会 = ", OrderCommission()); // эта часть работает в тестере)))
            return;
           }
        }

Тикет ордера позиции не 3
LO      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:17   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 2 Or 0
ON      0       19:16:54.104    Trade   2018.07.02 00:10:19   stop loss triggered #2  buy 1 EURUSD 1.16771 sl: 1.16719 tp: 1.17241 [#4  sell 1 EURUSD at 1.16719]
LQ      0       19:16:54.104    Trades  2018.07.02 00:10:19   deal #3  sell 1 EURUSD at 1.16719 done (based on order #4)
 HN      0       19:16:54.104    Trade   2018.07.02 00:10:19   deal performed [#3  sell 1 EURUSD at 1.16719]
RI      0       19:16:54.104    Trade   2018.07.02 00:10:19   order performed sell 1 at 1.16719 [#4  sell 1 EURUSD at 1.16719]
FJ      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 2 Or 0
FI      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: OrderSelect() нашего рыночного ордера вернул ошибку - 4754
IQ      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: Или Наш рыночный ордер закрылся. время закрытия 1970.01.01 00:00:00 Tickets 2 Своп = 0.0 Комиссия = 0.0
KN      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:21   Alert: Работа эксперта завершена. Прибыль/убыток = 0.0



Тикет ордера-позиции 3
PF      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:36   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 3 Or 1
KH      0       19:21:30.198    Trade   2018.07.02 00:44:37   stop loss triggered #3  sell 1 EURUSD 1.16740 sl: 1.16800 tp: 1.16277 [#4  buy 1 EURUSD at 1.16800]
DN      0       19:21:30.198    Trades  2018.07.02 00:44:37   deal #3  buy 1 EURUSD at 1.16802 done (based on order #4)
 LJ      0       19:21:30.198    Trade   2018.07.02 00:44:37   deal performed [#3  buy 1 EURUSD at 1.16802]
EF      0       19:21:30.198    Trade   2018.07.02 00:44:37   order performed buy 1 at 1.16802 [#4  buy 1 EURUSD at 1.16800]
CL      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 3 Or 1
QJ      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Наш рыночный ордер закрылся. время закрытия 2018.07.02 00:44:37 Tickets 3 Своп = 0.0 Комиссия = 0.0
NE      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Работа эксперта завершена. Прибыль/убыток = -62.0

//当然是愚蠢的解决方案。

if(OrderSelect(Tickets, SELECT_BY_TICKET)==true)
        {
         if(OrderCloseTime()==0)              // 如果我们的市场订单没有关闭
           {
            ModifyTral();
            return;
           }
         if(OrderCloseTime()!=0)              // 如果我们的市场订单已关闭
           {
            End=true;
            Alert("我们的市场订单已关闭。 收盘时间。",OrderCloseTime(),"Tickets ",Tickets,
                  " 交换 = ", OrderSwap(), " 委员会 = ", OrderCommission());
            return;
           }
        }
      else
      {
            
         Alert("我们的市场订单的 OrderSelect() 返回错误 - ",GetLastError());
         
         End=true;
            Alert("或我们的市场订单已关闭。 关闭时间"。,OrderCloseTime(),"Tickets ",Tickets,
                  " 交换 = ", OrderSwap(), " 委员会 = ", OrderCommission());
            return;
     }
 
Valeriy Yastremskiy:

是的,这部分起作用了,挂单票据转到仓单票据,一切都被修改了,但并没有立即起作用。平仓 时,SL 或 TP 订单上会出现交易,而平仓市价订单票据上的时间检查不起作用。

打破了我的头。通过 SL 平仓。在测试器中,如果订单票为 3,则与交易票吻合,最后一个选择器正常。如果是 2,则选择错误为 4754。在实际/演示中总是不一致。

请提供您认为不起作用的 mq5 文件。你浪费了太多信息。这无助于理解您的意思。还是提供源代码吧。

 
fxsaber:

把你认为失效的 mq5 文件给我。你浪费了太多信息。它无助于理解你的意思。最好是源文件。

代码很乱,我很抱歉。

附加的文件:
 
Valeriy Yastremskiy:

代码很乱,我很抱歉。

下一次会更好的。

#include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static TICKET_TYPE Ticket = -1;
  
  if (Ticket == -1)
    Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Ask - 100 * _Point, 0);
  else if (!OrdersTotal())
  {
    Print(OrderSelect(Ticket, SELECT_BY_TICKET)); // true
    OrderPrint();
    
    Print(__MT4ORDERS__);
    
    ExpertRemove();
  }
}


结果。

2020.10.22 22:16:20.196 2020.10.21 00:03:10   market buy 1 EURAUD sl: 1.67661 (1.67664 / 1.67761)
2020.10.22 22:16:20.196 2020.10.21 00:03:10   deal #2  buy 1 EURAUD at 1.67761 done (based on order #2)
2020.10.22 22:16:20.196 2020.10.21 00:03:10   deal performed [#2  buy 1 EURAUD at 1.67761]
2020.10.22 22:16:20.196 2020.10.21 00:03:10   order performed buy 1 at 1.67761 [#2  buy 1 EURAUD at 1.67761]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   stop loss triggered #2  buy 1 EURAUD 1.67761 sl: 1.67661 [#3  sell 1 EURAUD at 1.67661]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   deal #3  sell 1 EURAUD at 1.67638 done (based on order #3)
2020.10.22 22:16:20.198 2020.10.21 00:12:59   deal performed [#3  sell 1 EURAUD at 1.67638]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   order performed sell 1 at 1.67638 [#3  sell 1 EURAUD at 1.67661]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   true
2020.10.22 22:16:20.198 2020.10.21 00:12:59   #3 2020.10.21 00:03:10.025 buy 1.00 EURAUD 1.67761 1.67661 0.00000 2020.10.21 00:12:59.874 1.67638 0.00 0.00 -123.00 sl 1.67661 0
2020.10.22 22:16:20.198 2020.10.21 00:12:59   2020.10.21
2020.10.22 22:16:20.198 2020.10.21 00:12:59   ExpertRemove() function called
 
fxsaber:

下次最好就事论事。


结果。

谢谢。

 
fxsaber:

下次最好就事论事。

结果。

找到原因了,旧版本的 MT4Orders 2018。有了它,再加上您的示例,把错误改成了最新版本,一切都正常了,我的代码也是如此)

谢谢。

 
Valeriy Yastremskiy:

找到原因了,MT4Orders 2018 的版本太旧。

遗憾的是,还没想出如何让用户在使用非最新版本的库时少走弯路。

 

在 RannForex MT5 上使用此库并设置 "以比当前价格差 N 个点的价格向市场发送限价订单 "修改限价订单时,如果有人突袭,ALT 将在此处飞出。

          WHILE((EqualSL && EqualTP && EqualPrice));

          if (!Res)
            ::Print("Line = " + (string)__LINE__ + "\n" + TOSTR(::OrderGetDouble(ORDER_SL)) + TOSTR(Request.sl)+
                    TOSTR(::OrderGetDouble(ORDER_TP)) + TOSTR(Request.tp) +
                    TOSTR(::OrderGetDouble(ORDER_PRICE_OPEN)) + TOSTR(Request.price) +
                    TOSTR(EqualSL) + TOSTR(EqualTP) + TOSTR(EqualPrice) +
                    TOSTR(::OrderSelect(Result.order)) +
                    TOSTR2((ENUM_ORDER_STATE)::OrderGetInteger(ORDER_STATE)));

这是因为 MT4Orders 看到已消失的订单已做标记,但经纪商立即将价格修正回来,而在请求订单参数时,价格已经不同了。因此,这似乎是一种功能。

 
traveller00:

如果有人突袭,在 RannForex MT5 上使用此库并设置为 "以比当前价格差 N 个点的价格向市场发送限价订单 "时,修改限价器后,Atter 将从以下位置飞出

这是因为 MT4Orders 看到已消失的订单已做标记,但经纪商会立即将价格修正回来,而在请求订单参数时,价格已经不同了。因此,这似乎是一项功能。

交易、自动交易系统和交易策略测试论坛。

库:MT4Orders

fxsaber, 2020.09.29 08:45 AM

用这样一行

MT4ORDERS::OrderSend_MaxPause = 0; // 禁用 MT5 订单发送验证。

可以禁用所有这些功能。如果MT5 交易历史记录变慢,这可能会有用,因为 MT4Orders 有时会通过访问历史记录来检查 MT5-OrderSend 的正确性(甚至纠正)。

我不建议这样做。

我使用此功能。
 

我有一个 MT4 EA,我正试图使用 MT4Orders 将其移植到 MT5,这样我就可以保持单一来源,但我遇到了一些问题......

1)当订单触及 SL 或 TP 时,如果 EA 在 OrderSend() 期间添加了注释,则通常的 [sl] 或 [tp] 文本不会附加到订单注释中。

这是 MT5 的正常行为吗?如果是,是否有可靠的方法来确定订单是否真的触及 SL/TP,还是被手动平仓?

(试图通过检查开盘价/收盘价/SL/TP 来决定是不可靠的,因为会出现滑点,尤其是当 SL 被移动到非常接近 TP 时)。

** 有趣的是,OrdersToString() 在注释中显示"[sl x.xxxxxx]",但订单历史选项卡不显示该信息(在策略测试器中,OrdersComment() 中也不包含该信息)。


2)当发生部分平仓时,开仓和平仓部分订单的注释不会显示 "to #xxxxxxxxxx "和 "from #xxxxxxxxxx "

,是否有可靠(希望简单)的方法来确定特定订单发生了什么?

3)未平仓交易的票据编号在平仓时会改变,因此我无法使用 OrderTicket() 来跟踪订单,但 OrderTicketID() 似乎可以像 MT4 中的 OrderTicket() 一样工作,并为平仓交易保留相同的 ID。

该值是恒定的,还是会在平台重启时发生变化?如果是恒定的,有什么好办法既能使用OrderTicketID(),又能保持与MT4的兼容性(因为OrderTicketID()不是MT4 函数)?

** OrderTicketID()似乎忽略了MT4_TICKET_TYPE指令,始终为 "长"。
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...