[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
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!
И просто чтобы уточнить, если я механическим путем добавлю 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!!!
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 arrasteedrop);
b) na parte inferior está o RSI, que é programado por mim;
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.
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]; //объявляем массив для значений таймфреймовexternint Период_RSI=14; //внешняя переменная: период RSI+externint Применить_к=PRICE_CLOSE; //внешняя переменная: цена, для к-й рассчитывается RSI+externint Сдвиг=0; //внешняя переменная: сдвиг относительно текущего графика RSI+externdouble Сигма=2.0; //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+externint МА=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+
} //конец forfor(i=0;i<=Bars;i++) //цикл по подсчету количества данных внутри ЛБ
{ //начало forint sum; //техническая переменные: сумма данных, к-е находятся внутри ЛБ if(Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
} //конец for//+------------------------------------------------------------------------------------- 11 --
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)?
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...
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:
As variáveis serão ajustadas automaticamente, e para outras necessidades usar multiplicador de uso "decimal".
Спасибо за разъяснения!
И просто чтобы уточнить, если я механическим путем добавлю 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:
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.
Código anexado (sem algumas peças - não cabe em 4 MB!!!):
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)?