MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1693

 
Taras Slobodyanik # :

IsTesting 대신 IsVisualMode를 사용하는 것이 좋습니다.

IsVisualMode 및 IsTesting 없이 가능합니다.

질문은 다른 것에 관한 것이었습니다.

 

마법에 대해=rand()

현지 테버 전문가들이 일제히 '잡티비'를 외치지 않는 게 이상하다..

여기에서 프로그래밍을 공부하고 있기 때문에 - 망하는 데 시간이 얼마나 걸리는지 확인하십시오. 어느 정도 실제 조건에서 중복 마법을 얻을 가능성은 무엇입니까? 그런 갈퀴를 밟을 가치가 있습니까?

 
Valeriy Yastremskiy # :

그것도 가능합니다. 경기 가능성은 낮습니다.

경기에 대한 추가 확인도 있으므로 모든 것이 정상입니다.

 
Maxim Kuznetsov # :

마법에 대해=rand()

현지 terver 전문가들이 일제히 '잡티비'를 외치지 않는 게 이상하다..

여기에서 프로그래밍을 공부하고 있기 때문에 - 망하는 데 시간이 얼마나 걸리는지 확인하십시오. 어느 정도 실제 조건에서 중복 마법을 얻을 가능성은 무엇입니까? 그런 갈퀴를 밟을 가치가 있습니까?

도움말에서:
"반복되지 않는 시퀀스를 얻으려면 GetTickCount() 가 운영 체제 시작 이후 증가하고 49일 동안 반복되지 않으므로 MathSrand(GetTickCount()) 호출을 사용하십시오."

 
MakarFX # :
오, 작동합니다, 감사합니다... 아하, 이제서야 버튼을 누를 때마다 150개의 주문을 멈추지 않고 엽니다...

그랬다

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

현지 terver 전문가들이 일제히 '잡티비'를 외치지 않는 게 이상하다..

설득하다, 논쟁하다-아무도 원하지 않고, 사람이 공부하고, 공부하게하십시오. 그는 모든 것에 올 것입니다.

 
Maxim Kuznetsov # :

마법에 대해=rand()

현지 terver 전문가들이 일제히 '잡티비'를 외치지 않은 게 이상하다..

///

글쎄, 당신은 얼마나 할 수 있습니까?

 
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))

왜 "!" ? 열거형이 선택되는 이유는 무엇입니까?

 

왜 이렇게 했는지 모르겠지만 본질적으로 Boolean 함수입니다.


아마도 저자는 다음과 같이 생각했을 것입니다.

열거형에서 요소는 0부터 시작합니다. Ok=0, AllocError=1

즉, GetRepeat는 0 또는 1을 반환합니다.

그리고 cpp 언어에서: 0은 거짓, 1은 참,

각각 ! GetRepeat는 반환 값의 부정입니다.


당신은 당신 자신과 사람들의 머리를 속이지 않는 것이 너무 쉽기 때문에 당신의 머리를 부러뜨릴 수 있습니다.

 bool GetRepeat(...)
   {
   ...
   return ArrayResize (ret,ii)==ii;
   }