Ошибки, баги, вопросы - страница 3311

 
A100 #:

В MetaEditor одиночный флажок (1) - не отображается (код символа 0x2691),

а если в паре с другим символом (2), то все нормально:

А какая разница? Тем более, что в Блокноте все нормально отображается в обоих случаях:


 Попробуйте MQ5 файл сохранить как Unicode.

 
Renat Fatkhullin #:

 Попробуйте MQ5 файл сохранить как Unicode.

Сохранил как Unicode, открыл\закрыл - ничего не поменялось:


Вот сам код - может у кого и получится скопировать его в MetaEditor:
Print( "⚑" );
 

Всем добрый день. Может-ли кто объяснить таое поведение советника?

MetaTrader 5 x64 build 3683 started for MetaQuotes Software Corp.
Windows 7 Service Pack 1 build 7601, 4 x AMD FX-4170 Quad-Core, AVX, 10 / 11 Gb memory, 371 / 953 Gb disk, admin, GMT+3

Код советника

/********************************************************************\
|                                                          SL_TP.mq5 |
|                                            © 2022, Alexey Viktorov |
|                       https://www.mql5.com/ru/users/alexeyvik/news |
\********************************************************************/
#property copyright "© 2022, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/users/alexeyvik/news"
#property version   "2.00"
//---
#include <Trade\Trade.mqh>
CTrade trade;
enum ORD_POS
 {
  ord,  //  Orders only
  pos,  //  Only positions
  all   //  Positions and orders
 };
//long chartID;
input ORD_POS     ord_pos = all;  //  positions or orders
input int         TP      = 500;  //  Take profit
input int         SL      = 200;  //  Stop loss
input int         idEA    = -1;   //  Magic (0 - ручные, -1 - ВСЕ позиции)
/*******************Expert initialization function*******************/
int OnInit()
 {
//chartID = ChartID();
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
 }/******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.symbol == _Symbol)
   {
    MqlTradeRequest myRequest;
    MqlTradeResult myResult;
    MqlTradeCheckResult myCheckResult;
    ZeroMemory(myRequest);
    ZeroMemory(myResult);
    if(ord_pos != pos && trans.type == TRADE_TRANSACTION_ORDER_ADD)
     {
      if(OrderSelect(trans.order) && (OrderGetInteger(ORDER_MAGIC) == idEA || idEA == -1))
       {
        double sl = SL == 0 ? 0.0 : trans.order_type%2 == ORDER_TYPE_BUY ? trans.price-SL*_Point : trans.price+SL*_Point,
               tp = TP == 0 ? 0.0 : trans.order_type%2 == ORDER_TYPE_BUY ? trans.price+TP*_Point : trans.price-TP*_Point;
        if(!trade.OrderModify(OrderGetInteger(ORDER_TICKET),
                              OrderGetDouble(ORDER_PRICE_OPEN),
                              NormalizeDouble(sl, _Digits),
                              NormalizeDouble(tp, _Digits),
                              trans.time_type,
                              trans.time_expiration))
         //{
          Print(EnumToString(trade.RequestAction()));
          Print("Description ", trade.RequestActionDescription());
          Print("RequestMagic ", trade.RequestMagic());
          Print("RequestOrder ", trade.RequestOrder());
          Print("RequestSymbol ", trade.RequestSymbol());
          Print("RequestVolume ", trade.RequestVolume());
          Print("RequestPrice ", trade.RequestPrice());
          Print("RequestSL ", trade.RequestSL());
          Print("RequestTP ", trade.RequestTP());
          Print("RequestDeviation ", trade.RequestDeviation());
          Print("RequestType ", EnumToString(trade.RequestType()));
          Print("TypeFilling ", EnumToString(trade.RequestTypeFilling()));
          Print("trans.order_type ", EnumToString(trans.order_type));
         //}
       }
     }
    if(ord_pos != ord && trans.type == TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal) && HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)
       {
        if(PositionSelectByTicket(trans.position) && (PositionGetInteger(POSITION_MAGIC) == idEA || idEA == -1))
         {
          double sl = SL == 0 ? 0.0 : NormalizeDouble(trans.deal_type == DEAL_TYPE_BUY ? trans.price-SL*_Point : trans.price+SL*_Point, _Digits),
                 tp = TP == 0 ? 0.0 : NormalizeDouble(trans.deal_type == DEAL_TYPE_BUY ? trans.price+TP*_Point : trans.price-TP*_Point, _Digits);
          myRequest.action    = TRADE_ACTION_SLTP;
          myRequest.price     = trans.price;
          myRequest.position  = trans.position;
          myRequest.symbol    = trans.symbol;
          myRequest.sl        = sl;
          myRequest.tp        = tp;
          myRequest.magic     = PositionGetInteger(POSITION_MAGIC);
          if(!OrderSend(myRequest, myResult))
            Print(myResult.comment);
         }
       }
     }
   }
 }/******************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
 {
//---
 }/******************************************************************/


Интересна только выделенная часть кода. Советник должен поставить стоп и тейк отложенному ордеру поставленному вручную, скриптом или другим советником.

Результат двух попыток поставить ордер вручную.

2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    Description modify #1678872917 at 1.07665 (sl: 1.07465 tp: 1.08165)
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestMagic 0
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestOrder 1678872917
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestSymbol EURUSD
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestVolume 0.0
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestPrice 1.0766499999999999
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestSL 1.07465
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestTP 1.08165
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestDeviation 0
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    RequestType ORDER_TYPE_BUY
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    TypeFilling ORDER_FILLING_FOK
2023.04.25 09:30:11.609 SL_TP_v2 (EURUSD,H1)    trans.order_type ORDER_TYPE_BUY_LIMIT
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    CTrade::OrderSend: modify #1678875517 at 1.06920 (sl: 1.06720 tp: 1.07420) [invalid request]
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    TRADE_ACTION_MODIFY
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    Description modify #1678875517 at 1.06920 (sl: 1.06720 tp: 1.07420)
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestMagic 0
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestOrder 1678875517
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestSymbol EURUSD
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestVolume 0.0
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestPrice 1.0692
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestSL 1.0672
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestTP 1.0742
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestDeviation 0
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    RequestType ORDER_TYPE_BUY
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    TypeFilling ORDER_FILLING_FOK
2023.04.25 09:31:20.748 SL_TP_v2 (EURUSD,H1)    trans.order_type ORDER_TYPE_BUY_LIMIT


С первой попытки всё отработало без проблем, а во втором случае чего-то пошло не так…

Хотелось-бы разобраться что не так?

Файлы:
SL_TP_v2.mq5  10 kb
 
Alexey Viktorov #:

Хотелось-бы разобраться что не так?

Посмотрите ORDER_STATE.

 
fxsaber #:

Посмотрите ORDER_STATE.

Я сначала обрадовался, типа вот что я не учёл… Но радость моя была не долгой…

2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    CTrade::OrderSend: modify #1679307242 at 1.08879 (sl: 1.08679 tp: 1.09379) [invalid request]
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    TRADE_ACTION_MODIFY
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    Description modify #1679307242 at 1.08879 (sl: 1.08679 tp: 1.09379)
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestMagic 0
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestOrder 1679307242
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestSymbol EURUSD
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestVolume 0.0
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestPrice 1.08879
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestSL 1.08679
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestTP 1.09379
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestDeviation 0
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    RequestType ORDER_TYPE_BUY
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    TypeFilling ORDER_FILLING_FOK
2023.04.25 11:58:52.473 SL_TP_v2 (EURUSD,H1)    trans.order_state ORDER_STATE_STARTED
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    CTrade::OrderSend: modify #1679307614 at 1.09293 (sl: 1.09093 tp: 1.09793) [invalid request]
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    TRADE_ACTION_MODIFY
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    Description modify #1679307614 at 1.09293 (sl: 1.09093 tp: 1.09793)
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestMagic 0
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestOrder 1679307614
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestSymbol EURUSD
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestVolume 0.0
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestPrice 1.09293
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestSL 1.09093
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestTP 1.09793
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestDeviation 0
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    RequestType ORDER_TYPE_BUY
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    TypeFilling ORDER_FILLING_FOK
2023.04.25 11:58:57.916 SL_TP_v2 (EURUSD,H1)    trans.order_state ORDER_STATE_STARTED
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    Description modify #1679307870 at 1.08548 (sl: 1.08348 tp: 1.09048)
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestMagic 0
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestOrder 1679307870
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestSymbol EURUSD
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestVolume 0.0
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestPrice 1.08548
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestSL 1.08348
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestTP 1.09048
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestDeviation 0
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    RequestType ORDER_TYPE_BUY
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    TypeFilling ORDER_FILLING_FOK
2023.04.25 11:59:02.017 SL_TP_v2 (EURUSD,H1)    trans.order_state ORDER_STATE_STARTED


Статус ордера во всех вариантах одинаков.

Потом ведь ордер уже выбран в действующих… Значит ничто не должно мешать его модификации…

ps; причём одинаково, что из структуры, что из свойства ордера

          Print("order_state ", EnumToString((ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE)));
 
Alexey Viktorov #:

Я сначала обрадовался, типа вот что я не учёл… Но радость моя была не долгой…


Статус ордера во всех вариантах одинаков.

Потом ведь ордер уже выбран в действующих… Значит ничто не должно мешать его модификации…

ps; причём одинаково, что из структуры, что из свойства ордера

[invalid request]

тоже с таким сталкиваюсь, объяснения такому явлению у меня пока нет.

 
Andrey Dik #:

тоже с таким сталкиваюсь, объяснения такому явлению у меня пока нет.

Может это связано с тем, что модификация отправляется из  функции OnTradeTransaction()?

Сейчас буду пробовать связать OnTradeTransaction() с OnTick(). Пусть модифаит на следующем тике. Конечно это не правильно, с моей точки зрения, но как-то надо ведь сделать чтобы работало…

 
Alexey Viktorov #:

Потом ведь ордер уже выбран в действующих… Значит ничто не должно мешать его модификации…

STARTED - нельзя ничего сделать. PLACED - можно.

 
fxsaber #:

STARTED - нельзя ничего сделать. PLACED - можно.

Может я распечатку сделал не правильно, но статус ордера одинаков и при инвалиде, и без инвалида…

Потом, ведь ордер уже выбран среди открытых. Значит его статус не должен быть  STARTED, разве не так?

 
Alexey Viktorov #:

Может я распечатку сделал не правильно, но статус ордера одинаков и при инвалиде, и без инвалида…

Потом, ведь ордер уже выбран среди открытых. Значит его статус не должен быть  STARTED, разве не так?

Запустите этот скрипт.

void OnStart()
{
  long State = -1;
  
  while (!IsStopped())
    if (OrderGetTicket(OrdersTotal() - 1) && (State != OrderGetInteger(ORDER_STATE)))
      Print(EnumToString((ENUM_ORDER_STATE)(State = OrderGetInteger(ORDER_STATE))));
}

И руками откройте отложку (желательно, чтобы не было других ордеров).

2023.04.25 12:57:26.983 '160325739': buy limit 1 AUDUSD at 0.66664
2023.04.25 12:57:27.036 '160325739': accepted buy limit 1 AUDUSD at 0.66664
2023.04.25 12:57:27.036 ORDER_STATE_STARTED

2023.04.25 12:57:27.041 ORDER_STATE_PLACED
2023.04.25 12:57:27.043 '160325739': order #2289634089 buy limit 1 / 1 AUDUSD at 0.66664 done in 59.632 ms

2023.04.25 12:58:11.323 ORDER_STATE_REQUEST_ADD
2023.04.25 12:58:11.352 ORDER_STATE_PLACED
2023.04.25 12:58:11.352 '160325739': deal #2278919416 buy 1 AUDUSD at 0.66664 done (based on order #2289634089)