[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 3. - 페이지 632

 
alsu :

예를 들어, PeriodSMA를 사용하여 단순 이동 평균을 계산해야 합니다. SMA를 계산하려면 마지막 PeriodSMA 막대의 값을 더하고 PeriodSMA로 나눕니다. 분명히 이것은 Bars-1, Bars-2, ..., Bars-PeriodSMA+1 숫자가 있는 막대에 대해서는 수행할 수 없습니다. 계산에 필요한 막대 수가 없습니다(가장 왼쪽 막대에는 Bars-1 인덱스가 있음). 따라서 차트의 마지막 막대가 아니라 계산에 필요한 모든 데이터가 있는 막대에서 지표 계산을 시작해야 합니다. Bars-PeriodSMA 인덱스가 있는 막대에서.

이 값을 임의로 다르게 쓰지 않고 정확히 쓰는 이유는 무엇입니까? 예, 단순히 계산 자체의 정확성을 손상시키지 않고 최대 막대 수를 계산할 수 있는 계산 시작 부분의 이동이기 때문입니다.

그러나 나는 가장 간단한 경우를 설명했다는 것을 명심하십시오. 때때로 프로그램이 계산을 위해 얼마나 많은 과거 막대가 필요한지, 그리고 정확히 그러한 변화가 어디에서 오는지 코드에서 즉시 명확하지 않은 경우가 있습니다. 글쎄, 당신은 분명히 코드를 작성한 사람과 이야기하고 물어야합니다. 그러나 일반적으로 보편적 인 방법이 있습니다. 코드를 보면 원칙적으로 프로그램 작업 중에 가격 데이터와 인덱스 버퍼 데이터를 사용할 때 최대 막대 인덱스를 얻을 수 있습니다. 일반적으로이 단계에서 모든 것이 명확 해집니다.. .

이제 모든 것이 제자리에 떨어졌습니다. 당신의 친절에 대해 Alex에게 감사합니다!
 
skyjet :


명확하게 해 주셔서 감사합니다!

그리고 명확히하기 위해 기계적으로 0을 추가하면 TP와 SL이 이러한 유형의 터미널에서 작동합니까?


물론 그렇게 할 것입니다.
그것이 바로 외부 변수가 값을 설정하는 것입니다.

그러나 당신이 조언한 것을 초기화 모듈에 넣는 것이 더 쉽습니다.
또는 이 형식:
 // для терминала с 5 знаками
if (Digits == 3 || Digits == 5 ) {
   decimal = 10 ; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal ;
   TAKEPROFIT *= decimal ;
   slippage *= decimal ; // прочие целочисленные переменные в пунктах
} else decimal = 1 ;
변수는 자동으로 조정되며 다른 필요에 대해서는 " 십진수 " 승수를 사용합니다.
 
skyjet :


Спасибо за разъяснения!

И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?

프로랍 :

물론 그렇게 할 것입니다.
그것이 바로 외부 변수가 값을 설정하는 것입니다.

그러나 당신이 조언한 것을 초기화 모듈에 넣는 것이 더 쉽습니다.
또는 이 형식:
변수는 자동으로 조정되며 다른 필요에 대해서는 " 십진수 " 승수를 사용합니다.

이 작업에는 설명이 필요합니다.

  • 입력 매개변수(STPOLOSS, TAKEPROFIT 등)는 4\2 문자로 입력 해야 합니다 !!!
 

안녕하세요…

SOS !!! 좋은 사람들, 도와주세요!!! 지붕이 막 내려오고 있습니다... 저는 일반적으로 프로그래밍의 초보자이며(혼자 배우고 있습니다), 특히 MQL 에서. 간단한 지표 작성: "1인"의 RSI + 볼린저 밴드(아래는 전체 지표 코드입니다). 그러나 여기 문제가 있습니다. Buf_std_dev 배열을 선언할 때 그 안에 있는 요소의 수를 명시적으로 지정 하지 않으면(즉, 배열 선언이 있는 행이 다음과 같이 보입니다: double Buf_std_dev [] ), 이 표시기가 다음에 표시될 때 클라이언트 터미널 창( CT )에서 다음 그림을 얻습니다.

그림에 대한 설명:

a) 맨 위에는 CT 와 함께 제공되는 지표 세트에 포함된 RSI 가 있으며 볼린저 밴드는 이 RSI 의 창으로 끌어다 놓습니다. 그리고 드롭 );

b) 맨 아래에는 내가 프로그래밍한 RSI 가 있습니다.

컴파일러는 오류나 경고를 발생시키지 않습니다.

 

Buf_std_dev 배열을 선언할 때 그 안에 있는 요소의 수를 명시적으로 지정하는 경우(즉, 배열 선언이 있는 행은 다음과 같습니다. double Buf_std_dev [ 5502 ] , 여기서 5502Bars 변수 를 사용하여 얻은 막대의 수입니다. ) 그런 다음 모든 것이 제자리에 들어갑니다 (두 지표의 비교에서 알 수 있듯이 모든 값이 동일하기 때문).

두 번째 그림과 같이 이미지를 저장하기 위해 무엇을 해야 하는지 알려주십시오. 그러나 Buf_std_dev 배열의 요소 수를 명시적으로 설정하지 마십시오.

피. 에스. 귀하의 응답에 미리 감사드립니다.

 
모든 코드 표시
 

코드를 첨부합니다(일부 부분 없이 - 4MB에 맞지 않습니다!!).

....
double Buf_rsi[];                                                       //открываем индикаторный массив для значений RSI+
double Buf_ma[];                                                         //открываем индикаторный массив для значений скользящей средней по RSI+
double Buf_up_line[];                                                   //открываем индикаторный массив для значений ВЛБ по RSI+
double Buf_down_line[];                                                 //открываем индикаторный массив для значений НЛБ по RSI+
double Buf_std_dev[ 5498 ];                                               //открываем массив для хранения данных по стандартному отклонению  

string timeframe[ 9 ];                                                     //объявляем массив для значений таймфреймов
extern int Период_RSI= 14 ;                                               //внешняя переменная: период RSI+
extern int Применить_к= PRICE_CLOSE ;                                     //внешняя переменная: цена, для к-й рассчитывается RSI+
extern int Сдвиг= 0 ;                                                     //внешняя переменная: сдвиг относительно текущего графика RSI+
extern double Сигма= 2.0 ;                                                 //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+
extern int МА= 21 ;                                                       //внешняя переменная: период скользящей средней для расчета лент Боллинджера по RSI+
....
   if ( Bars <=Период_RSI) return ( 0 );                                       //если баров на графике меньше, чем период RSI+, то выходим
//+-------------------------------------------------------------------------------------- 9 --
   int counted_bars= IndicatorCounted ();                                 //количество посчитанных баров
   int i;                                                               //техническая переменные: счетчики

   int limit= Bars -counted_bars;                                         //индекс первого непосчитанного по массиву Buf_ma (т.к. этот массив НЕ является массивом таймсерией)
   if (counted_bars< 0 )limit--;                                           //если значение переменной counted_bars больше 0, то увеличиваем на 1 значение переменной limit
//+-------------------------------- Рассчет линий индикатора ---------------------------- 10 --
   for (i= 0 ;i<=limit;i++)Buf_rsi[i]= iRSI ( NULL , 0 ,Период_RSI,Применить_к,i); //рассчет значения RSI+ на i-ом баре      
   for (i= 0 ;i<=limit;i++)                                                 //цикл по рассчету линий на основе RSI+     
       {                                                                 //начало for
        Buf_std_dev[i]= iStdDevOnArray (Buf_rsi, Bars ,МА,Сдвиг, MODE_SMA ,i); //рассчитываем стандатное отклонение по массиву RSI+
        Buf_ma[i]= iMAOnArray (Buf_rsi, Bars ,МА,Сдвиг, MODE_SMA ,i);         //рассчет значения MA по RSI+ на i-ом баре
        Buf_up_line[i]=Buf_ma[i]+Сигма*Buf_std_dev[i];                   //рассчет значения ВЛБ по RSI+
        Buf_down_line[i]=Buf_ma[i]-Сигма*Buf_std_dev[i];                 //рассчет значения НЛБ по RSI+
       }                                                                 //конец for
   for (i= 0 ;i<= Bars ;i++)                                                 //цикл по подсчету количества данных внутри ЛБ
      {                                                                 //начало for
       int sum;                                                         //техническая переменные: сумма данных, к-е находятся внутри ЛБ 
       if (Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
      }                                                                 //конец for
//+------------------------------------------------------------------------------------- 11 --
 
FAQ :
모든 코드 표시

4MB보다 큰 코드를 여기에 덤프(또는 여기에서 부분적으로 덤프?)하는 방법이 있는지 알려주실 수 있습니까?
 

Buf_std_dev표시기 버퍼 (8개 중 하나)가 아니면 선언할 때 크기 또는 임의의 크기를 지정해야 합니다(나중에 크기를 변경하려는 경우).

 

정확히는 그렇지 않습니다 ... 가능한 경우 즉시 두 가지 질문이 더 있습니다.

1. 버퍼( Buf_std_dev 배열)(다른 4개)에 버퍼를 할당하면 표시기 창에도 표시된다는 의미입니까?

2. 버퍼를 할당하지 않으면 (내가 올바르게 이해했다면) 다음 상황이 발생합니다. 100바의 크기를 지정했다고 가정해 보겠습니다. 그런 다음 새 막대가 나타날 때(예: 막대=101인 경우) 발표 중에 지정된 마지막 100개 막대에 대해서만 계산이 이루어집니다(즉, 가장 오래된 막대 - 101 - 버려짐). 따라서 history 를 로드할 때 배열의 크기 는 항상 100개 막대(또는 선언할 때 지정할 다른 값)만 됩니까?

사유: