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

 
тогда в сервисдеск пишите, код приложите.
 
sergeev:

тогда в сервисдеск пишите, код приложите.

Да, лучше именно в сервисдеск с приложением кода эксперта.

За код не беспокойтесь - мы все стираем после тестов. У нас главная и единственная задача в поиске ошибок.

 

Очередной вопрос. Использую функцию CopyTime. Вызов:

CopyTime("EURUSD", PERIOD_MN1, D'2011.06.30', D'2011.08.01', Array)

возвращает почему-то только один элемент со значением D'2011.08.01'. А где собсно D'2011.07.01'? В чем подвох?

P.S. Массив Array[] - динамический.

 
marketeer:

Очередной вопрос. Использую функцию CopyTime. Вызов:

возвращает почему-то только один элемент со значением D'2011.08.01'. А где собсно D'2011.07.01'? В чем подвох?

P.S. Массив Array[] - динамический.

Да, почему то первый элемент пропускается, пишите в сервисдеск.

datetime Array[];
   CopyTime("EURUSD", PERIOD_MN1, D'2011.06.01', D'2011.08.01', Array); 
   for(int i=0;i<ArraySize(Array);i++)
     {
      Print(i," ",Array[i]);
     }

1 2011.08.01 00:00:00

0 2011.07.01 00:00:00

 
marketeer:

Очередной вопрос. Использую функцию CopyTime

 

Уже есть подобная заявка.

Разбираемся. 

 

Вот еще загадка. Никак не могу отловить багу - уж не знаю, моя или терминала.

Есть тривиальный код, который подсчитывает количество выставленных экспертом ордеров. Счетчик хранится в глобальных переменных. Выглядит примерно так:

int Count;

int OnInit()
{
  Count = (int)GlobalVariableGet("Count");
  return(0);
}

void OnTick()
{
  // bla-bla-bla
  if(успешно отправлен ордер)
  {
    Count++;
    if(!MQL5InfoInteger(MQL5_TESTING))
    {
      if(GlobalVariableSet("Count", Count) == 0)
      {
        Print("GlobalVariableSet error ", GetLastError());
      }
    }
  }
}

Этот Count используется в комментах ордеров. В результате периодически наблюдаю, что номер очередного ордера меньше (на несколько единиц), чем у позиций, которые уже в рынке. Ошибок в логе нет.

Есть идеи? Может, кто-то сталкивался с аналогичным "исчезновением" последних значений глобальных переменных, например, из-за их несохранения терминалом при выходе из него в определенных условиях (ну, например, может в случае, когда пропала связь - просто одна версия)?

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 
marketeer:

Вот еще загадка. Никак не могу отловить багу - уж не знаю, моя или терминала.

Попробуйте что-то вроде этого. Я правда в глобальные не выводил. Но считается всё верно.

    int Amount_Orders = 0;

    for(count = 0; count < OrdersTotal(); count++)
       {  
        if(OrderSelect(OrderGetTicket(count))) 
          {
           int tp_ord = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);  
           if(tp_ord == ORDER_TYPE_BUY_STOP  || tp_ord == ORDER_TYPE_SELL_STOP ||
              tp_ord == ORDER_TYPE_BUY_LIMIT || tp_ord == ORDER_TYPE_SELL_LIMIT)
           Amount_Orders++;  
          }
       }
 
tol64:

Попробуйте что-то вроде этого. Я правда в глобальные не выводил. Но считается всё верно.

У меня проблема именно с тем, что значение, записанное в глобальную переменную, теряется, т.е. не полностью (как при удалении по месячному таймауту), а остается старое. Пересчитывать ордера, конечно, можно, но мой способ тоже должен работать.
 
papaklass:

Разработчикам:

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

ПС: Вообще не понятно назначение обработчика торговых событий OnTrade, если стоп-лоссы и тэйки он не отлавливает, если закрытие отложников по времени истечения ордера он не отлавливает. Мы все должны перепроверять в процессе выполнения алгоритма. Такой подход вносит путаницу, т.к. надеешься на обработчика торговых событий, а нужно его перепроверять. Тем более, что после перепроверок отлавливаешь события, которые не обрабатываются OnTrade(). Ну к чему это? Зато теперь мы можем поиграть в тетрис и всякую ерунду рисовать на графиках. Разработчики, ну очень Вас прошу, доведите торговую часть платформы до логического завершения.

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

Вот эти строки в лог, к примеру, выводит именно обработчик OnTrade:

2011.08.08 09:03:05    ChTestExp (EURUSD,H1)    Long position by EURAUD to be closed of stop-loss
2011.08.08 09:03:05    ChTestExp (EURUSD,H1)    -----------------Deal #5263582 [sl 1.37819]
2011.08.08 09:03:05    ChTestExp (EURUSD,H1)    oldDealsTotal=558 newDealsTotal=559
 
papaklass:

Вы поставьте в фукцию OnTrade() функцию Print(__FUNCTION__). И когда в Вашем логе будет

   stop loss triggered buy 0.10 AUDUSD 0.89783 sl: 0.89544 tp: 0.90024 [#15 sell 0.10 AUDUSD at 0.89544]
   deal #7 sell 0.10 AUDUSD at 0.89544 done (based on order #15)
   deal performed [#7 sell 0.10 AUDUSD at 0.89544]
   order performed sell 0.10 at 0.89544 [#15 sell 0.10 AUDUSD at 0.89544]
 

Вы посмотрите, сработал ли OnTrade()? 

У меня то всё срабатывает, даже без Вашей вставки, так как в OnTrade ведётся учёт всех сделок , их объёмов, профита, всё это суммируется и выводится в OnDeinite по каждому символу в отдельности. И поскольку, все просуммированные показатели (число трейдов, прибыль) в точности совпадают с отчётом тестера, у меня нет оснований сомневаться в работе функции OnTrade().

Единственное, что не обрабатывается в OnTrade, это сделки по закрытию позиций по окончанию теста (с комментарием 'end of test') и по закрытию по стоп-ауту в тестере (комментарий 'so ...'), их в режиме тестирования, приходится дополнительно обрабатывать в OnDeinit. Выдержка из лога тестера:

2011.08.09 00:06:43    Core 1    log file "E:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110809.log" written
2011.08.09 00:06:43    Core 1    EURUSD,H1: 888296 ticks (275 bars) generated within 13962 ms (total bars in history 6479, total time 16177 ms)
2011.08.09 00:06:43    Core 1    stop out occured on 8% of testing interval
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Конец Deinit
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   All Profit  = -9072.04
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Всего трейдов: 17
.....
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   ----------------------------------------
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Total profit EURGBP = -4738.97
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Profit for the week EURGBP = 319.68
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Total profit GBPUSD = -3775.86
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Profit for the week GBPUSD = -1798.83
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Total profit EURUSD = -557.21
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Profit for the week EURUSD = 65.85
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Balance=927.96 Equite=927.96 Profit=0.00 MarginLevel=0.00
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   ---------------Report-------------------
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Balance=10000.00 Equite=927.96 Profit=0.00 MarginLevel=0.00
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Ошибок открытия: 1 Ошибок закрытия: 0 Ошибок модификации: 0 Реквоты: 1
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Время работы: 0 min. 14 сек.
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Эксперт ChTestExp закончил работу в 2011.01.18 10:11 на графике EURUSD период H1
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   Выполнение Deinit
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   OnDeinit_UninitReason = Another reason
2011.08.09 00:06:43    Core 1    OnTester result 0
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   order performed buy 1.65 at 1.59804 [#69 buy 1.65 GBPUSD at 1.59804]
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   deal performed [#68 buy 1.65 GBPUSD at 1.59804]
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   deal #68 buy 1.65 GBPUSD at 1.59804 done (based on order #69)
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   position closed due end of test at 1.59804 [sell 1.65 GBPUSD 1.57341182 tp: 1.57247]
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   order performed buy 0.45 at 0.83931 [#68 buy 0.45 EURGBP at 0.83931]
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   deal performed [#67 buy 0.45 EURGBP at 0.83931]
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   deal #67 buy 0.45 EURGBP at 0.83931 done (based on order #68)
2011.08.09 00:06:43    Core 1    2011.01.18 10:11:00   position stop out triggered at 29.09% [sell 0.45 EURGBP 0.83930333 tp: 0.80463]
2011.08.09 00:06:43    Core 1    2011.01.17 14:39:39   Long position by EURUSD to be closed of stop-loss
2011.08.09 00:06:43    Core 1    2011.01.17 14:39:39   -----------------Deal #66 sl 1.32900

2011.08.09 00:06:43    Core 1    2011.01.17 14:39:39   oldDealsTotal=65 newDealsTotal=66

Из отчёта тестера:

Результаты
Качество истории: 100%
Бары: 275 Тики: 888296
Чистая прибыль: -9 072.04 Общая прибыль: 1 652.29 Общий убыток: -10 724.33
Прибыльность: 0.15 Матожидание выигрыша: -533.65
Фактор восстановления: -0.92 Коэффициент Шарпа: -0.35

Просадка баланса:
Абсолютная просадка по балансу: 9 072.04 Максимальная просадка по балансу: 10 392.34 (91.80%) Относительная просадка по балансу: 91.80% (10 392.34)
Просадка средств:
Абсолютная просадка по средствам: 9 072.04 Максимальная просадка по средствам: 9 852.02 (91.39%) Относительная просадка по средствам: 91.39% (9 852.02)

Всего трейдов: 17 Короткие трейды (% выигравших): 10 (70.00%) Длинные трейды (% выигравших): 7 (85.71%)
Всего сделок: 67 Прибыльные трейды (% от всех): 13 (76.47%) Убыточные трейды (% от всех): 4 (23.53%)

Самый большой прибыльный трейд: 263.25 Самый большой убыточный трейд: -5 036.39

Средний прибыльный трейд: 127.10 Средний убыточный трейд: -2 681.08

Максимальное количество непрерывных выигрышей (прибыль): 10 (1 320.30) Максимальное количество непрерывных проигрышей (убыток): 2 (-4 084.59)

Максимальная непрерывная прибыль (число выигрышей): 1 320.30 (10) Максимальная непрерывный убыток (число проигрышей): -5 036.39 (1)

Средний непрерывный выигрыш: 4 Средний непрерывный проигрыш: 1


Как вилите, итоговые цифры, независимо посчитанные, совпадают, значит всё верно. Специально взял пример со стоп-аутом.
Причина обращения: