열린 직위를 그룹으로 나누기 - 페이지 5

 
Alexey Viktorov :

무엇을 많이? 매 틱마다 채워지지 않는 배열 요소 ? 무엇이 눈에 띌까?

이 코드는 의도적으로 악화된 것처럼 눈을 아프게 합니다.

차이가 없으면 다음과 같이 합시다.

 for ( int i = 0 ; i < 10 ; i++)
   {
     ArrayResize (arrTest, i+ 1 );
    arrTest[i][ 0 ] = iOpen ( _Symbol , PERIOD_CURRENT , i);
    arrTest[i][ 1 ] = iClose ( _Symbol , PERIOD_CURRENT , i);

     for ( int j= 0 ;j< 100 ;j++)
     Sleep ( 1 );
   }

왜 안 돼?

 ArrayResize (arrTest, 10 );
for ( int i = 0 ; i < 10 ; i++)
  {
    arrTest[i][ 0 ] = iOpen ( _Symbol , PERIOD_CURRENT , i);
    arrTest[i][ 1 ] = iClose ( _Symbol , PERIOD_CURRENT , i);
  }
 
Aliaksandr Hryshyn :

이 코드는 의도적으로 악화된 것처럼 눈을 아프게 합니다.

차이가 없으면 다음과 같이 합시다.

무엇 때문에?

추신; 아, 그럼 이해가 됩니다. 글쎄, 이것은 예입니다. 작업 배열이 채워지면 분명히 한 인덱스에 채워집니다. 그러한 미묘함에주의를 기울여야하는 옵션이 아닙니다.
 
Alexey Viktorov :

무엇 때문에?

아마도 루프 내부의 배열을 알려진 크기로 변경하는 이유 때문일 것입니다.

정확한 이유는 모르겠습니다 :)

당신은 프리랜서입니다! 공포 :).

 
Aliaksandr Hryshyn :

아마도 루프 내부의 배열을 알려진 크기로 변경하는 이유 때문일 것입니다.

정확한 이유는 모르겠습니다 :)

당신은 프리랜서입니다! 공포 :).

그리고 이것에서 무엇을?

 
Alexey Viktorov :

말도 안되는 소리. 설명서를 읽지 않고 이 기능을 사용했습니다. ...

그랬어요, 정말 감사합니다!!! 내가 쓴 것은 정말 말도 안되는 소리였습니다. ArrayRemove 삭제 기능 은 모든 차원의 배열에서 잘 작동합니다.

오류는 다른 곳에 있었습니다. 다음 단계에서 이 변수가 루프에서 다시 사용되었고 배열이 범위를 벗어났기 때문에 이제 더 작은 배열 크기 로 함수를 다시 정의해야 했습니다(용어상 틀릴 수 있지만 내가 나를 명확하게 표현했으면 좋겠다).

작업 버전은 아래 및 첨부 파일에 게시하겠습니다. 색상으로 강조된 미묘한 포인트.

 //+------------------------------------------------------------------+
int Array_Caste_Positions_Creating(){
   int   n           = 0 ;
   long ticket      = 0 ;
   bool new_pos     = true ;
//---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal ();
   int Array_Size   = ArrayRange (Arr_Position, 0 );
//---  
   for ( int i = 0 ; i < All_Position; i++){
       if (m_position.SelectByIndex(i)){
         ticket  = PositionGetInteger ( POSITION_TICKET );
         new_pos = true ;}
       for ( int e = 0 ; e < Array_Size; e++){
         if (Arr_Position[e][ 0 ]==ticket){
            new_pos = false ;
            n++;
             break ;}}
       if (new_pos){
         int New_Size = Array_Size+ 1 ;
         ArrayResize (Arr_Position,New_Size, 0 );
            Arr_Position[Array_Size][ 0 ] = ( int )ticket; //Ticket
            Arr_Position[Array_Size][ 1 ] = 0 ; //Number_Caste (0 = начальные позиции)
            n++;}}                       
//---Удаление из массива мёртвых тикетов 
      Array_Size   = ArrayRange (Arr_Position, 0 );
      All_Position = PositionsTotal ();
//---      
       for ( int e = 0 ; e < Array_Size ; e++){
         int   ticket_dead = Arr_Position[e][ 0 ];
         bool dead_pos    = true ;
         for ( int i = 0 ; i < All_Position; i++){
             if (m_position.SelectByIndex(i)){
                   if (ticket_dead == PositionGetInteger ( POSITION_TICKET )){
                        dead_pos = false ;
                        n++;
                         break ;}}}
         if (dead_pos){
             ArrayRemove (Arr_Position,e, 1 );
             Array_Size   = ArrayRange (Arr_Position, 0 ) ;}}
//---     
return (n);}
//+------------------------------------------------------------------+
파일:
Sower_1_6.mq5  19 kb
 

나는 두 명의 교사가 각자 자신의 교수법이 옳다고 주장하는 논쟁에 무의식적으로 참석한 장난꾸러기 학생처럼 느껴진다.

제 딜리턴트 3센트를 넣어보겠습니다.

Alexey Viktorov 가 게시한 예제 코드의 사소한 비이상성에도 불구하고 그는 올바른 생각을 게시했으며, 그것을 알아내는 데 도움을 준 사람들이었습니다. 그리고 프리랜서가 여분의 페니를 갈취하지 않고 준비되어 있고 무료로 도움을 준다면 그는 존경받고 칭찬받으며 정말로 존경받습니다. 고맙습니다.

Aliaksandr Hryshyn - 감사합니다. 또한 무관심하지 않고 진심으로 돕고 싶었고 성공했습니다. 당신의 비판 없이 사건이 어떻게 전개될지 누가 알겠습니까?

 
Sergey Voytsekhovsky :

그랬어요, 정말 감사합니다!!! 내가 쓴 것은 정말 말도 안되는 소리였습니다. ArrayRemove 삭제 기능 은 모든 차원의 배열에서 잘 작동합니다.

오류는 다른 곳에 있었습니다. 함수를 적용한 후 다시 재정의해야 했습니다. 이제 더 작은 배열 크기로 다시 정의해야 합니다. 다음 단계에서 이 변수가 루프에서 다시 사용되었고 배열이 범위를 벗어났기 때문입니다(용어는 틀릴 수 있지만 내가 나를 분명히 표현했으면 좋겠다).

작업 버전은 아래 및 첨부 파일에 게시하겠습니다. 색상으로 강조된 미묘한 포인트.

소규모 교육 프로그램입니다.

이것

       if (m_position.SelectByIndex(i)){
         ticket  = PositionGetInteger ( POSITION_TICKET );

로 대체할 수 있습니다

      t icket = PositionGetTicket (i);
 
Alexey Viktorov :

소규모 교육 프로그램입니다.

이것

로 대체할 수 있습니다

좋습니다. 코드의 다른 위치가 거부를 일으키는 경우 - pliz를 보여주세요. 저는 국내 코더입니다. 그러면 제가 파헤친 것은 지식이 체계적이고 개략적이지 않습니다. 참된 길을 안내해 주시면 대단히 감사하겠습니다.

수정했습니다. 이제 다음과 같습니다.

 //---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal ();
   int Array_Size   = ArrayRange (Arr_Position, 0 );
//---  
   for ( int i = 0 ; i < All_Position; i++){
      ticket = ( int ) PositionGetTicket (i);
      new_pos = true ;
       for ( int e = 0 ; e < Array_Size; e++){
         if (Arr_Position[e][ 0 ]==ticket){
            new_pos = false ;
            n++;
             break ;}}
       if (new_pos){
         int New_Size = Array_Size+ 1 ;
         ArrayResize (Arr_Position,New_Size, 0 );
            Arr_Position[Array_Size][ 0 ] = ( int )ticket; //Ticket
            Arr_Position[Array_Size][ 1 ] = 0 ; //Number_Caste (0 = начальные позиции)
            n++;}}                       
 
Sergey Voytsekhovsky :

좋습니다. 코드의 다른 위치가 거부를 일으키는 경우 - pliz를 보여주세요. 저는 국내 코더입니다. 그러면 제가 파헤친 것은 지식이 체계적이고 개략적이지 않습니다. 참된 길을 안내해 주시면 대단히 감사하겠습니다.

가끔씩만. 나는 따르지 않을 것이다. 일반적으로, 나는 독학이며 또한 독학입니다.

mql5의 티켓에는 ulong 유형 이 있습니다.

그런 다음 유형으로 캐스팅 할 필요가 적습니다.

 
Alexey Viktorov :

가끔씩만. 나는 따르지 않을 것이다. 일반적으로, 나는 독학이며 또한 독학입니다.

mql5의 티켓에는 ulong 유형 이 있습니다.

그런 다음 유형으로 캐스팅 할 필요가 적습니다.

감사합니다. 기억해 두고 나중에 여기에서 다시 실행하겠습니다.