Проблема с исполнением алгоритма, нужно мнение/консультация/помощь разработчиков.

 

Это описание не проблемки неправильное, правильно обрисовал, двумя постами ниже

В эксперте есть внешние логические переменные управляющие логикой эксперта. При использование в тестере периодически наблюдаю, что их изменения не всегда отслеживаются. Т.е. после очередного мучания эксперта в тестере, меняю какую либо логическую переменную, снова запускаю тестирование/оптимизацию, но тестер не видит этого изменения переменной. Все проверяю, тыкаю-выбираю эти переменные десяток раз, толку ноль... Но стоит только перекомпилировать эксперт (без всяких изменений), все становится нормально... Как на войне, приходится постоянно проверять переключился ли эксперт в нужный режим)

Подумалось, что это единственная переменная выбираемая посредством дропдаун меню, может там что "упущено" и "подглючивает"? Ведь периодически то все работает. Никто не сталкивался с подобным? Пробовал переделать эти переключатели на целочисленые с логикой (0/1), проблема исчезает, но как-то не прозрачно получается для пользователя... Пока не придумал как продемонстрировать и донести эту "ошибку? на люди", плавает как-то, но буду пытаться)

 
Figar0 >>:

Подумалось, что это единственная переменная выбираемая посредством дропдаун меню, может там что "упущено" и "подглючивает"?

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

Если писать к внешним переменным описания, проблем с пониманием не будет.

 

Всем доброго дня!


Возможная причина - операции присвоения значений внешним переменным.
Внешние переменные лучше использовать как "read only".


С уважением,
Ais

 

Да, похоже я зря грешил на логические внешние переменные, не в них дело, с целочисленными переменными ошибка тоже проявляется. Кажется начинаю понимать в какую сторону думать. Попробую обрисовать проблему подробнее. Вот в кратце структура программы:

extern int Swicher=0;
extern int x=0;
extern int y=0;
extern int z=0;

int start()
{
  if (Switcher<1)
  {
    Print("Вариант1");
    Operation=Function1(x,y,z);
  }
  if (Switcher>0)
  {
     Print("Вариант2");     
     Operation=Function2(x,y,z);
  }
  // тра-та-та и прочие торговые операции
}

int Function1(int x1,int y1, int z1)
{
/// анализ по первому алгоритму и возврат кода операции
}

int Function2(int x2,int y2, int z2)
{
/// анализ по второму алгоритму и возврат кода операции
}

Мне необходимо оптимизировать по отдельности, с логикой алгоритма 1, затем 2. Switcher ставим в 0, и без проблем оптимизируем часок-другой алгоритм в первой функции. Затем, ставим Switcher=1 и пытаемся тестировать или оптимизировать по алгоритму в функции 2. Фигушки. Switcher срабатывает, Print("Вариант2"); печатает, но вызов функции 2 не происходит (В функциях тоже есть принты, и во 2ой функции он не срабатывает). Но чудо, стоит перекомпилировать эксперт, и все снова работает, и Switcher, и вызов соответствующих функций, и принты.

_______________________

Мысли. Тема не моя, могу плавать пальцем в небо, но со стороны пользователя выглядит именно так. В какой-то момент тестер исключает из исполняемого кода, не кода эксперта ex4, а какого-то своего внутреннего исполняемого или байт кода хронически неиспользуемую функцию 2, с целью облегчить, убыстрить оптимизацию или еще какой... При последующих попытках изменения Switcher, он использует этот сидящий внутри код в котором этой функции не находит (или не верит что она востребовалась?:), но ошибку "выдавать поздно", не тот уровень, тут исполнять надо, а нечего и в стандартные исключения, типа деления на 0 это не входит. После перекомпиляции этот внутренний код благополучно обновляется и все работает.

Окружение: WinXP SP3 все обновления, MT4 билд 223 тутошний и Альпаришный, код эксперта простой и несекретный могу выслать, на всяк случай смотрело 2 человека с опытом MQL4 более пары лет на предмет совсем очевидных ошибок, но сдается дело не в эксперте... Хотя и на трех старух бывает проруха, но маловероятно.

_______________________

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

З.Ы. И может именно отсюда растут ноги периодически возникающих у форумчан проблем решаемых тоже перекомпиляцией эксперта...

 

Кхм...

Тоже самое... заметил в прошлые выходные, когда мучал тестер.

Допустим есть глобальные переменные:

//--- так:
extern int SL=100;
extern int TP=100;
//--- или так, без разницы для сути:
int SL=100;
int TP=100;

а затем в едиторе меняю значения, например на 50, компилирую и...

В свойствах экперта всё теже, предыдущие значения, в данном случае 100.

Пробы решения проблемы в виде останова эксперта, снятия с тестинга её не решали.

Единственное что вроде спасало, так это закрытие окна тестера с последующим его открытием...

*

Впрочем на следующие выходные, когда снова займусь прогоном запишу более подробнее.

 
kombat писал(а) >>

Кхм...

Тоже самое... заметил в прошлые выходные, когда мучал тестер.

Допустим есть глобальные переменные:

extern int SL=100;
extern int TP=100;

Это немножко другое, значения внешних параметров эксперта, именно внешних указанных через extern могут хранится в файлах "имя эксперта".ini в директории ../tester/, а в какой момент обновляются эти файлы, я даже не знаю..)

А вот если это касается, просто глобальных переменных программы:

int SL=100;
int TP=100;
Вот тогда, это возможно имеет отношение к описаной мной проблеме...
 
Figar0 >>:

Это немножко другое, значения внешних параметров эксперта, именно внешних указанных через extern могут хранится в файлах "имя эксперта".ini в директории ../tester/, а в какой момент обновляются эти файлы, я даже не знаю..)

А вот если это касается, просто глобальных переменных программы:

Вот тогда, это возможно имеет отношение к описаной мной проблеме...

Глянул текст эксперта что гонял, там так:

int SL=100;
int TP=100;
int slipp=100;
int MagOS=111;
double Lots=2;

так что работал только с интами без эктерна...

*

Экстерны кстати не очень юзаю для экпертов.

Ибо менять в процессе не представляю особого смысла,

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

Файлы эксперт.ини тож не юзаю...

 

Не совсем по теме, но близко:

Если эксперт остановлен при визуальном тестировании кнопкой Pause, компиляция эксперта с новым параметрами не меняет параметров работающего эксперта. Ясно как день, но интересно дальше. После окончания прогона при следующем запуске новые данные не появятся, пока не нажмешь Сброс.

Поэтому выработалась привычка всегда сбрасывать свойства после компиляции.

 
Figar0 >>:

Switcher срабатывает, Print("Вариант2"); печатает, но вызов функции 2 не происходит

Попробуйте поменять местами    Operation=Function2(x,y,z); и   Operation=Function1(x,y,z);

if (Switcher<1)
{Print("Вариант1");
                      Operation=Function2(x,y,z);}
if (Switcher>0)
{Print("Вариант2");
                      Operation=Function1(x,y,z);}

  , если будет тоже самое но уже с Print("Вариант1"); значит дело в самой Function2(x,y,z); погоняйте её без оболочки.

PS . это не существенно но если у вас параметр срабатывания одновариантный то лучше использовать (Switcher==1),(Switcher==0)

меньше проблем в дальнейшей разработке, не нужно следить чтоб условия не накладывались.