Некорректная работа функций в OnTimer

 

Здравствуйте.

Помогите разобраться.

Стоит задача вызывать таймер по событию, который будет циклично менять цвет фона графика. То есть своего рода мигание. 

Вот код


  void OnTimer () {

 color result;

 result = ChartGetInteger(0,CHART_COLOR_BACKGROUND);

 ChartSetInteger(0,CHART_COLOR_BACKGROUND,clrRed);

Print ("Смена цвета на красный");

 Sleep(1000);

 ChartSetInteger(0,CHART_COLOR_BACKGROUND,result);

Print ("Смена цвета на обычный");

   }

То есть при вызове таймер запоминаем текущий цвет графика, меняем на красный и через секунду снова как было. Таймер вызывается каждые 2 секунды. Но вот проблема в том, что смена цвета фона происходит как попало, раз в 10 сек, или 5. Нет равномерной цикличности.

Принты работают четко, каждую секунду. А вот функция смены цвета не срабатывает при каждом вызове, все хаотично. Пробовал поставить смену цвета на каждом тике, тоже самое. Меняет цвет как попало, через тик или два. В чем может быть проблема ? Почему смена цвета не срабатывает при каждом вызове ?

 
Artem Rytuhin:

Здравствуйте.

Помогите разобраться.

Стоит задача вызывать таймер по событию, который будет циклично менять цвет фона графика. То есть своего рода мигание. 

Вот код


  void OnTimer () {

 color result;

 result = ChartGetInteger(0,CHART_COLOR_BACKGROUND);

 ChartSetInteger(0,CHART_COLOR_BACKGROUND,clrRed);

Print ("Смена цвета на красный");

 Sleep(1000);

 ChartSetInteger(0,CHART_COLOR_BACKGROUND,result);

Print ("Смена цвета на обычный");

   }

То есть при вызове таймер запоминаем текущий цвет графика, меняем на красный и через секунду снова как было. Таймер вызывается каждые 2 секунды. Но вот проблема в том, что смена цвета фона происходит как попало, раз в 10 сек, или 5. Нет равномерной цикличности.

Принты работают четко, каждую секунду. А вот функция смены цвета не срабатывает при каждом вызове, все хаотично. Пробовал поставить смену цвета на каждом тике, тоже самое. Меняет цвет как попало, через тик или два. В чем может быть проблема ? Почему смена цвета не срабатывает при каждом вызове ?

А так?

 void OnTimer () {

 color result;

 result = ChartGetInteger(0,CHART_COLOR_BACKGROUND);

 ChartSetInteger(0,CHART_COLOR_BACKGROUND,clrRed);
ChartRedraw();

Print ("Смена цвета на красный");

 Sleep(1000);

 ChartSetInteger(0,CHART_COLOR_BACKGROUND,result);
ChartRedraw();

Print ("Смена цвета на обычный");

   }
 
Заработало спасибо!!
 

Зачем же таймер, если в нем применяется Sleep? Все намного проще:

color g_clrDefaultColor = clrNONE;

int OnInit()
{
   g_clrDefaultColor = ChartGetInteger(0,CHART_COLOR_BACKGROUND);
...
}

void OnTimer () 
{
   color clrNewColor = (ChartGetInteger(0,CHART_COLOR_BACKGROUND) == g_clrDefaultColor)? clrRed : g_clrDefaultColor;
   ChartSetInteger(0, CHART_COLOR_BACKGROUND, clrNewColor);
   ChartRedraw();
}
 

Добрый вечер всем. 

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

1 Вот историю сделок и ордеров по магику не могу получить

2.Нормализация не всегда работает.

3. редактор при долгой работе перестает фиксировать изменения.

4. Самый свежий глюк, но допускаю что это у меня глюк. :=)

 попробовал найти последнюю сделку или ордер в истории. Алгоритм простейший. Но изумлению не было предела! последние ордер и сделка не показывают свой магик. А когда они становятся предпоследними то показывают!

  if((HistorySelect(0,TimeCurrent())))

   {

    int   DealsTotal=HistoryDealsTotal();

    ulong ticket;

   DealsTotal=HistoryDealsTotal();

    if(DealsTotal>0)

     { 

      for(int i=DealsTotal-1; i>=0; i--)

       {

        ticket = HistoryDealGetTicket(i);

         {

          if((HistoryDealGetInteger(ticket ,DEAL_TYPE)==DEAL_TYPE_BUY))

           {

             Alert("  _Magic  ",DealInfo.Magic());

            Alert("последняя закрытая сделка Buy ",ticket);

            break;

           }

          if((HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_SELL))

           {

             Alert("  _Magic  ",DealInfo.Magic());

            Alert("последняя закрытая сделка SELL ",ticket);

            break;

           }

      }}}

 
Amon1953:

Добрый вечер всем. 

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

используйте OnTradeTransaction (TRADE_TRANSACTION_HISTORY_ADD), информация не сразу появляется в истории.

 
Taras Slobodyanik:

используйте OnTradeTransaction (TRADE_TRANSACTION_HISTORY_ADD), информация не сразу появляется в истории.

Я просматриваю и загружаю через 2 дня после совершения сделки. Вижу в истории в МТ5 , но функция его не видит. 

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