| / | Форум |
|
Kadet
27.02.2011 20:08
Перелопатил половину форума, но так и не пойму откуда возникает эта ошибка. Советник массивный, состоит из программы, подпрограммы и нескольких библиотек. Использую от 1 до 32 различных индикаторов. И вот пока количество индикаторов где-то до 10-15 этой ошибки почти не встречается, но стоит загрузить его на полную катушку - тут же выскакивает эта ошибка. И то, не всегда, но часто. Уже пробовал и нормализовывать все данные, но не помогает. И честно говоря, пока даже не могу определить даже место появления этой ошибки. В пояснение - мультиперцептронная нейросеть с двумя слоями. |
|
Организуйте багтрекинг и техсаппорт для своей компании В TeamWox имеются все для того чтобы организовать багтрекинг. Интегрировав модуль Сервисдеск с веб-сайтом, Вы сможете получать заявки своих клиентов напрямую в TeamWox. Более того, вся переписка с клиентами автоматически распознается и попадает в архив, где ее без труда можно найти в будущем. |
|
abolk
27.02.2011 20:11
Kadet:
Перелопатил половину форума, но так и не пойму откуда возникает эта ошибка. Советник массивный, состоит из программы, подпрограммы и нескольких библиотек. Использую от 1 до 32 различных индикаторов. И вот пока количество индикаторов где-то до 10-15 этой ошибки почти не встречается, но стоит загрузить его на полную катушку - тут же выскакивает эта ошибка. И то, не всегда, но часто. Уже пробовал и нормализовывать все данные, но не помогает. И честно говоря, пока даже не могу определить даже место появления этой ошибки. В пояснение - мультиперцептронная нейросеть с двумя слоями.
отловить можно принтами |
|
Zhunko
27.02.2011 20:11
Это всегда деление на ноль. Если подобные случаи с момента написания кода не выделяются отладочными средствами, то в большом коде это проблема найти. У меня советник 40000 строк. Написал для него отладчик на MQL4. Нахожу любую ошибку за несколько секунд. |
|
Roger
27.02.2011 20:15
Kadet: Перелопатил половину форума, но так и не пойму откуда возникает эта ошибка. Проще не скажешь - деление на нуль. Ищите все арифметические выражения, где есть деление. Везде, где есть деление, лучше употреблять шаблон If(b!=0) c=a/b; else c=a (или другой заменитель). |
|
Zhunko
27.02.2011 20:18
Roger: Проще не скажешь - деление на нуль. Ищите все арифметические выражения, где есть деление. Везде, где есть деление, лучше употреблять шаблон If(b!=0) c=a/b; else c=a (или другой заменитель). Да! Лучшен сразу в принт выводить с указанием блока, функции и программы. А то хрен найдёшь... Хотя, это может быть штатная ситуация. Тогда надо придумать свои замены результату деления. |
|
alsu
27.02.2011 20:25
Соглсен на все 100. В свое время просто вбил себе в голову: если собрался на что-то делить - проверь, не на ноль ли! С тех пор сэкономил минимум пару лет личного и рабочего времени:))
|
|
leonid553
27.02.2011 20:30
Деление на Point - может быть причиной этой ошибки. |
|
Svinozavr
27.02.2011 20:35
Боже... И вы еще программируете... Ну вот вам уже объяснили: Используйте конструкцию if знаменатель !=0... Тады делим. Можно в else прописать печать. Ну вот что сложного??? === Не! Есть еще у кого бабки брать! )))) // Ace Ventura: Pet Cemetry.!!! |
|
Integer
27.02.2011 20:49
Kadet: Перелопатил половину форума, но так и не пойму откуда возникает эта ошибка. Советник массивный, состоит из программы, подпрограммы и нескольких библиотек. Использую от 1 до 32 различных индикаторов. И вот пока количество индикаторов где-то до 10-15 этой ошибки почти не встречается, но стоит загрузить его на полную катушку - тут же выскакивает эта ошибка. И то, не всегда, но часто. Уже пробовал и нормализовывать все данные, но не помогает. И честно говоря, пока даже не могу определить даже место появления этой ошибки. В пояснение - мультиперцептронная нейросеть с двумя слоями.
|
|
Kadet
27.02.2011 23:16
Та то, что это деление на ноль - это и коню понятно. Не понятно откуда оно берётся, ведь при малых объёмах данных его нет, а как только задашь в работу 20-30 рабочих индикаторов - так и выскакивает. При 10-15 индикаторах - великолепно работает, но хочется более точных прогнозов. Вот и пытаюсь задать больше вариантов. К тому же if-ы перед всеми возможными делениями - пробовал. Не помогло. И нормализацию пробовал. Тоже не помогло. Вот подозреваю вот это место, при расчёте логарифма. Там используются максимально большие и минимально малые значения (таких два куска симметричных за исключением мелочей), которые, возможно, из-за нехватки разрядности и представляются как "0". Может они и вылетают как "0", хотя не должны. А за идею с print-ами большое спасибо. Сам её частенько использую, а тут что-то не догадался. //+------------------------------------------------------------------------------+ //| | //| Возвращения T*Ln (T/Z), предотвращающий выход за пределы потока | //| Внутреннzz подпрограммы. | //| | //+------------------------------------------------------------------------------+ double SafeCrossEntropy( double T, double Z ){ //-------------------------------------------- double Result, R; //-------------------------------------------- // Print("Процедура проверки порогов."); //-------------------------------------------- if( T==0 ) return(0); else { if( MathAbs(Z)>1 ) // Shouldn//t be the case with softmax, // but we just want to be sure. if( T/Z==0 ) R = MathPow(0.1,300); // MinRealNumber; else R = MathAbs(T/Z); else // В нормальном случае if( (Z==0) || (MathAbs(T)>=MathPow(10.0,300)*MathAbs(Z)) ) // MaxRealNumber*MathAbs(Z) ) R = MathPow(10.0,300); // MaxRealNumber; else R = MathAbs(T/Z); Result = T*MathLog(R); // MathLog(R); } return(Result); } |
|
Trader108
27.02.2011 23:18
Один раз такое у меня было при присваивании double-значений int-переменным, которые их просто обнуляли и получалось zero divide. Отладка - через пошаговое /* */ комментирование кусков всего кода пока не будет найден и исключен проблемный. |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий