Разработчикам и кому интересно - WHILE неравильно работает в тестере (вообще не работает с переменной на основе времени) - страница 2

 
Yugo2 >>:

Терминал 224. бибиотеки и импорт из DLL включены. уточню ситуацию. С проверкой через Print() и ВЫКЛюченном Comment'е  это выглядит так:

видно что циклы проходят, но показания кода и терминала явно расходятся. А вот если Comment включить, то графика кода вполне успевает за терминалом. Вариации с расположением RefreshRates(), Comment() и Print() ничего не меняют. Вот и ломаю голову - почему эта строчка Comment так влияет на цикл. Или на графику. Или плюнуть на всё.

Доброго времени суток! Дьявол меня побери - что сразу не заметил! А вот очевидная недоработка в том, что UpDate идет N раз в секунду через интервал t секунд, а тиков может быть за эту секунду штук 5-8 это не вариант? Может сделать updatesecond покороче? т.е. в строке 


{Sleep (1000*updatesecond);

Вместо 0.3 поставить 0.05. И Comment здесь ни причем окажется. Проверьте сколько времени уходит на 1 цикл. Если между тиками цены меньше времени, чем один проход While - то дело именно в этом. Поставьте первой строкой в While.

int starttime, worktime; starttime=GetTickCount();

А последней

worktime=((GetTickCount()-starttime); Print (worktime);

worktime может оказаться не 0,3 секунды, а например 0,4, в то время как между тиками всего лишь 0,18 (например) - вот она и не успевает отработать вовремя. Пока новых мыслей на эту тему больше не имею. За сим до новых встреч. Желаю удачи!

P.S.Чтоб у вас все было и вам за это ничего не было.

 
AlexTrader0618 >>:

Доброго времени суток! Дьявол меня побери - что сразу не заметил! А вот очевидная недоработка в том, что UpDate идет N раз в секунду через интервал t секунд, а тиков может быть за эту секунду штук 5-8 это не вариант? Может сделать updatesecond покороче? т.е. в строке 


{Sleep (1000*updatesecond);

Вместо 0.3 поставить 0.05. И Comment здесь ни причем окажется. Проверьте сколько времени уходит на 1 цикл. Если между тиками цены меньше времени, чем один проход While - то дело именно в этом. Поставьте первой строкой в While.

int starttime, worktime; starttime=GetTickCount();

А последней

worktime=((GetTickCount()-starttime); Print (worktime);

worktime может оказаться не 0,3 секунды, а например 0,4, в то время как между тиками всего лишь 0,18 (например) - вот она и не успевает отработать вовремя. Пока новых мыслей на эту тему больше не имею. За сим до новых встреч. Желаю удачи!

P.S.Чтоб у вас все было и вам за это ничего не было.

 

Доброго времени суток! (снова здорово!) Похоже - ваша проблема может быть решена вот так. Добавьте перед вызовом функции одну команду:


int start()
{while (IsExpertEnabled())
{Sleep (1000*updatesecond);
RefreshRates();
WindowRedraw();
CurrentProfitAll = GetProfitOpenPosInCurrency("", -1, Magic, Comments);
SetLabel("1", DoubleToStr(CurrentProfitAll,2), "Arial Black",Red, Set_X, Set_Y, 1, 10);
SetLabel("2", "CurrentProfit", "Arial Black",Red, Set_X+80, Set_Y, 1, 10);
}
return(0);
}


Не уверен на 100%, но это возможно решит проблемму.

P.S.Чтоб у вас все было и вам за это ничего не было.

 
AlexTrader0618 >>:

Доброго времени суток! (снова здорово!) Похоже - ваша проблема может быть решена вот так. Добавьте перед вызовом функции одну команду:


int start()
{while (IsExpertEnabled())
{Sleep (1000*updatesecond);
RefreshRates();
WindowRedraw();
CurrentProfitAll = GetProfitOpenPosInCurrency("", -1, Magic, Comments);
SetLabel("1", DoubleToStr(CurrentProfitAll,2), "Arial Black",Red, Set_X, Set_Y, 1, 10);
SetLabel("2", "CurrentProfit", "Arial Black",Red, Set_X+80, Set_Y, 1, 10);
}
return(0);
}


Не уверен на 100%, но это возможно решит проблемму.

P.S.Чтоб у вас все было и вам за это ничего не было.

спасибо. WindowRedraw(); на самом деле помогло. значит проблема была в отрисовке графики. между тиками цены меньше времени, чем один проход While - это конечно так. если бы надо было отследить один инструмент, то и While не нужен. идея такова- открыто около 50 поз по 12-15 валютным парам. пары разбиты на 5-7 групп, каждая имеет свой целевой профит и стоп. скрипт набирал чтоб отследить текущий профит группы.  обновить 3-5 раз в секунду вполне приемлемо. В любом случае спасибо за идею с WindowRedraw().

 
Yugo2 >>:

спасибо. WindowRedraw(); на самом деле помогло. значит проблема была в отрисовке графики. между тиками цены меньше времени, чем один проход While - это конечно так. если бы надо было отследить один инструмент, то и While не нужен. идея такова- открыто около 50 поз по 12-15 валютным парам. пары разбиты на 5-7 групп, каждая имеет свой целевой профит и стоп. скрипт набирал чтоб отследить текущий профит группы.  обновить 3-5 раз в секунду вполне приемлемо. В любом случае спасибо за идею с WindowRedraw().

Пожалуйста! :) Я сам случайно задним умом допер - что срок жизни объекта в окне и его (самого окна) срок обновления не совпадают. Так и появилась идея о том, что Comment (являясь частью окна) заставляет его (окно) перерисовываться принудительно. Век живи - век учись. . . А дураком помрешь (поговорка).

Я тут тоже 3 ночи не мог сообразить с какого перепуга у меня Советник до 2007 года тестится с ошибками, а после нормально - оказалось дело во введении Диллинговым центом 5-го знака с 2008г. Вот так - Чем больше знаешь - тем больше понимаешь, что ничего не знаешь. . . Удачи в разработках.

P.S. Чтоб у вас все было и вам за это ничего не было.

Причина обращения: