Странная штука. Запускаю одиночный прогон, получаю результат. Сразу запускаю ещё раз, ничего не меняя, и второй хуже, причём первая же сделка открывается в другом месте. Третий такой же, как второй. Если перезапустить терминал, первый прогон опять «хороший». Реальные тики, задержка выключена, советник мой, код весь знаю. Кэш тестера чистила, не помогло.
Если первый прогон отличается от следующих, значит, что-то переживает прогон. Переменные советника между прогонами не живут, тестер каждый раз стартует с нуля. Живут файлы, которые советник пишет сам. У тебя есть сохранение состояния на случай перезапуска? У меня на реале советник при старте читает файл с флагом остановки торговли, и если бы он делал так же в тестере, картина была бы ровно такая.
Нашла, и стыдно, что сама не подумала. Советник после каждой сделки пишет в файл тикет позиции и уровень частичного выхода, чтобы после рестарта VPS ничего не потерять. В тестере этот файл ложится в папку агента и там остаётся. Первый прогон стартует без файла, а второй читает то, что оставил первый, и считает, что у него уже есть позиция с частичным выходом. Отсюда и другая первая сделка. После перезапуска терминала прогон, видимо, уходил на другого агента, где файла ещё не было.
Сделала так: если MQLInfoInteger(MQL_TESTER), то имя файла с префиксом, и в OnInit файл удаляется. Три прогона подряд теперь одинаковые до цента. И заодно поняла, что восстановление состояния у меня ни разу толком не проверялось, займусь отдельно.