Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1617

 
MakarFX #:

а если так

Долго не мог понять почему ваше решение не вызывает бесконечное зацикливание. Тем не менее, оно так же выполняется самостоятельно 1 раз. Но выше решение натолкнуло на создание булевого переключателя.
ulong ms=0;
bool msFlag=0;

void OnTimer(){
  if(msFlag!=0 && GetMicrosecondCount()-ms > 100000){
    ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
    msFlag=0;
  }
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
    if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1"){
      ms=GetMicrosecondCount();
      msFlag=1;
      } 
  }
Теперь код исполняется только по нажатию кнопки. Но что будет если терминал проработает несколько дней? В справке о другом методе возвращающем время, говорится, что будет переполнение.

ulong ms=0;
bool msFlag=0;

int OnInit()
{
    EventSetMillisecondTimer(1);
    ...
}

void OnTimer(){
  if(msFlag!=0 && Seconds() > 20){
    ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
    msFlag=0;
  }
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
    if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1"){
      msFlag=1;
      }
  }
Тот же код но c Seconds() вместо GetMicrosecondCount не работает. "Seconds() > 20" если выше, - кнопка зависает в состоянии "нажато". Если ниже, - работает, но так быстро, что почти незаметно (моргает).
 
Nerd Trader #:
Долго не мог понять почему ваше решение не вызывает бесконечное зацикливание. Тем не менее, оно так же выполняется самостоятельно 1 раз. Но выше решение натолкнуло на создание булевого переключателя.
Теперь код исполняется только по нажатию кнопки. Но что будет если терминал проработает несколько дней? В справке о другом методе возвращающем время, говорится, что будет переполнение.

Тот же код но c Seconds() вместо GetMicrosecondCount не работает. "Seconds() > 20" если выше, - кнопка зависает в состоянии "нажато". Если ниже, - работает, но так быстро, что почти незаметно (моргает).

Тогда так

//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
      if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1")
         {ms=TimeCurrent();}
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(ms!=0&&TimeCurrent()>ms)
     {
      ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
      ms=0;
     }
  }
//+------------------------------------------------------------------+
 
MakarFX #:

Тогда так

Не, так не работает, если с секундами не получилось то с TimeCurrent() тем более. С милесекундами пока единственный рабочий вариант, хоть и с угрозой переполнения.
 
Nerd Trader #:
Не, так не работает, если с секундами не получилось то с TimeCurrent() тем более. С милесекундами пока единственный рабочий вариант, хоть и с угрозой переполнения.
Работает!
 
MakarFX #:
Работает!
ммм у меня не реботает: кнопка не отжимается самостоятельно.
 
Nerd Trader #:
ммм у меня не реботает: кнопка не отжимается самостоятельно.
Сейчас рынок закрыт,  TimeCurrent() не меняется. Проверь на крипте, она работает в выходные
 
MakarFX #:
Сейчас рынок закрыт,  TimeCurrent() не меняется. Проверь на крипте, она работает в выходные
Крипта у моего брокера на выходных не торгуется. Пробовал в тестере, - не работает.
 
Nerd Trader #:
Крипта у моего брокера на выходных не торгуется. Пробовал в тестере, - не работает.
Открой демо А-Маркетс. В тестере таймер не работает.
 

Приветствую! Получаю массив

int arr[]={6,4,6,7,55,55,7,6,77,66,66,2,2};

как изменить его, чтобы все числа присутствовали, но без повторений?

int re[]={6,4,7,55,77,66,2};
 
Galim_V #:

Приветствую! Есть массив

как изменить его, чтобы все числа присутствовали, но без повторений?

Можно так, без применения библиотек

int arr[]= {6,4,6,7,55,55,7,6,77,66,66,2,2};
int re[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  int AS=ArraySize(arr);
  int n=0;
  for(int i=0; i<AS; i++) {
    if(ArraySearch(re, arr[i])==-1) {
      n++;
      ArrayResize(re,n);
      re[n-1]=arr[i];
    }
  }
  ArrayPrint(re);
}
//===============================================================================================
//------------------------------ Функция удаляет копии с массива -------------------------------+
//===============================================================================================
int ArraySearch(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
//+------------------------------------------------------------------+
Причина обращения: