[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 632

 
alsu:

Por exemplo, você precisa calcular uma média móvel simples com o PeriodSMA. Para calcular o SMA, adicionar os valores das barras do último PeriodSMA e dividir pelo PeriodSMA. É óbvio que para as barras com números Bars-1, Bars-2, ..., Bars-PeriodSMA+1 não vai funcionar, porque simplesmente não temos o número necessário de barras para o cálculo (a barra mais à esquerda tem o índice Bars-1). Portanto, temos que iniciar o cálculo do indicador não com a última barra no gráfico, mas com a barra com o índice Bars-PeriodSMA.

Por que eles escrevem este valor, e não um valor arbitrário? É porque este deslocamento do início do cálculo nos permite calcular a quantidade máxima de barras sem prejuízo da exatidão do cálculo.

Mas tenha em mente que este é o caso mais simples. s vezes pode não estar imediatamente claro a partir do código quantas barras anteriores o programa precisa para o cálculo e de onde exatamente vem esta mudança. Bem, você provavelmente deveria perguntar ao desenvolvedor que escreveu o código. Mas em geral, há uma forma universal - basta olhar para o código, o que em princípio o índice máximo da barra pode ser obtido usando dados de preços e dados de buffer de índice durante a operação do programa, geralmente já nesta fase se torna claro...

Agora tudo está se encaixando no lugar. Obrigado Alexei por sua capacidade de resposta!
 
skyjet:


Obrigado pelo esclarecimento!

E só para esclarecer, se eu mecanicamente adicionar 0, TP e SL funcionarão neste tipo de terminal?


É claro que sim.
É para isso que eles servem, variáveis externas, para definir quaisquer valores.

Mas é mais fácil colocar no módulo de inicialização o que você foi aconselhado.
Ou sob esta forma:
// для терминала с 5 знаками
if (Digits == 3 || Digits == 5) {
   decimal = 10; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal;
   TAKEPROFIT *= decimal;
   slippage *= decimal; // прочие целочисленные переменные в пунктах
} else decimal = 1;
As variáveis serão ajustadas automaticamente, e para outras necessidades usar multiplicador de uso "decimal".
 
skyjet:


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

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

prorab:

Eles irão, é claro.
É para isso que eles servem, variáveis externas, para definir quaisquer valores.

Mas é mais fácil ainda colocar o que você foi aconselhado a fazer no módulo de inicialização.
Ou sob esta forma:
As variáveis serão automaticamente ajustadas, e para outras necessidades usar multiplicador de uso "decimal".

Esta tarefa precisa ser esclarecida:

  • Seus parâmetros de entrada (STPOLOSS, TAKEPROFIT, etc.) devem ser inseridos com 4\2 dígitos em mente!!!
 

Boa tarde...

SOS!!! BOA GENTE, SOCORRO!!! Sou um iniciante na programação em geral (sou autodidata), e na MQL em particular. Eu escrevi um indicador simples: RSI + Bandas de Bollinger em uma pessoa. Mas aqui está o problema: se eu não especificar expressamente a quantidade de elementos na matriz Buf_std_dev (ou seja, a linha de declaração da matriz é assim: Buf_std_devduplo []), então ao exibir este indicador na janela do terminal do cliente(CT) eu obtenho a seguinte imagem:

Explicação do quadro:

a) no topo está o RSI, que está disponível no conjunto de indicadores fornecidos com CT, e as Bandas de Bollinger foram arrastadas para a janela deste RSI pelo arraste e drop);

b) na parte inferior está o RSI, que é programado por mim;

O compilador não detecta nenhum erro ou aviso.

 

Se, por outro lado, ao declarar a matriz Buf_std_dev, eu especificar explicitamente o número de elementos nela (ou seja, a linha de declaração da matriz é assim: duplo Buf_std_dev[5502], onde 5502 é o número de barras, que é obtido usando a variável Barras), então tudo volta ao normal (pois, como você vê na comparação de dois indicadores: todos os valores são os mesmos):

Você pode me dizer o que fazer para salvar a imagem, como na segunda foto, mas explicitamente NÃO para definir o número de elementos na matriz Buf_std_dev.

P.S. Agradecemos antecipadamente a resposta.

 
Mostrar todo o código
 

Código anexado (sem algumas peças - não cabe em 4 MB!!!):

....
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:
Mostrar todos os códigos

Favor informar se há maneiras de despejar código acima de 4Mb aqui (ou despejá-lo aqui em partes?) ?
 

Se seu Buf_std_dev não for um buffer indicador (um dos oito), você precisa especificar seu tamanho, ou qualquer tamanho (se você pretende mudá-lo (tamanho) no futuro) ao declará-lo.

 

Certo, não é... Se me permitem, então mais duas perguntas ao mesmo tempo:

1. Se eu lhe atribuir um buffer (a matriz Buf_std_dev) , isso significa que ele também será exibido na janela indicadora?

Se eu não atribuir um tampão a ele, então (se eu entender corretamente) ocorrerá a seguinte situação: suponha que eu tenha especificado o tamanho de 100 barras. Então quando novas barras aparecerem (ou seja, se por exemplo Bars=101), faremos cálculos apenas para as últimas 100 barras especificadas (ou seja, a barra mais antiga - 101 - será descartada). Então, ao carregar o histórico, o tamanho da matriz será sempre igual a apenas 100 barras (ou algum outro valor, que eu especificarei ao declarar)?