Разная работа тестера на разных компьютерах

 

Помогите пожалуйста разобраться.

Ситуация такая, один и тот же код тестирую на разных компьютерах - результат тестера разный.

Начал разбираться - на одном из терминалов не всегда входит по правилам.

Код абсолютно одинаковый, настройки сова и тестера одинаковые, брокер один.

Дошло до того, что удалил обе платформы, установил заново, закидываю один и тот же код - результаты разные. 

неправильноправильно 

 
monk988:

Помогите пожалуйста разобраться.

Ситуация такая, один и тот же код тестирую на разных компьютерах - результат тестера разный.

Начал разбираться - на одном из терминалов не всегда входит по правилам.

Код абсолютно одинаковый, настройки сова и тестера одинаковые, брокер один.

Дошло до того, что удалил обе платформы, установил заново, закидываю один и тот же код - результаты разные. 


А нет ли в коде операций сравнения с вещественными типами (double, float)? https://www.mql5.com/ru/docs/basis/types/double



 
barabashkakvn:

А нет ли в коде операций сравнения с вещественными типами (double, float)? https://www.mql5.com/ru/docs/basis/types/double



Только в трейлинге, но по сути он не должен на открытие влиять

На первой картинке селл открывается выше красной машки а такого по условиям не должно быть 

 
monk988:

Только в трейлинге, но по сути он не должен на открытие влиять

На первой картинке селл открывается выше красной машки а такого по условиям не должно быть 

Режим тестирования в тестере какой? Попробуйте режим "все тики" и выключить галочку "задержки".
 
barabashkakvn:
Режим тестирования в тестере какой? Попробуйте режим "все тики" и выключить галочку "задержки".

Вот такой режим тестирования на обоих терминалах

режим тестирования 

 

 Вот условия на вход:

int handle_ma;

int handle_open_bands;

double ma_buffer[];

double open_bands[];   

ArraySetAsSeries(ma_buffer,true);

ArraySetAsSeries(open_bands,true); 

 

handle_ma = iMA(NULL,timeframe,PeriodMa,0,MODE_EMA,PRICE_CLOSE);

handle_open_bands = iBands(NULL,timeframe,BandsOpen,0,DevOpenPos,PRICE_CLOSE);

CopyBuffer(handle_ma,0,0,2,ma_buffer);

CopyBuffer(handle_open_bands,1,0,2,open_bands);

   

ma = ma_buffer[1];

bandsUpper = open_bands[1];

if (ma >= bandsUpper )

    TradeShort = true;

   else TradeShort = false; 

 

Как видно из первого рисунка, машка ниже верхнего канала боллинджера, то есть вход запрещен. На втором рисунке сделки заходят правильно.

Может поможет чем, на Windows 7 правильно тестирует, на Windows 8 и Windows Server 2012 неправильно. 

 
monk988:

Вот такой режим тестирования на обоих терминалах

 

Как видно из первого рисунка, машка ниже верхнего канала боллинджера, то есть вход запрещен. На втором рисунке сделки заходят правильно.

Может поможет чем, на Windows 7 правильно тестирует, на Windows 8 и Windows Server 2012 неправильно. 

  1. Правильно вставляем код на форуме.
  2. Какой тип у переменных ma и bandsUpper? Если тип double, то снова читаем https://www.mql5.com/ru/docs/basis/types/double.
 
barabashkakvn:
  1. Правильно вставляем код на форуме.
  2. Какой тип у переменных ma и bandsUpper? Если тип double, то снова читаем https://www.mql5.com/ru/docs/basis/types/double.

Нашел в чем проблема - советник при наступлении нового бара брал значения индикаторов не с первого бара (как установлено шифтом) а со второго. Потому что блок обработки тиков был перед блоком обработки бара в функции OnTick(). То есть на самом первом тике нового бара робот обрабатывал устаревшие данные уже ставшего вторым бара.

Но вопрос остается, почему на одном терминале все обрабатывалось нормально, а на втором - нет? 

 
monk988:

Нашел в чем проблема - советник при наступлении нового бара брал значения индикаторов не с первого бара (как установлено шифтом) а со второго. Потому что блок обработки тиков был перед блоком обработки бара в функции OnTick(). То есть на самом первом тике нового бара робот обрабатывал устаревшие данные уже ставшего вторым бара.

Но вопрос остается, почему на одном терминале все обрабатывалось нормально, а на втором - нет? 

Тут уже без выкладки кода советника не обойтись.
 
handle_ma = iMA(NULL,timeframe,PeriodMa,0,MODE_EMA,PRICE_CLOSE);
handle_open_bands = iBands(NULL,timeframe,BandsOpen,0,DevOpenPos,PRICE_CLOSE);

CopyBuffer(handle_ma,0,0,2,ma_buffer);
CopyBuffer(handle_open_bands,1,0,2,open_bands);

1. Вы каждый раз, на каждой итерации, создаёте индикаторы. Неправильно это. Нужно создавать индикаторы однократно в OnInit

2. Нет ни одной проверки успешности выполнения функций

 
есть вариант с плавающим спредом
проблема давняя
тестер таким образом моделирует рыночные условия
можно попробовать тестирование с фиксированным спредом

но и то не факт что получите одинаковые результаты
это проблема не только вашего советника и давнишняя
а может это и вообще не проблема
история разная 
генерация спреда на разных машинах.... еще чо нить
Причина обращения: