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

 
Taras Slobodyanik #:

лучше использовать IsVisualMode вместо IsTesting

Можно и без IsVisualMode и без IsTesting

Вопрос был о другом

 

про magic=rand()

странно что местные знатоки тервера не воскликнули хором "Йобтв"..

раз уж изучаете программирование тут - проверьте сколько времени до факапа. Какие шансы получить дубликат magic в боле-менее реальных условиях ? и стоит ли наступать на такие грабли

 
Valeriy Yastremskiy #:

Так тоже можно. Вероятность совпадения мала.

ещё дополнительная проверка есть на совпадение, так что всё оки доки.

 
Maxim Kuznetsov #:

про magic=rand()

странно что местные знатоки тервера не воскликнули хором "Йобтв"..

раз уж изучаете программирование тут - проверьте сколько времени до факапа. Какие шансы получить дубликат magic в боле-менее реальных условиях ? и стоит ли наступать на такие грабли

Из справки:
"Для гарантированного получения неповторяющейся последовательности используйте вызов MathSrand(GetTickCount()), так как значение GetTickCount() увеличивается с момента запуска операционной системы и не повторяется в течение 49 дней"

 
MakarFX #:
о, так работает, спасибо... ахах, только теперь по кнопке у меня открывается 150 ордеров каждый тик без остановки...

сделал так

if (IsTesting()) 
     {
      if(ObjectGetInteger(0,"button1",OBJPROP_STATE)==true)
        {
          ...
          ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
        }
     }
 
Maxim Kuznetsov #:

странно что местные знатоки тервера не воскликнули хором "Йобтв"..

убеждать-спорить - никто не хочет, человек учится пусть учится.. сам до всего дойдет

 
Maxim Kuznetsov #:

про magic=rand()

странно что местные знатоки тервера не воскликнули хором "Йобтв"..

///

Дак, а сколько можно?

 
Nerd Trader #:
о, так работает, спасибо... ахах, только теперь по кнопке у меня открывается 150 ордеров каждый тик без остановки...

сделал так

Сделай так

if (IsTesting()) 
     {
      if(ObjectGetInteger(0,"button1",OBJPROP_STATE)==true)
        {
          ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
          ...
        }
     }
 

Скрипт с просторов этой ветки

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
enum EResult {Ok,AllocError};

template<typename T>
EResult GetRepeat(const T &arr[],T &ret[],uint count)
  {
   int size=ArraySize(arr);   // Присваиваем переменной количество элементов массива arr
   if(ArrayResize(ret,size)!=size)
      return AllocError;// Устанавливаем новый размер массиву ret, равный size
   int ii=0;
   for(int i=0; i<size;)
     {
      T tmp=arr[i];        // переменная перегруженной функции с значениями массива arr
      uint repeatCount=1;  // будем считать одинаковые подряд значения массива arr
      while(++i<size&&arr[i]==tmp) // если следующее значение то же
         ++repeatCount;              // плюсуем repeatCount
      if(repeatCount>=count)
         ret[ii++]=tmp;
     }
   return ArrayResize(ret,ii)==ii?Ok:AllocError;// новый размер массива ret
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int si=0;
   int arr[]= {1,2,4,4,4,4,4,4,7,55,55,7,7,7,7,79,77,66,66,2,2,2,2,2};
   int ret[];
   if(!GetRepeat(arr,ret,cou))
      si=ArraySize(ret);
   for(int i=0; i<si; i++)
      Print(si," ret[i] =",ret[i]);
  }    
//+------------------------------------------------------------------+

Не понимаю эту строку

if(!GetRepeat(arr,ret,cou))

Почему с "!" ? Почему выбран перечислимый тип?

 

Не знаю зачем так сделано, но по своей сути это функция булева.


Наверное, автор думал как-то так:

В enum элементы начинаются с нуля: Ok=0, AllocError=1

то есть GetRepeat возвращает либо 0, либо 1,

а в языке срр: 0-это ложь, 1-истина,

соответственно ! GetRepeat - это отрицание возвращаемого значения


Голову можно сломать, ведь так просто не морочить себе и людям голову:

bool GetRepeat(...)
   {
   ...
   return ArrayResize(ret,ii)==ii;
   }
Причина обращения: