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

 
skyjet:

Obrigado! Não importa de que lado começar a contar, ou seja, da 3ª barra?

Para seu exemplo, isso não faz diferença, mas você tem que especificar o início e o fim da matriz de qualquer maneira.

for (int x=3; x>1; x--)
{
 if(Open[x]==Open[x-1]) continue;
 if(Open[x]<Open[x-1])
   {
   //--- action
   }
}
O início importa se o conjunto é grande. Por exemplo, se a condição for acionada no final da matriz como uma regra, é melhor começar no final. Este exemplo é típico de busca de ordem/posição. Claro que, se você fizer a busca primeiro neste caso, o programa chegará a este ponto de qualquer maneira, mas será preciso mais recursos.
 
Danila_mactep:
Olá a todos! Por favor, me aconselhem sobre este assunto... Eu quero mudar o nível MA na guia níveis. Se eu quiser mudá-lo para 798, é muito complicado calcular para muitos pares. Como escrever um indicador que ou tira o preço da média móvel deslocada ou o exibe na janela de dados e eu não tenho que calculá-lo manualmente?
Você pode criar um indicador com um turno MA em seus dados de entrada. E o indicador calculará o nível de preço e exibirá imediatamente seus objetos no gráfico.
 
chief2000:
Tal problema - existe uma matriz unidimensional cujo tamanho pode variar.
Como fazer loop através de todas as combinações possíveis de elementos de matriz uns com os outros?
A ordem dos elementos não importa, ou seja, 123==213==321...

Aqui está um exemplo para uma matriz com 4 elementos:


É uma boa tarefa para seu cérebro. Você pode tentar isto:
int start(){
 double array[4];
 int k,N[];
 k=ArraySize(array);
 ArrayResize(N,k);
 for (int i=0;i<k;i++)N[i]=-i-1;// Заполнили массив элементов массива отрицательными
//
 int j=0;
 while(N[k-1]<k){
  if(N[j]<k-1){
   N[j]++;
   bool NewComb=false;
   for(i=0;i<k-1;i++){
    if(N[i]>N[i+1]){NewComb=true;}else{NewComb=false;break;}
   }
//
   if(NewComb){
// Получили новую комбинацию в массиве N размерностью k    
    string temp="";
    for(i=0;i<k;i++){// Перебираем массив N. Если N[i] то элемент array[N[i]] не участвует в выборке.
                     // Например, для размерности 4 если N[0]=3,N[1]=1,N[2}<0,N[3]<0 то это выборка array[3] и array[1]
                     //                             если N[0]=3,N[1]=2,N[2]=1,N[3]=0 то это выборка array[3] и array[2] array[1] и array[0]
     if(N[i]<0)temp=StringConcatenate(temp,"X");else temp=StringConcatenate(temp,N[i]);
    }
   Print("NEWCOMB ",temp);// это для проверки какие комбинации выбираются
   }
//
  }
  else{
   N[j]=0;i=1;
   while(i<k){
    if(N[i]<k-1) {if(N[i]>=0)N[i]++;else N[i]=0;j=0;break;}
    else {N[i]=0;i++;}
   }
  }
  if(N[k-1]>=k-1) break;
 }
 return;
}

Resultado do teste para a dimensão 4. Se o elemento X da matriz não for selecionado, use array[dígito] e fragmento para a dimensão 6:

 
artmedia70:
Faça um indicador cujos dados de entrada especificarão o turno MA. E o indicador calculará o nível de preço e exibirá imediatamente seus objetos no gráfico.


Eu não sei como fazê-lo e, francamente falando, não tenho idéia de como - quando abro o código МА, há tanta coisa lá que não vejo onde está o parâmetro de nível, então não posso copiar e colar níveis.
 
Danila_mactep:

Eu não sei como fazê-lo e, para ser honesto, não tenho idéia de como fazê-lo - abro o código MA, há tanta coisa lá que não vejo onde está o parâmetro de nível, então posso copiar e colar níveis nele. Que parte do código MA devo copiar e onde devo colar níveis?
Você tem que começar a escrever seu próprio indicador e eles lhe dirão o que fazer.
 
artmedia70:
Não, você precisa começar a escrever seu próprio indicador, e então eles lhe dirão o que você precisa fazer.

Eu criei um novo indicador, até agora parece que é assim:

#direitos autorais de propriedade intelectual "Copyright 2013, MetaQuotes Software Corp.
#link da propriedade "http://www.metaquotes.net"

#janela_do_cartão_indicador de propriedade
#property indicator_buffers 1
#indicador de propriedade_cores1 Vermelho
//--- amortecedores
duplo ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado |
//+------------------------------------------------------------------+
int init()
{
//---- indicadores
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
retorno(0);
}
//+------------------------------------------------------------------+
//| Função de desinicialização de indicador personalizada |
//+------------------------------------------------------------------+
int deinit()
{
//----
#incluir "Moving Averages.mq4"
//----
retorno(0);
}
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizada |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----

//----
retorno(0);
}
//+------------------------------------------------------------------+

 
Há níveis no indicador MA. A questão é esta - como podemos obter dados destes níveis, digamos que o preço atingiu o nível 100 ou -100 (abrir um comércio de compra/venda).
 
alexey1979621:
Há níveis no indicador MA. A questão é esta - como podemos obter dados destes níveis, digamos que o preço atingiu o nível 100 ou -100 (abrir um comércio de compra/venda).

O próprio MA na barra de zero (atual) é:

double priceMA0=iMA(Symbol(), Period(), MA_Period, MA_Shift, MA_ Method, PRICE_OPEN, 0);

Para calcular o MA, tomamos o preço Aberto para nos livrarmos da "tagarelice" no bar atual.

Então, o preço do nível +100 será:

double priceP100=priceMA0+100*Point;

O preço do nível de -100 será:

double priceM100=priceMA0-100*Point;
 
artmedia70:

O próprio MA na barra de zero (atual) é:

Para calcular o MA, tomamos o preço Aberto para nos livrarmos da "tagarelice" no bar atual.

Então, o preço do nível +100 será:

O preço do nível de -100 seria:


Obrigado, você já me ajudou mais de uma vez. Tenho certeza de que em breve vou tratar da programação.....
Razão: