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

 
모두에게 좋은 하루!
mql4에 대한 질문, 보다 구체적으로 ArraySort() 함수에 대한 질문
여기 내 코드가 있습니다
 double LoY[ 31 ][ 31 ];
int P1;
void OnTick ()
{
if ( TimeCurrent ()== 1262568096 )
{
for ( int r= 0 ; r< 31 ;r++)
{
LoY[r][ 0 ]= 1.6104 ;
LoY[r][ 1 ]=r;
P1= 1 ;
}
}
if ( TimeCurrent ()> 1262568095 )
{
ArraySort (LoY, WHOLE_ARRAY , 0 ,MODE_ASCEND);
for ( r= 0 ; r< 31 ;r++)
Print ( "-------------------------------------LoY[r][1]--------------=" ,  LoY[r][ 1 ], "  r " ,   r, "  LoY[r][0] " ,   DoubleToString ( LoY[r][ 0 ], 5 ));
}

if (Bid-LoY[ 0 ][ 0 ]>= 0.0030 )
{
OrderSend ( Symbol (),OP_SELL, 0.1 ,Bid, 3 ,Ask+ 300 * Point ,Ask- 100 * Point , "300" , 0 );
LoY[ 0 ][ 0 ]=Bid;
}
}

LoY[0][0] 주문을 열고 입찰 값(즉, 1.6134)을 받은 후 ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) 함수는 배열을 첫 번째 차원을 기준으로 오름차순으로 정렬하고 배열 요소 를 맨 위 배열에서 가장 큰 값. 즉, LoY[0][0] 은 그 값과 함께 오름차순으로 정렬된 배열에서 LoY[30][0]이 됩니다. 이것은 논리적이므로 이에 동의합니다.


내 생각에 논리적이지 않고 받아들여지지 않는 것은 무엇입니까? ArraySort() 가 LoY[15][0] 값(1.61040)이 30번째를 제외한 배열의 다른 모든 요소의 값과 같다는 사실에도 불구하고 인덱스 0에 LoY[15][0]을 넣은 이유는 무엇입니까? ArraySort()   LoY[30][0] 값(1.61040)이 30번째를 제외한 배열의 다른 모든 요소의 값과 같다는 사실에도 불구하고 인덱스 15에 배치됩니다.

문제. 주어진 틱에서 인덱스가 0인 요소가 LoY[1][0] 이고 인덱스가 15 인 요소가 되도록 만드는 방법   LoY[15][0] 및 인덱스 29의 요소는 LoY[30][0]
즉, 함수가 미래에 동일한 값을 가진 요소를 정렬하지 않도록 하는 방법입니다. 논리적이지 않고 무의미합니다.

도와 주셔서 감사합니다.

 

아마도 그런 정렬 알고리즘 일 것입니다. 배열 요소의 일부 순열이 있습니다.

다른 정렬 옵션을 사용해 보십시오.

Методы сортировки и их визуализация с помощью MQL5
Методы сортировки и их визуализация с помощью MQL5
  • www.mql5.com
Для работы с графикой в MQL5 создана специальная библиотека Graphic.mqh. В статье описан пример ее практического применения и поясняется сама суть сортировок. По каждой сортировке существует как минимум отдельная статья, а по ряду из них уже опубликованы целые исследования, поэтому здесь описывается лишь общая идея.
 
Aleksei Stepanenko :

아마도 그런 정렬 알고리즘 일 것입니다. 배열 요소의 일부 순열이 있습니다.

다른 정렬 옵션을 사용해 보십시오.

조언해주셔서 대단히 감사합니다. mql4에 다른 정렬 옵션이 있는지 알려주십시오. 그렇다면 디렉토리의 어디에 있습니까?

 

노력하다:

 //функция быстрой сортировки
void SortArray( int &eArray[], int eFirst, int eLast)
   {
   int eMiddle, eTemp;
   int eLeft=eFirst, eRight=eLast;
   //вычисление опорного элемента
   eMiddle=eArray[(eLeft+eRight)/ 2 ];
   do
      {
       while (eArray[eLeft]<eMiddle) eLeft++;
       while (eArray[eRight]>eMiddle) eRight--;
       //перестановка элементов
       if (eLeft<=eRight)
         {
         eTemp=eArray[eLeft];
         eArray[eLeft]=eArray[eRight];
         eArray[eRight]=eTemp;
         eLeft++;
         eRight--;
         }
      }
   while (eLeft<eRight);
   if (eFirst<eRight) SortArray(eArray,eFirst,eRight);
   if (eLeft<eLast) SortArray(eArray,eLeft,eLast);
   }

1차원 배열에 대한 true 함수이지만 다시 실행할 수 있음

 
Aleksei Stepanenko :

노력하다:

1차원 배열에 대한 true 함수이지만 다시 실행할 수 있음

매우 감사합니다.

 

말해주세요,

이 코드는 열린 차트 를 찾고 기호 이름으로 레이블을 생성하지만 같은 기호를 가진 두 개의 차트가 있으면

그런 다음 하나의 차트에만 레이블을 만듭니다. 내가 뭘 잘못하고 있는 건가요?

 //---
   string name;
   for ( int i= 0 ; i< 10 ; i++)
     {
       if ( ChartSymbol ( ChartFirst ()+i)== "EURGBP" )
        {name= "EURGBP" ;
         if ( ObjectFind ( ChartFirst ()+i,name+ IntegerToString (i))!= 0 )
           {
            Create_Label( ChartFirst ()+i,name+ IntegerToString (i), 0 , 5 , 5 , CORNER_RIGHT_UPPER ,name, "Times New Roman" , 10 ,
                       clrBlack , 0 , ANCHOR_RIGHT_UPPER , " " , false , false , false , true , 0 );
           }
        }
     }
 
MakarFX :

말해주세요,

코드는 열린 차트 를 찾고 기호 이름으로 레이블을 생성하지만 두 차트에 동일한 기호가 있는 경우

그런 다음 하나의 차트에만 레이블을 만듭니다. 내가 뭘 잘못하고 있는 건가요?

동일한 기호의 차트 ID(ChartID())가 다릅니다. 그것을 써.

 
Artyom Trishkin :

동일한 기호의 차트 ID(ChartID())가 다릅니다. 그것을 써.

이것을 위해 나는 사용한다
 ChartFirst ()+i

저것들. 열려 있는 모든 차트 에 대해 반복

아니면 내가 당신을 오해? 코드의 형태로 어떻게든 시각적으로 가능합니까?

 
매우 이상하게도 새로 열린 모든 차트 에 표시를 하고 하나의 차트만 무시됩니다(
 
MakarFX :
매우 이상하게도 새로 열린 모든 차트 에 표시를 하고 하나의 차트만 무시됩니다(

설명서와 샘플 코드를 주의 깊게 읽으십시오. 주기가 잘못되었습니다.

 //--- переменные для идентификаторов графиков
   long currChart, prevChart= ChartFirst () ;
   int i= 0 ,limit= 100 ;
   Print ( "ChartFirst = " , ChartSymbol (prevChart), " ID = " ,prevChart);
   while (i<limit) // у нас наверняка не больше 100 открытых графиков
     {
       currChart= ChartNext (prevChart) ; // на основании предыдущего получим новый график
       if (currChart< 0 ) break ;           // достигли конца списка графиков
       Print (i, ChartSymbol (currChart), " ID =" ,currChart);
      prevChart=currChart; // запомним идентификатор текущего графика для ChartNext()
      i++; // не забудем увеличить счетчик
     }
for 및 while 루프가 같은 방식으로 작동한다고 말하지 마십시오. 문제는 이것이 아니라 강조 표시된 줄에 있습니다.