[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 479

 
SetIndexDrawBegin(0,Bars-30);//первый бар отрисовки индикатора 

Eu não sei qual é sua lógica, comigo esta configuração desenha as últimas 30 barras do indicador

Mais uma vez, SetIndexDrawBegin() calcula as barras a partir da extremidade esquerda do gráfico

verifique antes de começar a discutir.

 
merkulov.artem:

OK. Vou tentar delinear a essência do problema, talvez alguém sugira ou ajude a implementá-lo de uma forma mais simples.

Estamos trabalhando em um minucioso gráfico. Vamos tomar a barra de um minuto (alto+baixo/2 - valor médio da barra) no gráfico de 29/10/12 às 00:00 - ela será um ponto de referência.

Depois verificamos o desvio deste preço para cima em 10 pips (cada desvio correto é +1).

Quando atingimos o desvio de 10 pontos do ponto de partida - o contador +1; e começamos a verificar outros desvios, mas a partir do ponto, onde atingimos o desvio de 10 pontos, e esperamos pelo próximo aumento de preço de 10 pontos.

Por exemplo, nós conseguimos:

Se (ponto inicial) + 10 pips <= preço (usamos todos os preços subseqüentes de barras a partir do ponto inicial.) Recebemos um contador = contador +1; e iniciamos o ponto inicial já a partir deste ponto -(ponto inicial + 10 pips).

Se (ponto inicial + 10 pips) +10 pips <= preço (todos os preços subsequentes de barras do ponto de referência são usados) obtemos counter=Counter+1; e partimos deste ponto-(ponto inicial + 10 pips) +10 pips.

Se(ponto inicial + 10 pips+10 p ips) + 10 pips <= preço (usamos todos os preços subseqüentes de barras a partir do ponto de referência.) obtemos counter=Counter+1; e partimos deste ponto -(ponto inicial + 10 pips+ 10pips) + 10 pips.

e assim por diante...

Até chegarmos a um contador de 10(contador == 10).

E a cada novabarra formadade 1 minuto (alto+baixo/2 - valor médio da barra) verificamos esta condição e esperamos até que o contador chegue a10 (contador == 10). Suponha que dois dias se passaram, cada nova barra formada nós verificamos e alteramos se as condições estavam corretas .....

E quando chegamos ao contador =10 - emitimos a mensagem de que "Contador == 10". Estabelecemos o ponto de partida 2 dias à frente do original definido pelo usuário, ou seja, de29/10/12 às 00:00 a 31/10/12 às 00:00 e repetimos o ciclo.

Repita o ciclo e assim se mova através do cronograma.

Ou seja, devemos pegar as barras recém-formadas e sacar(alto+baixo/2 - valor médio da barra). E verifique as condições e, se elas estiverem corretas, altere-as conforme descrito acima.

Eu tentei implementá-lo através de uma matriz, é muito confuso e dá valores errados! Ajude-me, por favor, como implementar este algoritmo!


Você não precisa de arrays aqui. Isto é mesmo um Expert Advisor, um roteiro ou um indicador? A questão é que o código do Conselheiro Especialista será diferente do código do indicador para a implementação desta tarefa.

E há aqui uma desvantagem significativa. Vejam, marcamos o ponto de partida e ele está bem no auge da tendência de alta. Suponha que não consideremos a leitura desta vela em busca de mais 10 pontos - vamos chamá-la de vela inicial. Então, o próximo castiçal vai para baixo e não pegamos nenhum dos dois níveis = ponto de partida + 10 pips: o preço vai para baixo. Portanto, podemos dizer que estamos presos por um longo tempo - o preço desceu e pode subir e descer de qualquer forma - não alcançará o nível do ponto de partida de qualquer forma - os ursos pressionaram-na firmemente. Mas digamos que tivemos sorte e depois de 5.000 velas, o preço voltou ao nível do ponto de partida, e até subiu 10 pips. Perdemos muito tempo, mas agora podemos colocar o preço igual ao ponto de partida + 10 pontos na variável e esperar até o preço atingir o nível = nível variável + 10 pontos... Em resumo, não precisamos de tudo isso - a julgar pela sua descrição, estamos pegando o nível = ponto de partida + 10*10 = ponto de partida + 100 pips. Uma vez que este nível tenha sido alcançado, movemos a data de início 2 dias para o futuro e calculamos um novo ponto de partida. Isto é complicado - há uma maneira mais fácil.

Definimos a data de início em variáveis personalizadas (precedidas por externo no código). Declare uma variável do tipo data/hora. Suponha que seja a variável dt_StartDate (data de início) e então no bloco de inicialização lhe atribuímos o valor armazenado na variável personalizada. Depois procuramos o castiçal que corresponda a esta data e calculamos o ponto de partida usando sua fórmula. Entretanto, não é o ponto de partida, mas o nível de preço inicial. Declarar uma variável do tipo duplo, por exemplo, d_StartLevel (nível inicial) e entrar o valor do nível calculado na variável. Ou pode ser ainda mais fácil - não declarar uma variável, mas traçar uma linha horizontal através do preço inicial calculado. Vamos chamá-lo de StartLevel. Agora vamos traçar a segunda linha na tabela a uma distância = 100 pontos acima do nível inicial - vamos chamá-la de OtlovLevel. Mais adiante, não precisamos de arrays - em cada carrapato, simplesmente observamos se o preço é mais alto que o OtlovLevel ou não. Assim que for, aumentamos o valor da variável dt_StartDate em 2 dias, calculamos o nível inicial novamente e deslocamos a linha inicial para lá. Depois disso, novamente pegamos 100 pontos acima da linha de partida e arrastamos a linha OtlovLevel até lá. Isso é tudo, a tarefa está resolvida. Toda vez que podemos solicitar o preço ao qual qualquer linha é definida e compará-lo com o preço atual ou com o preço alto da vela atual.

 
midorum:

Eu não sei qual é sua lógica, comigo esta configuração desenha as últimas 30 barras do indicador

Mais uma vez, SetIndexDrawBegin() calcula as barras a partir da extremidade esquerda do gráfico

verifique antes de discutir.

Portanto, não estou discutindo. Aqui está um olhar. Vamos tomar um indicador CCI padrão. Eu substituí operíodo CCIP por(Bars- CCIPeriod) na função SetIndexDrawBegin . Eu só mudei o amarelo destacado no código.

Aqui está o código:

//+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern int CCIPeriod = 14;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(1, RelBuffer);
   SetIndexBuffer(2, DevBuffer);
   SetIndexBuffer(3, MovBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, CCIBuffer);
//----
   if(CCIPeriod <= 0)
       CCIPeriod = 14;
//----
   SetIndexDrawBegin(0, Bars - CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name="CCI(" + CCIPeriod + ")";
   IndicatorShortName(short_name);
   SetIndexLabel(0, short_name);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i, k, counted_bars = IndicatorCounted();
   double price, sum, mul; 
   if(CCIPeriod <= 1)
       return(0);
   if(Bars <= CCIPeriod) 
       return(0);
//---- initial zero
   if(counted_bars < 1)
     {
       for(i = 1; i <= CCIPeriod; i++) 
           CCIBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           DevBuffer[Bars-i] = 0.0;
       for(i = 1; i <= CCIPeriod; i++) 
           MovBuffer[Bars-i] =0.0;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if(counted_bars > 0) 
       limit++;
//---- moving average
   for(i = 0; i < limit; i++)
       MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
//---- standard deviations
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   mul = 0.015 / CCIPeriod;
   while(i >= 0)
     {
       sum = 0.0;
       k = i + CCIPeriod - 1;
       while(k >= i)
        {
          price =(High[k] + Low[k] + Close[k]) / 3;
          sum += MathAbs(price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       price = (High[i] + Low[i] + Close[i]) / 3;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1;
   if(counted_bars > CCIPeriod - 1) 
       i = Bars - counted_bars - 1;
   while(i >= 0)
     {
       if(DevBuffer[i] == 0.0) 
           CCIBuffer[i] = 0.0;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Logicamente, se operíodo de CCIP for 14. Em seguida,SetIndexDrawBegin(0, Barras - Período CCIP) deve sortear apenas 14 últimas barras. Começa a partir do valor (Bar - 14). Mas isto é o que vejo na tela

 
hoz:

Portanto, não estou discutindo. Aqui está um olhar. Pegue o indicador padrão CCI. Eu substituí operíodo CCIP na função SetIndexDrawBegin por(Barras- Período CCIP). Eu só mudei o amarelo destacado no código.

Aqui está o código:

Logicamente, se operíodo de CCIP for 14. Em seguida,SetIndexDrawBegin(0, Barras - Período CCIP) deve sortear apenas 14 últimas barras. Começa a partir do valor (Bar - 14). Mas isto é o que vejo na tela

Isto é o que eu vejo na tela

no topo o indicador nativo, abaixo mudou para SetIndexDrawBegin(0, Bars-CCIPeriod);

 
midorum, minhas desculpas. Meu erro. MetaEditor abriu outro terminal... Está funcionando agora. Obrigado!
 
hoz:
midorum, minhas desculpas. Meu erro. MetaEditor abriu outro terminal... Está funcionando agora. Obrigado!
Sim, eu também luto com este problema o tempo todo - 3 terminais, e o Editor confunde as pastas. É melhor passar pelo botão no terminal e abrir o arquivo nele manualmente.
 

Bom dia pessoal, por favor, me dêem uma resposta, como determinar que a vela de 15 minutos se abriu, eu usei um cordel de arrepiar a mente, mas como acabou, nem sempre a vela se abre pelo tempo... Acho que há uma maneira mais simples de descobrir que a vela se abriu... mas eu não entendo...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|||| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) |||| (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) |||| (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)

 
stater:

Bom dia pessoal, por favor, me dêem uma resposta, como determinar que a vela de 15 minutos se abriu, eu usei um cordel de arrepiar a mente, mas como acabou, nem sempre a vela se abre pelo tempo... Acho que há uma maneira mais simples de descobrir que a vela se abriu... mas eu não entendo...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|||| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) |||| (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) |||| (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


https://www.mql5.com/ru/forum/131853/page4#504607
 
stater:

Bom dia pessoal, por favor, me dêem uma resposta, como determinar que a vela de 15 minutos se abriu, eu usei um cordel de arrepiar a mente, mas como acabou, nem sempre a vela se abre pelo tempo... Acho que há uma maneira mais simples de descobrir que a vela se abriu... mas eu não entendo...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|||| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) |||| (TimeMinute(TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) |||| (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0)


bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
A função retorna verdadeiro quando uma nova barra aparece na M15
 
Vinin:

A função retorna verdadeiro quando uma nova barra aparece na M15
Muito obrigado!
Razão: