MT4 iMAOnArray 및 iBandsOnArray 계산에 대한 요소 수의 영향 - 페이지 3

 
Alexey Viktorov :

아니 블라디미르. 조금 그렇지 않습니다.

이 경우 ArraySetAsSeries(array, false); iMAOnArray()가 고려되는 300개 요소의 배열에 적용합니다. 그러나 이를 위해 배열 채우기 루프 대신 CopyOpen()을 사용하는 것이 좋습니다.

내가 알기로는 이 옵션이 더 좋을 것입니다.

과제가 정해져 있는 대로 시연을 했습니다. 그것은 분명히 밝혀졌습니다. 그리고 나서 스스로 :)
 
Alexey Viktorov :

아니 블라디미르. 조금 그렇지 않습니다.

이 경우 ArraySetAsSeries(array, false); iMAOnArray()가 고려되는 300개 요소의 배열에 적용합니다. 그러나 이를 위해 배열 채우기 루프 대신 CopyOpen()을 사용하는 것이 좋습니다.

내가 알기로는 이 옵션이 더 좋을 것입니다.

따라서 코드의 "작동" 버전을 표시합니다. 원래 소스 코드가 여기에 있습니다. 이 코드는 제가 요청한 300개 대신 12개의 표시된 요소로 줄이려고 하며 지정된 3개의 표시기 버퍼로 끝나야 합니다. 푸터에 300개 이상의 요소가 표시되도록 데이터를 입력한 다음, 새로운 막대가 각각 301개 도착한 다음 값이 그려지지만 0을 계산 제약 조건으로 사용하는 경우에만 새 막대의 값이 다시 계산되고 두 번째 버퍼에 대한 평균(평활화) 유형이 반드시 SMA일 필요는 없으며 사용 가능한 4가지 중 하나가 될 수 있습니다.
 
Sergey Efimenko :

사실 주제. 전체 배열을 계산할 필요가 없고 마지막 N개 요소만 계산하는 경우.

이러한 기능을 제한적으로 계산하는 논리를 잘 이해하지 못합니다. 시계열 배열(지표 버퍼 중 하나)이 있는데, 요소의 수를 0으로 두면 질문이 없고 모든 것이 계산되고 밝혀지지만 동일한 계산에 참여하는 요소의 수는 오프셋이 감소하면 기본 항목만 얻습니다. 간단히 말해서 5000개 요소(차트의 막대) 배열이 있으므로 시간을 절약하려면 마지막 300개만 계산해야 하지만 두 번째 매개변수에 300개를 지정하면 기본 5000-4700개 요소가 표시되지만 300-0의 오프셋에서 호출하면 값이 변경되지 않습니다. 이 매개변수를 사용하는 요점은 무엇입니까?

지옥은 알고 있습니다. 그냥 죽이세요. 계산 속도 를 높여야 하는 경우 주기에서 계산된 요소의 수를 줄이십시오.

 if (prev_calculated== 0 )limit= 300 ; else ...; 

두 가지 중 하나: 불가능하거나 시계열이 아닌 시계열의 비밀 조합, 계산 방향이 필요합니다.

 
Dmitry Fedoseev :

지옥은 알고 있습니다. 그냥 죽이세요. 계산 속도를 높이려면 주기에서 계산된 요소 수를 줄이십시오.

두 가지 중 하나: 불가능하거나 시계열이 아닌 시계열의 비밀 조합, 계산 방향이 필요합니다.

예, 이미 조금 전에 썼듯이 하나의 옵션만 있습니다. 이것은 표시된 기능의 자체 유사체를 사용하는 것이며, 여기서 최소한 하나의 요소를 고려할 수 있습니다.

상황의 역설은 어떤 지표(가격 라인)에 평균 또는 볼린저 밴드 를 던져 유사한 패턴을 만드는 경우 코드에서 이러한 기능을 사용할 때와 같이 모든 기록 막대의 초기 계산에 대한 브레이크가 작동하지 않는다는 것입니다. 터미널을 다시 시작하거나 시간 프레임을 전환할 때 관찰되며, 여기에서 이러한 함수에서 계산하는 데 시간이 오래 걸리는 것이 명확하지 않습니다.

 
Dmitry Fedoseev :

지옥은 알고 있습니다. 그냥 죽이세요. 계산 속도를 높여야 하는 경우 주기에서 계산된 요소 수를 줄이십시오.

두 가지 중 하나: 불가능하거나 시계열이 아닌 시계열의 비밀 조합, 계산 방향이 필요합니다.

이 디자인도 사용했어요

 if (limit > 300 )limit= 300 ;

그건 그렇고, "MovingAverages.mqh"는 이전 버전에 따라 "iMAOnArray"보다 두 배 빠르게 계산 되었습니다 .

https://www.mql5.com/ru/forum/79988

Использование MovingAverages.mqh в MQL4
Использование MovingAverages.mqh в MQL4
  • www.mql5.com
При вызове в советнике индикатор работает корректно, но если его поместить в тело условного оператора "if", то советник не открывает сделок, хотя логика советника остается та же.
 
Sergey Efimenko :

예, 이미 조금 전에 썼듯이 하나의 옵션만 있습니다. 이것은 표시된 기능의 자체 유사체를 사용하는 것이며, 여기서 최소한 하나의 요소를 고려할 수 있습니다.

상황의 역설은 어떤 지표(가격선)에 평균과 볼린저 밴드를 던져 유사한 패턴을 만들면 코드에서 이러한 함수를 사용할 때와 같이 모든 기록 막대의 초기 계산에 제동이 걸린다는 것입니다. 터미널을 다시 시작하거나 타임프레임을 전환할 때 관찰되지 않으며, 여기에서 이러한 함수에서 계산하는 데 시간이 오래 걸리는 것이 명확하지 않습니다.

iMAOnArray를 사용해 도 제동? 그렇게 해서는 안됩니다. 당시에는 StdOnArray(또는 BandsOnArray, 기억이 나지 않음)에서 속도가 느려졌고 개발자는 오랫동안 버그의 존재를 인정하지 않았습니다. 그런 다음 갑자기 수정했고 빠르게 작동했습니다. 누가 알겠습니까? 버그가 반환되었을 수 있습니다. iMAOnArray()에서 눈에 띄는 속도 저하가 있는 경우 이는 버그입니다. 몇 달 전에 이것에 대한 이야기가 있었던 것 같습니다 ... 분명히 여전히 거기에 있습니다.

 
Dmitry Fedoseev :

iMAOnArray를 사용해 도 제동? 그렇게 해서는 안됩니다. 잠시 동안 StdOnArray에서 속도가 느려졌고 개발자는 오랫동안 버그의 존재를 인정하지 않았습니다. 그런 다음 갑자기 수정했고 빠르게 작동했습니다. 누가 알겠습니까? 버그가 반환되었을 수 있습니다. iMAOnArray()에서 눈에 띄는 속도 저하가 있는 경우 이는 버그입니다. 몇 달 전에 이것에 대한 이야기가 있었던 것 같습니다 ... 분명히 여전히 거기에 있습니다.

모두 차트의 길이(막대 수)에 따라 달라지기 때문에 많이 느려지거나 허용 가능한지 판단하기 어렵습니다. 캐치는 최적화를 위해 약간만 계산해야 한다는 점이며 실제로는 계산의 길이를 제한하는 것은 불가능합니다.
 
Sergey Efimenko :
모두 차트의 길이(막대 수)에 따라 달라지기 때문에 많이 느려지거나 허용 가능한지 판단하기 어렵습니다. 캐치는 최적화를 위해 약간만 계산해야 한다는 점이며 실제로는 계산의 길이를 제한하는 것은 불가능합니다.
MovingAverages.mqh에서 계산하면 모든 것이 매우 빠르게 계산됩니다.
 
forexman77 :
MovingAverages.mqh에서 계산하면 모든 것이 매우 빠르게 계산됩니다.
전체 배열이 아니라 마지막 부분(현재 값)에 대해서만 계산을 설정하면 이 라이브러리가 올바르게 계산됩니까? 게다가 이것은 작업의 절반에 불과하지만 iBandsOnArray는 어떻습니까?
 
Sergey Efimenko :
따라서 코드의 "작동" 버전을 표시합니다. 원래 소스 코드가 여기에 있습니다. 이 코드는 제가 요청한 300개 대신 12개의 표시된 요소로 줄이려고 하며 지정된 3개의 표시기 버퍼로 끝나야 합니다. 바닥글에 300개 이상의 요소가 표시되도록 데이터를 추가하고, 새로운 막대가 각각 301개 도착한 다음 값을 그렸지만, 0을 계산 제약 조건으로 사용하는 경우에만 새 막대의 값이 다시 계산되고 두 번째 버퍼에 대한 평균(평활화) 유형이 반드시 SMA일 필요는 없으며 사용 가능한 4가지 중 하나가 될 수 있습니다.

기다리다.

 //+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrYellow
#property indicator_color2 clrGreen
#property indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun= true ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   firstrun= true ;
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,BufferMA, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,BufferBMA, INDICATOR_DATA );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
   int i, limit;
   limit = rates_total-prev_calculated- 1 ;
   double buffer[];

   for (i = limit; i >= 0 ; i--)
     {
      Buffer[i]=open[i];
       ArrayCopy (buffer, Buffer, 0 , i, 12 );
      BufferMA[i] = iMAOnArray (buffer, 300 , 12 , 0 , MODE_SMA , 0 );
      BufferBMA[i] = iBandsOnArray (buffer, 300 , 12 , 2.0 , 0 , MODE_UPPER , 0 );
       int x= 0 ;
     }
   return (rates_total);
}
//+------------------------------------------------------------------+