MetaEditor build 1468 - страница 2

 

fxsaber:

Воспроизводится?

Есть косвенная причина, куда копать. Выше пример написан на СБ. Кроссплатформенная версия
#include <MT4Orders.mqh>

#define OFFSET (100 * _Point)

void OnStart()
{
  for (int i = 0; i < 10; i++)
  {
    const double Price = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK) - OFFSET, _Digits);
    const double SL = NormalizeDouble(Price - OFFSET, _Digits);    
    
    const int Ticket = OrderSend(_Symbol, OP_BUYLIMIT, 1, Price, 0, 0, 0);

    OrderModify(Ticket, Price, SL, 0, 0);

    OrderDelete(Ticket);
  }
}

ловит баги реже, чем СБ-версия. Существенное отличие MT4Orders от СБ - после каждого оригинального MT5-OrderSend дожидается синхронизации торгового окружения с результатом выполнения OrderSend. Т.е. там содержатся некоторые паузы ожидания, которых в СБ нет. И с этими паузами (в среднем ~1 мс) ошибок гораздо меньше, чем в варианте без них - СБ.

Получается, что терминал не поспевает и начинает выдавать ошибки. 

 
Renat Fatkhullin:

Довольно много воспроизводимых багов имеется, которые после форумных сообщений ими и остаются - не правятся.

В СД заявку могу отправить только одну. Есть возможность снять это ограничение, как и написание ЛС, чтобы разработчикам через ЛС быстро отвечать, в случае вопроса? 

 

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

Ошибки, баги, вопросы

fxsaber, 2016.10.20 08:24

СБ на всех торговых серверах
//+------------------------------------------------------------------+
//| Get the property value "ORDER_TYPE_FILLING"                      |
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING COrderInfo::TypeFilling(void) const
  {
   return((ENUM_ORDER_TYPE_FILLING)OrderGetInteger(ORDER_TYPE_FILLING));
  }

ВСЕГДА в тестере возвращает ENUM_ORDER_TYPE_FILLING::ORDER_FILLING_RETURN.

Поэтому если в OrderModify filling задать через COrderInfo::TypeFilling(), то на том же RoboForexEU-MetaTrader 5 будет логичная ошибка [Unsupported filling mode]. Однако, на MetaQuotes-Demo этой ошибки не возникает - криво настроен сервер разработчиков?



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

Ошибки, баги, вопросы

fxsaber, 2016.10.20 15:54

Изучил Стандартную Библиотеку и написал проверочный советник
#define SLTP (10 * _Point)

#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>

// Через MT5-Стандартную Библиотеку - only MT5
// Выставляет SellLimit и затем устаналивает ему SL/TP
void MT5Order( const double Price )
{
  CTrade Trade;
  
  if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
    Trade.SetTypeFilling(ORDER_FILLING_RETURN);

  Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);

  const ulong Ticket = Trade.ResultOrder();
  
  if (Ticket > 0)
  {
    COrderInfo Order;
    
    if (Order.Select(Ticket))
      Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
  }      
}

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

// Через MT4-ОЯС - кроссплатформенный вариант (MT4/5)
// Выставляет SellLimit и затем устаналивает ему SL/TP
void MT4Order( const double Price )
{
  const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
  
  if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
    OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
    
    MT5Order(Price); // Через MT5-Стандартную Библиотеку - only MT5
    MT4Order(Price); // Через MT4-ОЯС - кроссплатформенный вариант (MT4/5)
    
    FirstRun = false;
  }
}

Результат (снизу-вверх)
2016.10.20 16:49:14.987 2016.10.18 10:00:00   order modified [#3 sell limit 1.00 RTS-12.16 at 100]
2016.10.20 16:49:14.987 2016.10.18 10:00:00   sell limit 1.00 RTS-12.16 at 100 (0 / 0 / 97600)
2016.10.20 16:49:14.987 2016.10.18 10:00:00   CTrade::OrderSend: modify #2 at 100.00000 (sl: 110.00000 tp: 90.00000) [invalid fill]
2016.10.20 16:49:14.987 2016.10.18 10:00:00   failed modify order #2 sell limit 1.00  at 100.00000 sl: 0.00000 tp: 0.00000 -> 100.00000, sl: 110.00000 tp: 90.00000 [Unsupported filling mode]
2016.10.20 16:49:14.987 2016.10.18 10:00:00   CTrade::OrderSend: sell limit 1.00 RTS-12.16 at 100 [done]
2016.10.20 16:49:14.986 2016.10.18 10:00:00   sell limit 1.00 RTS-12.16 at 100 (0 / 0 / 97600)
2016.10.20 16:49:14.985 RTS-12.16 : real ticks begin from 2016.10.18 00:00:00
Жирным выделена ошибка в СБ. Заодно можно сравнить код функций MT4Order и MT5Order.
 
Renat Fatkhullin:

Наше исходное решение по обратному выводу было реально дурным.

Через 16 лет исправили, наконец.

Все привыкнем обязательно.

Поддерживаю, многих пользователй это бесило тоже )   Однако ж почему бы не добавить возможность сортировки по столбцу "Время"?  Тогда каждый сможет сделать так, как ему удобней.  Сортировка вообще нужная штука, и не только по времени, а также и по названию эксперта.

И вот ещё момент, в связи с новым порядком возникает некий диссонанс с окном алертов - там то всё по прежнему с ног на голову.  Я вот например часть сообщений вывожу в алертах, часть в принте, поэтому удобней было бы наблюдать всё в едином стандарте.   Но полагаю, кому-то другому это может не понравится...   В общем, идеальный вариант - сделать возможность сортировки в алертах тоже. 

И ещё пожелание по поводу алертов - позволить пользователю менять ширину столбцов.  Сейчас возможно растягивать только ширину всего окна, все столбцы растягиваются пропорционально, однако это не очень хорошее решение, т.к. для времени и названия эксперта и так хватает места, а нам требуется растянуть только ширину столбца с сообщением.

 

у меня такой вопрос - в мт5 при накидывании скрипта или индикатора в закладке эксперты отображается сейчас какая-то инфа,как это было  в мт4?

2016.11.11 20:35:41.066 OsMA USDSEK,H1: initialized
2016.11.11 20:35:39.137 Custom indicator OsMA USDSEK,H1: loaded successfully
а то я не обращал раньше внимание,а сейчас смотрю - там при накидывании нет ничего. только если ошибки появляюся,то пишет их. Или так и должно быть?
 
ivanivan_11:

у меня такой вопрос - в мт5 при накидывании скрипта или индикатора в закладке эксперты отображается сейчас какая-то инфа,как это было  в мт4?

2016.11.11 20:35:41.066 OsMA USDSEK,H1: initialized
2016.11.11 20:35:39.137 Custom indicator OsMA USDSEK,H1: loaded successfully
а то я не обращал раньше внимание,а сейчас смотрю - там при накидывании нет ничего. только если ошибки появляюся,то пишет их. Или так и должно быть?

При присоединении скрипта отображается информация во вкладке "Журнал":

2016.11.11 19:42:43.405 Scripts script CanvasSample (GBPUSD,H1) loaded successfully
 
Vladimir Karputov:

При присоединении скрипта отображается информация во вкладке "Журнал":

2016.11.11 19:42:43.405 Scripts script CanvasSample (GBPUSD,H1) loaded successfully
спасибо,вижу теперь. раньше во флуде терялось от тестирования. в мт4 на вкладке эксперты как-то поменьше флуда и видно в итоге лучше
 
В тестере открываю и закрываю два отложенника на одном и том же тике. По какому параметру они отсортированы каждый раз одинаково в HistorySelect? Время и открытия и закрытия совпадают, но они по какой-то причине точно отсортированы.
 
fxsaber:
В тестере открываю и закрываю два отложенника на одном и том же тике. По какому параметру они отсортированы каждый раз одинаково в HistorySelect? Время и открытия и закрытия совпадают, но они по какой-то причине точно отсортированы.
а номера ордера или id?
 
ivanivan_11:
а номера ордера или id?

Если все совпадает, то сортирует по тикетам? Возможно.

Нет, не по тикету. Доказательство

#include <MT4Orders.mqh>

#define OFFSET (100 * _Point)

void OnTick()
{
  static bool FirstRun = true;
    
  if (FirstRun && SymbolInfoDouble(_Symbol, SYMBOL_ASK) != 0)
  {
    const double Price = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK) - OFFSET, _Digits);

    const int Ticket1 = OrderSend(_Symbol, OP_BUYLIMIT, 1, Price, 0, 0, 0);
    const int Ticket2 = OrderSend(_Symbol, OP_BUYLIMIT, 2, Price, 0, 0, 0);

    OrderDelete(Ticket2);
    OrderDelete(Ticket1);

    FirstRun = false;
  }
}
У него какой-то внутренний счетчик, похоже. А на реале как этот счетчик работает?