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

 
Alexey Viktorov :

배열 요소를 추가할 때마다 배열을 정렬할 필요가 없습니다. 더 나은 정렬

도움에서

Mas[Blizko2]는 배열에서 다음으로 작은 값입니다.

답변 해주셔서 감사합니다! 배열의 다음 요소를 결정하기 위해 이미 찾은 요소 +1을 사용했지만 테스터에서는 이 위치에서 오류가 발생합니다.

 double Mas[];                                                                 //массив для упорядочивания всех ордеров
   for ( int i= 0 ; i< OrdersTotal (); i++)                                           // Цикл перебора ордер
   {
     if ( OrderSelect (i, SELECT_BY_POS ))                                           // Если есть следующий
     {
       Price= OrderOpenPrice ();
       ArrayResize (Mas, i+ 1 );                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas, WHOLE_ARRAY , 0 , MODE_DESCEND );                           // Теперь цены открытия упорядочены по убыванию
     }
   } 
   if ( ArraySize (Mas)> 1 )                                                         //Если массив не пустой
   
         { 
         int Blizko2= ArrayBsearch (Mas, Ask , WHOLE_ARRAY , 0 , MODE_DESCEND );           //Определен индекс ближайшего большего по значению елемента к текущей цене
        

        Mas[Blizko2+ 1 ]= Blizko1;      // В этой строке перед квадратной скобкой выдает ошибку!                            //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                       // Цена выбранного ордера   

그리고 다음 요소를 정의해야 합니다. 분명히 +1이지만 프로그램에서 오류가 발생합니다! 다른 방법이 있습니까, 아니면 제가 잘못하고 있습니까? 말해주세요)

Blizko1 = Mas[Blizko2]+ 1 ;

아니면 이렇게??

하지만 데이터 손실 가능성에 대한 경고를 컴파일할 때

 
vikzip :

그런 디자인으로

Blizko1 = Mas[Blizko2]+ 1 ;

Blizko2 인덱스가 있는 셀에서 얻은 값에 1을 더하면 가격이 거기에 저장됩니다. 정수 1을 추가합니다. 경고를 피하려면 +1.0을 작성해야 합니다.

그러나 이것은 인덱스가 아니라 Blizko2 인덱스의 Mas[] 배열에 저장된 값에 하나를 추가하기 때문에 "러시아 민주주의의 아버지"를 저장하지 않습니다.

따라서 자연스럽게 가까운 배열 셀에서 값을 얻으려면 인덱스에 1을 더하거나 빼야 합니다.그러나 여기에서 당신이 우연히 발견한 오류가 구성됩니다: 인덱스가 배열의 극단 셀을 가리키는 경우 - 0 또는 마지막 것, 1 빼기( 0에서) 또는 1 더하기(가장 최근에) 배열을 넘어서게 될 것입니다. 거기에는 그러한 셀이 없습니다. 따라서 Blizko2+1이 ArraySize(Mas)-1보다 크지 않거나 Blizko2-1이 0보다 작지 않은지 확인해야 합니다.

그리고... 루프를 반복할 때마다 배열을 정렬할 필요가 없다고 들었습니다. 브레이크가 필요합니까?

배열의 크기가 1보다 큰지 확인한 후 정렬해야 합니다.

그러나 이 디자인은 일반적으로 다음과 같은 이유가 명확하지 않습니다.

 int Blizko2= ArrayBsearch (Mas, Ask , WHOLE_ARRAY , 0 , MODE_DESCEND );           //Определен индекс ближайшего большего по значению елемента к текущей цене

Mas[Blizko2+ 1 ]= Blizko1; // В этой строке перед квадратной скобкой выдает ошибку! //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                       // Цена выбранного ордера   

보세요: Blizko2에는 가격이 포함된 배열 셀의 인덱스가 있습니다.
다음으로, Blizko2+1 셀의 배열에 Blizko1 변수에 포함된 값(왜???)을 작성합니다. 거기에도 가격이 있어야 하며 이해할 수 없는 값으로 채워야 합니다.

실제로 무엇을 하고 있는지 파악해야 합니다. 함수의 모든 줄에 주석을 달기만 하면 됩니다. 사려 깊게.

 
Artyom Trishkin :

그런 디자인으로

Blizko2 인덱스가 있는 셀에서 얻은 값에 1을 더하면 가격이 거기에 저장됩니다. 정수 1을 추가합니다. 경고를 피하려면 +1.0을 작성해야 합니다.

그러나 이것은 인덱스가 아니라 Blizko2 인덱스의 Mas[] 배열에 저장된 값에 하나를 추가하기 때문에 "러시아 민주주의의 아버지"를 저장하지 않습니다.

따라서 자연스럽게 가까운 배열 셀에서 값을 얻으려면 인덱스에 1을 더하거나 빼야 합니다.그러나 여기에서 실수로 오류가 구성됩니다. 0 또는 마지막 것, 1 빼기( 0에서) 또는 1 더하기(가장 최근에) 배열을 넘어서게 될 것입니다. 거기에는 그러한 셀이 없습니다. 따라서 Blizko2+1이 ArraySize(Mas)-1보다 크지 않거나 Blizko2-1이 0보다 작지 않은지 확인해야 합니다.

그리고... 루프를 반복할 때마다 배열을 정렬할 필요가 없다고 들었습니다. 브레이크가 필요합니까?

배열의 크기가 1보다 큰지 확인한 후 정렬해야 합니다.

그러나 이 디자인은 일반적으로 다음과 같은 이유가 명확하지 않습니다.

보세요: Blizko2에는 가격이 포함된 배열 셀의 인덱스가 있습니다.
다음으로, Blizko2+1 셀의 배열에 Blizko1 변수에 포함된 값(왜???)을 작성합니다. 거기에도 가격이 있어야 하며 이해할 수 없는 값으로 채워야 합니다.

실제로 무엇을 하고 있는지 파악해야 합니다. 함수의 모든 줄에 주석을 달기만 하면 됩니다. 사려 깊게.


의미있는 답변 감사합니다! 배열을 생성하려는 목적은 가격보다 낮거나 높은 경우 가장 가까운 주문의 가격을 결정하는 것입니다. 그리고 그들이 있고 가격까지의 거리가 특정 거리를 초과하면 해당 주문을 엽니 다. 이런 모습이어야 한다고 생각했어요 (여기서 내 행동의 논리를 최대한 설명했습니다)

 //---Создаем массив для учета всех ордеров в терминале
   double Price;                                                               // Цена выбранного ордера
   double Mas[];                                                                 //массив для упорядочивания всех ордеров
   for ( int i= 0 ; i< OrdersTotal (); i++)                                           // Цикл перебора ордер
   {
     if ( OrderSelect (i, SELECT_BY_POS ))                                           // Если есть следующий
     {
       Price= OrderOpenPrice ();                                                 //Цена ордера
       ArrayResize (Mas, i+ 1 );                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas, WHOLE_ARRAY , 0 , MODE_DESCEND );                           // Теперь цены открытия упорядочены по убыванию. Я намеренно сортирую массив, потому что ордера добовляются в него в том порядке в котором появляются в 
                                                                             //терминале и не сортируются по убыванию(Верно ли это мое утверждение??)А мне необходимо позже точно определить ближайший ордер выше и ниже цены

     }
   } 
   if ( ArraySize (Mas)> 1 )                                                         //Если массив не пустой
   
         { 
         int Blizko2= ArrayBsearch (Mas, Ask , WHOLE_ARRAY , 0 , MODE_DESCEND );           //Определен индекс ближайшего большего по значению елемента к текущей цене
                                                                               //Здесь я справку прочитал и если указано MODE_ASCEND тогда будет найдено ближайшее меньшее значение, но первым я намерен определить ордер выше цены и 
                                                                               // поэтому поставил MODE_DESCEND. Скажите пожалуйста - это верно?? 
         PriceBlizko1 = Mas[Blizko2]+ 1 ;                                         //!!!Вот здесь я намереваюсь определить ордер сразу ниже цены и так как я намеренно упорядочил по убыванию уже все ордера в массиве, то по логике после 
                                                                               //определения ближайшего верхнего ордера к цене Blizko2 следующим в массиве будет ордер уже ниже цены(Верно ли мое утверждение??)И вот на этом месте я не 
                                                                               //могу понять: каким же образом это сделать? Ведь мне очевидно что он следующий, но как это записать в код я не могу понять))) Пробовал и в скобках уже 
                                                                               //прибавлять еденицу)) А мне нужно что бы PriceBlizko1 была присвоена цена ордера сразу ниже цены!! Подскажите пожалуйста как определить цену ордера ниже 
                                                                               //цены PriceBlizko2 ??
         PriceBlizko2 = Mas[Blizko2];                                           // Цена выбранного ордера выше цены         

        
 

나는 이렇게 보일 것이다

 double levelDown= 0 ;
double levelUp= DBL_MAX ;

int totalOrders= OrdersTotal ();


   for ( int i= 0 ;i<totalOrders;i++)
      {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
         {
         double price= OrderOpenPrice ();
         
         if (price- Ask > _Point && levelUp-price> _Point )
            levelUp=price;
         
         if ( Bid -price> _Point && price-levelDown> _Point )
            levelDown=price;
         }
      }
 
Taras Slobodyanik :

나는 이렇게 검색할 것이다


고맙습니다! DBL_MAX 최상위 수준 에서 무엇을 의미 합니까?

 
vikzip :

고맙습니다! DBL_MAX 는 무엇을 의미합니까?

스마트 포럼 엔진에 링크가 삽입되어 있습니다. 답을 기다리는 것보다 따라하는 것이 더 쉽습니다.

 
Artyom Trishkin :

스마트 포럼 엔진에 링크가 삽입되어 있습니다. 답을 기다리는 것보다 따라하는 것이 더 쉽습니다.


고맙습니다! 나는 그런 엔진을 원한다)))

 
vikzip :

의미있는 답변 감사합니다! 배열을 생성하려는 목적은 가격보다 낮거나 높은 경우 가장 가까운 주문의 가격을 결정하는 것입니다. 그리고 그들이 있고 가격까지의 거리가 특정 거리를 초과하면 해당 주문을 엽니 다. 이런 모습이어야 한다고 생각했어요 (여기서 내 행동의 논리를 최대한 설명했습니다)

이 줄의 주석에 오류가 있습니다.

         int Blizko2= ArrayBsearch (Mas, Ask , WHOLE_ARRAY , 0 , MODE_DESCEND );           //Определен индекс ближайшего большего по значению елемента к текущей цене 


거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MQL4에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론

알렉세이 빅토 로프 , 2017.10.04 09:32


도움에서

반환 값

발견된 첫 번째 요소의 인덱스를 반환합니다. 검색 값을 찾을 수 없으면 검색 값이 있는 요소 중 가장 낮은 값의 인덱스를 반환합니다 .

Mas[Blizko2]는 배열에서 다음으로 작은 값입니다.


도움말이 배열 정렬 방향에 대한 의존성에 대해 말하지 않는다는 점만 추가하면 됩니다. 따라서 ArrayBsearch 이후에는 조작이 필요하지 않습니다. 작업은 이미 완료되었습니다.

그런 다음 Artyom은 모든 것을 씹었습니다. 범위를 벗어나지 않도록 인덱스가 0과 배열의 크기와 같은지 확인하십시오...

 

버튼을 누른 후에만 마우스가 추적을 시작하도록 하는 방법. 그리고 나서 상황이 발생합니다(이론적으로 어드바이저에서 마우스를 클릭하면 모든 주문에 대한 스탑이 한 지점으로 이동됨) 버튼을 클릭하면 스탑이 버튼이 있는 가격으로 모든 주문에 대해 즉시 전송되기 시작합니다. 눌렸다. 이 속성처럼 if(id==CHARTEVENT_CLICK)

이 버튼을 클릭한 후에만 실행 if( ObjectGetInteger (0,"cm STOP ALL",OBJPROP_STATE))

 
Basicprof :

버튼을 누른 후에만 마우스가 추적을 시작하도록 하는 방법. 그리고 나서 상황이 발생합니다(이론적으로 어드바이저에서 마우스를 클릭하면 모든 주문에 대한 스탑이 한 지점으로 이동됨) 버튼을 클릭하면 스탑이 버튼이 있는 가격으로 모든 주문에 대해 즉시 전송되기 시작합니다. 눌렸다. 이 속성처럼 if(id==CHARTEVENT_CLICK)

이 버튼을 클릭한 후에만 실행 if(ObjectGetInteger(0,"cm STOP ALL",OBJPROP_STATE))


 if (id== CHARTEVENT_OBJECT_CLICK && sparam == "cm STOP ALL" ) { // код }