Обсуждение статьи "Контроль наклона кривой баланса во время работы торгового эксперта" - страница 5

 

Нашёл место в инклюднике "где собака порылась"! Глючит сортировка массива. Я вставил принт перед и после сортировки:

 

//MY CHECK
        for( index = 0; index < count; index++ )
        {
   
      Print("BEFORE SORTING org_result_array[",index,"]=",org_result_array[ index ]," this.org_datetime_array[",index,"]=",this.org_datetime_array[ index ]);
        
        }
//      Отсортируем "сырой" массив по дате/времени закрытия ордера:
        SortMasterSlaveArray( this.org_datetime_array, this.org_result_array );

//MY CHECK
        for( index = 0; index < count; index++ )
        {
   
      Print("AFTER SORTING org_result_array[",index,"]=",org_result_array[ index ]," this.org_datetime_array[",index,"]=",this.org_datetime_array[ index ]);
        
        }

Вот результат, который всплыл при тесте на ОДНОЙ из пар:

 MQ 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[0]=-279.9 this.org_datetime_array[0]=22307921.0
QQ 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[1]=-275.4 this.org_datetime_array[1]=22307227.0
QR 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[2]=-302.5 this.org_datetime_array[2]=22289679.0
QR 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[3]=-281.4999999999999 this.org_datetime_array[3]=22287959.0
PQ 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[4]=-274.4 this.org_datetime_array[4]=22276174.0
PR 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[5]=-323.9999999999999 this.org_datetime_array[5]=22276026.0
IP 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[6]=5354.0 this.org_datetime_array[6]=22269123.0
MQ 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[7]=-249.0 this.org_datetime_array[7]=22196301.0
GR 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[8]=-249.0 this.org_datetime_array[8]=22196242.0
GR 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[9]=-250.0 this.org_datetime_array[9]=22195632.0
GS 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[10]=-249.0 this.org_datetime_array[10]=22195447.0
NS 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[11]=-249.0 this.org_datetime_array[11]=22195279.0
DS 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[12]=-249.0 this.org_datetime_array[12]=22194812.0
QS 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[13]=-250.0 this.org_datetime_array[13]=22194448.0
OL 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[14]=-249.0 this.org_datetime_array[14]=22193876.0
OL 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[15]=-315.0 this.org_datetime_array[15]=22188593.0
EL 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[16]=-249.0 this.org_datetime_array[16]=22188401.0
LL 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[17]=-249.0 this.org_datetime_array[17]=22188390.0
KM 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[18]=-318.0 this.org_datetime_array[18]=22178692.0
NM 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[19]=-250.0 this.org_datetime_array[19]=22171680.0
QM 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[20]=-249.0 this.org_datetime_array[20]=22168711.0
OM 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[21]=-250.0 this.org_datetime_array[21]=22168595.0
KN 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[22]=-248.9 this.org_datetime_array[22]=22168313.0
CN 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[23]=-249.5 this.org_datetime_array[23]=22167843.0
PN 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[24]=-249.0 this.org_datetime_array[24]=22165238.0
FN 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[25]=-249.6 this.org_datetime_array[25]=22165036.0
MO 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[26]=-271.0 this.org_datetime_array[26]=22164783.0
GO 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[27]=-256.0 this.org_datetime_array[27]=22161600.0
QO 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[28]=-249.0 this.org_datetime_array[28]=22158602.0
OO 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[29]=-250.0 this.org_datetime_array[29]=22158129.0
PH 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[30]=-249.0 this.org_datetime_array[30]=22157426.0
MH 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[31]=-249.0 this.org_datetime_array[31]=22156983.0
KH 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[32]=-249.0 this.org_datetime_array[32]=22156408.0
FH 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[33]=-249.0 this.org_datetime_array[33]=22154526.0
EI 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[34]=-249.0 this.org_datetime_array[34]=22153931.0
PI 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[35]=-271.0 this.org_datetime_array[35]=22153579.0
MH 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[36]=2387.0 this.org_datetime_array[36]=22153263.0
KI 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[37]=-274.0 this.org_datetime_array[37]=22135056.0
DJ 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[38]=-273.0 this.org_datetime_array[38]=22132446.0
FJ 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[39]=-277.0 this.org_datetime_array[39]=22132307.0
DJ 0 Core 1 13:48:51 2012.05.31 14:41:59   BEFORE SORTING org_result_array[40]=-597.0 this.org_datetime_array[40]=22093229.0
NG 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[0]=-279.9 this.org_datetime_array[0]=22307921.0
DF 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[1]=-275.4 this.org_datetime_array[1]=22307227.0
FI 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[2]=-302.5 this.org_datetime_array[2]=22289679.0
HI 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[3]=-281.4999999999999 this.org_datetime_array[3]=22287959.0
GF 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[4]=-274.4 this.org_datetime_array[4]=22276174.0
MI 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[5]=-323.9999999999999 this.org_datetime_array[5]=22276026.0
FG 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[6]=5354.0 this.org_datetime_array[6]=22269123.0
GG 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[7]=1.61390681602331e+116 this.org_datetime_array[7]=22269123.0
PF 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[8]=-249.0 this.org_datetime_array[8]=22196301.0
PK 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[9]=7.869518189098558e-151 this.org_datetime_array[9]=22196301.0
RG 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[10]=-249.0 this.org_datetime_array[10]=22196242.0
LG 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[11]=-250.0 this.org_datetime_array[11]=22195632.0
NF 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[12]=-249.0 this.org_datetime_array[12]=22195447.0
IF 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[13]=-249.0 this.org_datetime_array[13]=22195279.0
MF 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[14]=-249.0 this.org_datetime_array[14]=22194812.0
RI 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[15]=-250.0 this.org_datetime_array[15]=22194448.0
NI 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[16]=-249.0 this.org_datetime_array[16]=22193876.0
LI 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[17]=-315.0 this.org_datetime_array[17]=22188593.0
DH 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[18]=-249.0 this.org_datetime_array[18]=22188401.0
CH 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[19]=-249.0 this.org_datetime_array[19]=22188390.0
JK 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[20]=-318.0 this.org_datetime_array[20]=22178692.0
IK 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[21]=-250.0 this.org_datetime_array[21]=22171680.0
HK 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[22]=-249.0 this.org_datetime_array[22]=22168711.0
PJ 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[23]=-250.0 this.org_datetime_array[23]=22168595.0
RJ 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[24]=-248.9 this.org_datetime_array[24]=22168313.0
HJ 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[25]=-249.5 this.org_datetime_array[25]=22167843.0
QM 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[26]=-249.0 this.org_datetime_array[26]=22165238.0
MM 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[27]=-249.6 this.org_datetime_array[27]=22165036.0
HL 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[28]=-271.0 this.org_datetime_array[28]=22164783.0
LL 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[29]=-256.0 this.org_datetime_array[29]=22161600.0
HL 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[30]=-249.0 this.org_datetime_array[30]=22158602.0
PO 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[31]=-250.0 this.org_datetime_array[31]=22158129.0
MO 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[32]=-249.0 this.org_datetime_array[32]=22157426.0
RO 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[33]=-249.0 this.org_datetime_array[33]=22156983.0
NN 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[34]=-249.0 this.org_datetime_array[34]=22156408.0
MN 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[35]=-249.0 this.org_datetime_array[35]=22154526.0
PQ 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[36]=-249.0 this.org_datetime_array[36]=22153931.0
CQ 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[37]=-271.0 this.org_datetime_array[37]=22153579.0
DP 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[38]=2387.0 this.org_datetime_array[38]=22153263.0
LP 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[39]=-274.0 this.org_datetime_array[39]=22135056.0
IP 0 Core 1 13:48:51 2012.05.31 14:41:59   AFTER SORTING org_result_array[40]=-273.0 this.org_datetime_array[40]=22132446.0

 

УРА!!! Я победил проблему! Проблема заключалась в некорректной передаче массива как элемента объекта по ссылке в функцию сортировки.
Если сначала скопировать массив объекта в обычный массив и потом передавать этот временный массив в функцию сортировки, то никаких неожиданных глюков не происходит. Данные в массивах в небеса не улетают и все переключения лота совпадают. Также практически полностью совпадает итоговый баланс на совместном прогоне валютных пар (отличия микроскопичны).
Ниже приведены результаты тестов, а также код, который я использую для ликвидации глюка. (Обратите внимание, что текущие данные отличаются даже при одиночных прогонах на первой паре от данных, которые были получены до исправления кода -

solandr 2012.09.26 23:16 2012.09.26 23:16:04 )

 

С включенным контролем лота
34 0 0 6487.33 первая пара
0 36 0 5556,60 вторая пара
0 0 168 4374.44 третья пара
34 36 168 16418.47 все три пары
сумма баланса по трём парам 16418,37 (Разница с совместным прогоном 0.1)

С выключенным контролем лота
0 0 0 6702.44 первая пара
0 0 0 5742.89 вторая пара
0 0 0 4358.22 третья пара
0 0 0 16804.53 все три пары
сумма баланса по трём парам 16803.55 (Разница с совместным прогоном 0.98)

double temp_array1[],temp_array2[];
ArrayResize(temp_array1,count);
ArrayResize(temp_array2,count);

        for( index = 0; index < count; index++ )
        {
           temp_array1[index]=this.org_datetime_array[index];
           temp_array2[index]=this.org_result_array[index];
        }



//      Отсортируем "сырой" массив по дате/времени закрытия ордера:
        //SortMasterSlaveArray( this.org_datetime_array, this.org_result_array ); - не всегда корректно работает этот код
        SortMasterSlaveArray(temp_array1,temp_array2);

        for( index = 0; index < count; index++ )
        {
           this.org_datetime_array[index]=temp_array1[index];
           this.org_result_array[index]=temp_array2[index];
        }       

 Поменяйте, пожалуйста, инклюдник в статье, чтобы другие люди по нескольку дней не ломали себе голову расходящимися тестами. Спасибо!

 

ИМХО, здесь надо не инклудник менять, а в сервис-деск писать.

Так не должно быть. А лишнее копирование ни к чему, со всех точек зрения. А вообще, Вы молодец!

Плюсаните себе рейтинга, через сервис-деск))



 

Сообщение для команды MQ:

Уважаемые разработчики MT5, хотелось бы обратить Ваше внимание на некоторую неожиданную проблему, обнаруженную при тестировании на MT5 Build 695 (6 Sep 2012, Терминал Чемпионата-2012, Счёт: 1101505, Сервер: MetaQuotes-Demo), работающем под операционной системой Windows 7 Enterprise (лицензионной, английской). Проблема заключается в необъяснимом искажении данных (массива как элемента объекта), передаваемых по ссылке в функцию сортировки.

В приложении находятся исходники иклюдников ORIGINAL (с ошибкой) и CORRECTED (без ошибки), а также логфайлы работы эксперта, демонстрирующие работу обоих вариантов кода. Ошибка с искажением данных стабильно воспроизводится при одних и тех же заданных условиях тестирования. Обратите, пожалуйста, внимание на логи за 2012.02.24 08:03:40 (данные массивов перепутаны местами) и за 2012.05.31 14:41:59 (даные "улетели в небеса").

Спасибо!

 

 
solandr:

Сообщение для команды MQ:

Уважаемые разработчики MT5, хотелось бы обратить Ваше внимание на некоторую неожиданную проблему, обнаруженную при тестировании на MT5 Build 695 (6 Sep 2012, Терминал Чемпионата-2012, Счёт: 1101505, Сервер: MetaQuotes-Demo), работающем под операционной системой Windows 7 Enterprise (лицензионной, английской). Проблема заключается в необъяснимом искажении данных (массива как элемента объекта), передаваемых по ссылке в функцию сортировки.

В приложении находятся исходники иклюдников ORIGINAL (с ошибкой) и CORRECTED (без ошибки), а также логфайлы работы эксперта, демонстрирующие работу обоих вариантов кода. Ошибка с искажением данных стабильно воспроизводится при одних и тех же заданных условиях тестирования. Обратите, пожалуйста, внимание на логи за 2012.02.24 08:03:40 (данные массивов перепутаны местами) и за 2012.05.31 14:41:59 (даные "улетели в небеса").

Спасибо!

 

Заключение.

Ошибка на стороне пользователя в функции GetTradeResultsArray.

Подготавливается динамический массив на X данных, а заполняется на N (при этом N<X), например при наличии сделки с "чужим" magic.

Перед сортировкой выводятся именно N данных, а в сортировке участвует X, естественно что данные X-N это случайные числа в памяти.
В зависимости от значения, при сортировке они "поднимаются" наверx и выводятся после сортировки в лог.

Решение:
  1) "Подрезать" массив после заполнения до N
  2) Передавать в функцию сортировки N
  3) Инициализировать массив X заведомо большими/малыми данными, которые после сортировки останутся "за бортом".
 
mql5:
Заключение.

Спасибо за очень оперативный ответ! Я думаю автор сделает необходимую коррекцию и разместит в статье обновлённый файл mqh.