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

[Удален]  

Уважаемые разработчики! В очередной раз прошу как можно скорее добавить время в мс для значений сентимента (SYMBOL_SESSION_...) и стакана( OnBookEvent()). Дайте возможность сделать синхронизацию всех доступных данных!

 

Metaquotes-Demo, символ DIG-20170330

SymbolInfoDouble(Symb,::SYMBOL_ASK) = 29006.0
SymbolInfoDouble(Symb,SYMBOL_SESSION_PRICE_LIMIT_MIN) = 29528.0
(ENUM_SYMBOL_TRADE_MODE)SymbolInfoInteger(Symb,SYMBOL_TRADE_MODE) = SYMBOL_TRADE_MODE_FULL (4)

Ошибка в SYMBOL_SESSION_PRICE_LIMIT_MIN: выше Аска - невозможно выставить BuyLimit.

 
fxsaber:

Прошу поделиться своим велосипедом: bool-функция, которая сообщает, готов ли символ к торговле или нет.

ENUM_DAY_OF_WEEK GetDayOfWeek( const datetime time )
{
  MqlDateTime sTime = {0};

  TimeToStruct(time, sTime);
  
  return((ENUM_DAY_OF_WEEK)sTime.day_of_week);
}

// true - находимся в торговой сессии
bool SessionTrade( string Symb = NULL )
{  
  datetime TimeNow = TimeTradeServer();
  
  const ENUM_DAY_OF_WEEK DayOfWeek = GetDayOfWeek(TimeNow);
  
  TimeNow %= 24 * 60 * 60;
  
  if ((Symb == NULL) || (Symb == ""))
    Symb = Symbol();  
  
  bool Res = false;
  datetime From, To;    

  for (int i = 0; SymbolInfoSessionTrade(Symb, DayOfWeek, i, From, To) && (!Res); i++)
    Res = ((From <= TimeNow) && (TimeNow < To));
    
  return(Res);
}

// Возвращает true, если символ торгуемый. Иначе - false.
bool SymbolTrade( string Symb = NULL, const int Pause = -1 )
{
  MqlTick Tick;
  
  if ((Symb == NULL) || (Symb == ""))
    Symb = Symbol();
    
  if (Pause >= 0)
    Sleep(Pause); // Если только что произошло добавление символа в Обзор рынка, нужно дождаться поступления данных в Marketwatch.
  
  return(SymbolInfoTick(Symb, Tick) ? ((Tick.bid != 0) && (Tick.ask != 0) && SessionTrade(Symb) &&
         ((ENUM_SYMBOL_TRADE_MODE)SymbolInfoInteger(Symb, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL)) : false);
}
 
fxsaber:
   
  if (Pause >= 0)
    Sleep(Pause); // Если только что произошло добавление символа в Обзор рынка, нужно дождаться поступления данных в Marketwatch.
   
А если это в индикаторе?
 
Artyom Trishkin:
А если это в индикаторе?
Отсюда ноги

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

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

fxsaber, 2017.02.14 12:31

Сразу после SymbolSelect(true) запрашиваю цены, а они нулевые. При этом _LastError == 0, SymbolInfoTick == true.

Как понять, что цены по новому для Обзора рынка символу доставлены до Marketwatch? 

Так что если SymbolSelect(true) не делался и специально не задавать Pause, то слипа и не будет.
 
fxsaber:
Отсюда ноги
Так что если SymbolSelect(true) не делался и специально не задавать Pause, то слипа и не будет.
Честно говоря, не понял. Я интересовался: как в индикаторе узнать готовность символа? Sleep() не работает в индикаторах.
Если индикатор в таблицу выводит некие статистические данные по заранее не известным символам, то при выборе очередного символа с панели, очень часто сразу нельзя получить данные по нему, и в таблицу выводится ложная информация... Как для дальнейших расчётов быть уверенным, что данные получены от символа корректны, и в достаточном количестве для получения дальгейших верных расчётов?
 
Artyom Trishkin:
Честно говоря, не понял. Я интересовался: как в индикаторе узнать готовность символа? Sleep() не работает в индикаторах.
Если индикатор в таблицу выводит некие статистические данные по заранее не известным символам, то при выборе очередного символа с панели, очень часто сразу нельзя получить данные по нему, и в таблицу выводится ложная информация... Как для дальнейших расчётов быть уверенным, что данные получены от символа корректны, и в достаточном количестве для получения дальгейших верных расчётов?
Sleep нужен только для случаев, когда символа нет в Обзоре рынка. Для всех символов, что есть в Обзоре рынка перед запуском (и во время работы) индикатора, никакие слипы не нужны.
 
Комментарии, не относящиеся к этой теме, были перенесены в "Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам".
 
fxsaber:
Sleep нужен только для случаев, когда символа нет в Обзоре рынка. Для всех символов, что есть в Обзоре рынка перед запуском (и во время работы) индикатора, никакие слипы не нужны.
Ясно.
 

1531 - тормоза Metaquotes-Demo не исчезли.

Запрос с ответом

Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = #KO
Request.volume = 1.0
Request.price = 40.31
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 100
Request.type = ORDER_TYPE_BUY (0)
Request.type_filling = ORDER_FILLING_RETURN (2)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = My Position
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 117613087
Result.order = 133997293
Result.volume = 1.0
Result.price = 40.31
Result.bid = 40.28
Result.ask = 40.31
Result.comment = Request executed 345.781 + 26.356 ms
Result.request_id = 5712
Result.retcode_external = 0

345 мс выполнялся OrderSend и 26 мс понадобилось на то, чтобы в истории стали доступны соответствующие ордер и сделка. Т.е. очень медленная синхронизация - такого раньше не наблюдал.

Стандартный лог

2017.02.14 22:26:46.767 Trades  '5122740': prices for #KO 1.00
2017.02.14 22:26:46.852 Trades  '5122740': accepted prices for #KO 1.00
2017.02.14 22:26:46.852 Trades  '5122740': answer prices for #KO 1.00 40.28 / 40.31 in 86.046 ms (0.190 ms on server)
2017.02.14 22:26:46.852 Trades  '5122740': request buy 1.00 #KO at 40.31
2017.02.14 22:26:47.107 Trades  '5122740': accepted request buy 1.00 #KO at 40.31
2017.02.14 22:26:47.107 Trades  '5122740': deal #117613087 buy 1.00 #KO at 40.31 done (based on order #133997293)
2017.02.14 22:26:47.107 Trades  '5122740': order #133997293 buy 1.00 / 1.00 #KO at 40.31 done in 345.709 ms (3.022 ms on server)

Новый лог теперь в 1531! Прошу пояснить по этому случаю, что к чему.

 

ЗЫ Лог почти сразу после тормозов

2017.02.14 22:26:47.433 Trades  '5122740': prices for #KFT 1.00
2017.02.14 22:26:47.503 Trades  '5122740': accepted prices for #KFT 1.00
2017.02.14 22:26:47.506 Trades  '5122740': answer prices for #KFT 1.00 49.17 / 49.20 in 70.980 ms (4.166 ms on server)
2017.02.14 22:26:47.506 Trades  '5122740': request buy 1.00 #KFT at 49.20
2017.02.14 22:26:47.583 Trades  '5122740': accepted request buy 1.00 #KFT at 49.20
2017.02.14 22:26:47.583 Trades  '5122740': deal #117613092 buy 1.00 #KFT at 49.20 done (based on order #133997299)
2017.02.14 22:26:47.583 Trades  '5122740': order #133997299 buy 1.00 / 1.00 #KFT at 49.20 done in 149.304 ms (3.015 ms on server)

Это Requested-символы, поэтому на маркет-ордерах помедленнее, чем другие.