찻주전자의 질문 - 페이지 86

 

Renat , 그 질문은 실제보다 더 이론적인 것이었습니다.

안개 속을 헤매지 않기 위해 iFractals 도움말의 예를 참조하겠습니다. 사실, 지표가 있지만 스크립트에 의한 그래픽 마크업의 단일 계산으로 작업을 단순화합시다.

내가 전체 역사에서 모든 상위 프랙탈 막대의 시간을 알아내기 시작했다고 가정해 봅시다(또는 많은 프랙탈이 있는 중간 시간대의 상당 부분). FrUpBuffer[shift]!= EMPTY_VALUE 를 사용하여 루프에서 CopyTime 을 1 요소 깊이로 여러 번 방해하는 것이 더 낫다는 것을 올바르게 이해했습니까?

 handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for ( int shift= 0 ; shift<BarsCalculated(handle); shift++)
{
   if (FrUpBuffer[shift]!= EMPTY_VALUE )
   {
      CopyTime ( _Symbol ,PERIOD_H4, shift, 1 , Arr);
     Print (Arr[ 0 ]);
   }
}

bool FillArraysFromBuffers( double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if ( CopyBuffer (ind_handle, 0 , 0 ,amount,up_arrows)< 0 ) return ( false );

   return ( true );
  }

한 번에 FrUpBuffer 깊이까지 CopyTime으로 기록을 먹는 것보다 더 빠른 결과를 얻을 수 있습니다.

 handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for ( int shift= 0 ; shift<BarsCalculated(handle); shift++)
{
   if (FrUpBuffer[shift]!= EMPTY_VALUE )
     Print (TimeUpBuffer[shift]);
}

bool FillArraysFromBuffers( double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if ( CopyBuffer (ind_handle, 0 , 0 ,amount,up_arrows)< 0 ) return ( false );
   else CopyTime ( _Symbol , PERIOD_H4 , 0 ,amount,TimeUpBuffer);

   return ( true );
  }
그런 다음 동일한 if를 사용하는 동일한 루프에서 Print?를 사용하여 프랙탈 막대의 시간 값을 인쇄하면 됩니다.

작업은 동일하며 구현이 약간 다릅니다.

직관적으로, 막대 시간 값의 거대한 체인(프랙탈 및 비어 있음)을 연속으로 배열에 복사하는 것이 더 길고 더 비싸다는 것을 이해합니다. 반면에 CopyTime을 1 요소의 깊이로 여러 번 당기는 것은 모호한 즐거움입니다.

첫 번째 옵션이 더 빠르면 절대 이득입니까, 아니면 모두 포착된 프랙탈의 총 수에 따라 달라지나요(예: 작은 TF에 훨씬 더 많음)?

 

여기 https://www.mql5.com/ru/forum/3775/page59#comment_94865 코드를 줄이기 위해 많은 유사한 버퍼에 선언, 바인딩, 초기화 및 기타 작업을 주기에 배치하는 방법에 대해 질문했습니다. 가독성과 관리성을 향상시킵니다. 좋은 예(클래스, 구조)로 답변을 받았는데, 알았습니다.

이제 동일한 원칙을 사용하여 #property 유형의 다중 할당을 줄이려고 했습니다.

 #property indicator_label1   "FractalUp1"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen

#property indicator_label2   "FractalDown1"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrGreen
// ---
#property indicator_label3   "FractalUp2"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrBlue

#property indicator_label4   "FractalDown2"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrBlue
[...]

그리고 적어도 두 가지 문제가 있었습니다:

1. for는 전역 수준에서 허용되지 않습니다. 즉, 가장 이른 사용은 OnInit()보다 빠르지 않지만 #property는 다른 모든 함수보다 먼저 전역 수준에서 선언되는 것으로 알려져 있습니다.

2. OnInit()에서 루프의 표시기에 속성을 할당하려고 할 때:

 // понимаю, что сочинил бред
for ( int i= 0 ; i<NUMBER; i++)
{
   #property Property_Array[i].indicator_label (string) ("Fractal"+i)
   #property Property_Array[i].indicator_type  DRAW_ARROW
   #property Property_Array[i].indicator_color clrArr[i]
}
컴파일러가 '#'에 대해 불평합니다(예상대로): '#property' - 예기치 않은 토큰.
그 아이디어가 원칙적으로 실현 가능한지, 그렇다면 어떻게 가능한지 말씀해 주시겠습니까?
 

말해봐, 어떻게든 배열의 2차원 배열을 선언할 수 있습니까?

이 같은:

 double Buffers[ 6 ][ 3 ]={ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] };
 
tol64 :

말해봐, 어떻게든 배열의 2차원 배열을 선언할 수 있습니까?

필드가 배열이 될 구조의 배열을 선언할 수 있으며 컴파일러는 구조에서 동적 배열 을 건너뛰기도 합니다.

 struct arr{ double arr_str[];};
arr buffers[ 6 ][ 3 ];
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
tol64 :

말해봐, 어떻게든 배열의 2차원 배열을 선언할 수 있습니까?

이 같은:

 #define DIM1_NUMBER 6
#define DIM2_NUMBER 3

struct TBuffer
{
   string Buffer[ 3 ]; // для нагляднсти поменяем double на string
};

TBuffer Buffer_Array[DIM1_NUMBER];

string prefixArr[ 6 ]={ "a" , "b" , "c" , "d" , "e" , "f" };

int OnInit ()
  {
   for ( int j= 0 ; j<DIM1_NUMBER; j++)
   {
       for ( int i= 0 ; i<DIM2_NUMBER; i++)
      {
         string t;
   
         StringConcatenate (t,prefixArr[j],i);
        Buffer_Array[j].Buffer[i]=t;
      }
   }

   Print (Buffer_Array[ 0 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 0 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 0 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 1 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 1 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 1 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 2 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 2 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 2 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 3 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 3 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 3 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 4 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 4 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 4 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 5 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 5 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 5 ].Buffer[ 2 ]
   );

   return ( 0 );
  }
[수정했습니다.]
 

IgorM, x100일중

옵션을 주셔서 감사합니다. 나는 이것이 효과가 있다고 생각한다. 나는 시도할 것이다.

 
tol64 :

IgorM, x100일중

옵션을 주셔서 감사합니다. 나는 이것이 효과가 있다고 생각한다. 나는 시도할 것이다.

그건 그렇고, "Buffer"라는 이름을 "_" 또는 다른 zagagulin으로 변경할 수 있습니다. 그러면 일반적으로 호출을 완전히 볼 수 있습니다.

Buffer_Array[ 0 ]._[ 0 ]

Buffer_Array[ 0 ].¦[ 0 ]

 
Urain :

그건 그렇고, "Buffer"라는 이름을 "_" 또는 다른 zagagulin으로 변경할 수 있습니다. 그러면 일반적으로 호출을 완전히 볼 수 있습니다.

고마워요 소변 . 또한 흥미로운 추가 사항. 더 친숙합니다.))
 

그러나 #property로 이 모든 작업을 수행하는 방법은 무엇입니까? - 흥미로운...

정말 아이디어가 없습니까?

 
x100intraday :

그러나 #property 로 이 모든 것을 수행하는 방법은 무엇입니까? - 흥미로운...

정말 아이디어가 없습니까?

풀다