Библиотеки: MT4Orders - страница 55

 
fxsaber:

MT4Orders - MT4-style в MT5. Поэтому поведение OrderSend совпадает с MT4-аналогом.

Да, эта часть работает, и тикет ордера отложенного переходит в тикет позиции и все модифицируется, но сходу не получается все. При закрытии позиции появляется сделка по ордерам СЛ или ТП и проверка по тикету на время закрытия рыночного ордера не срабатывает.

Сломал голову. Закрытие по СЛ. В тестере если тикет ордера 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) // При закрытии по СЛ и возвращает ошибку 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 2Or 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 2Or 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:00Tickets 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 3Or 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 3Or 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:37Tickets 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:

Да, эта часть работает, и тикет ордера отложенного переходит в тикет позиции и все модифицируется, но сходу не получается все. При закрытии позиции появляется сделка по ордерам СЛ или ТП и проверка по тикету на время закрытия рыночного ордера не срабатывает.

Сломал голову. Закрытие по СЛ. В тестере если тикет ордера 3, то он совпадает с тикетом сделки и последний селектордер норм. Если 2 то ошибка выбора 4754. На реале/демо всегда не совпадает.

Приведите mq5-файл, который Вам видится нерабочим. Вы зря столько инфы приводите. Она не помогает понять, что имеете в виду. Лучше исходник.

 
fxsaber:

Приведите mq5-файл, который Вам видится нерабочим. Вы зря столько инфы приводите. Она не помогает понять, что имеете в виду. Лучше исходник.

Код корявый извиняюсь.

Файлы:
 
Valeriy Yastremskiy:

Код корявый извиняюсь.

В следующий раз лучше по существу.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/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 года. С ней и Ваш пример дал false поменял на последний все заработало, и мой код тоже)

Спасибо.

 
Valeriy Yastremskiy:

Нашел причину, старая версия MT4Orders  2018 года.

К сожалению, не придумал, как сделать, чтобы пользователи меньше спотыкались на использовании не актуальных версий библиотеки.

 

Если кто-то налетит, то при использовании этой либы на MT5 на RannForex с настройкой "Отправка лимитных ордеров в рынок по цене хуже текущей на N пунктов" при модификации лимитника вылетит алёрт в этом месте

          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:

Если кто-то налетит, то при использовании этой либы на MT5 на RannForex с настройкой "Отправка лимитных ордеров в рынок по цене хуже текущей на N пунктов" при модификации лимитника вылетит алёрт в этом месте

Связано с тем, что MT4Orders видит ушедший ордер промаркапленый, а брокер сразу правит цену обратно, и при запросе параметров ордера цена уже другая. Так что похоже это фича.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2020.09.29 08:45

Такой строкой

MT4ORDERS::OrderSend_MaxPause = 0; // Отключение проверки корректности работы MT5-OrderSend.

можно все это отключить. Может быть полезно в случае, если тормозит MT5-история торгов, т.к. MT4Orders проверяет корректность (и даже корректирует) MT5-OrderSend иногда через обращение к этой истории.

Не рекомендую этого делать.

Использую эту возможность.
 

I have an MT4 EA that I'm trying to port to MT5 using MT4Orders so I can maintain a single source, but I've run into some issues ...

1) when an order hits SL or TP, the usual [sl] or [tp] texts are not appended to the order comment if the EA added a comment during OrderSend().

Is this normal MT5 behaviour? If so, is there a reliable way to determine whether an order actually hit SL/TP or was closed manually?

(trying to decide by checking open price / close price / SL / TP is not reliable due to slippage - especially if SL was moved very close to TP)

** interestingly, OrdersToString() shows "[sl x.xxxxx]" in comments, but the Order History tab does not show that information (and it is not included in OrderComment() in the strategy tester)


2) when a partial close occurs, the comments on the open and closed portions order do not show "to #xxxxxxx" and "from #xxxxxxx"

again, is there a reliable (and hopefully simple) way to determine what happened to a particular order?

3) the ticket number of an open trade changes when it closes, so I can't use OrderTicket() to follow an order, but OrderTicketID() seems to work like OrderTicket() does in MT4 and retains the same ID for a closed trade.

Is that value constant, or might it change between platform restarts? If constant, what's the best way to use OrderTicketID() but retain compatibility with MT4 (since OrderTicketID() is not an MT4 function)?

** OrderTicketID() seems to ignore the MT4_TICKET_TYPE directive and is always "long"
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...