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 790

 
Forexman77:

A questão não foi descartada. Portanto, antes de mais nada.

Encontra-se um máximo, depois uma linha é traçada contra ele. A distância entre esta linha máxima e o mínimo atual é verificada. Se exceder "Rmax", uma seta é colocada na barra onde o máximo é encontrado. A seta é colocada, mas não ali. Para deixar claro, acrescentei o buffer "BufferLow[i]" que mostra a diferença e seus dados podem ser vistos na janela do explorador.

É sempre assim. Você não pode esperar por neve no inverno) Eu mesmo o fiz.

Se alguém foi atormentado por uma idéia tão semelhante, aqui está o código:

#property copyright "Kamil Gazizullin"
#property link      "forexman77@yandex.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 5
#property  indicator_color1 Magenta
#property  indicator_color2 Aqua
#property  indicator_color3 SlateBlue
#property  indicator_color4 SlateBlue
#property  indicator_color5 clrNONE
//--- input parameters
extern int       Period_=10;
extern double diapazon  =0.003;
//--- buffers
double Max[];
double Min[];
double MaxIndex[];
double MinIndex[];
double rAZNOST[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(5);
   SetIndexBuffer(0,MaxIndex);
   SetIndexBuffer(1,MinIndex);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,116);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,116);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(2,Max);
   SetIndexBuffer(3,Min);
   SetIndexBuffer(4,rAZNOST);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),limit, i,k,r,p,t,f;
    double minimum,maximum,Dmax,Dmin;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
   for(i=0;i<limit;i++)
   {
      maximum=High[iHighest(NULL,0,MODE_HIGH,Period_,i)];
      minimum=Low[iLowest(NULL,0,MODE_LOW,Period_,i)];
      Max[i]=maximum;
      Min[i]=minimum;
   }
   for(i=0;i<limit;i++)
   {
      k=iHighest(NULL,0,MODE_HIGH,Period_,i);
      t=iLowest(NULL,0,MODE_LOW,Period_,i);
      Dmax=Max[i]-Low[i];
      Dmin=High[i]-Min[i];
      if (Dmax > diapazon){p=k;for(r=p;r>=k;r--)MaxIndex[k]=Max[k];}
      if (Dmin > diapazon){p=t;for(f=p;f>=t;f--)MinIndex[t]=Min[t];}
      if (MaxIndex[i]==Max[i+1])MaxIndex[i]=0;
      if (MinIndex[i]==Min[i+1])MinIndex[i]=0;
      rAZNOST[i]=Max[i]-Min[i];
   }
   return(0);
  }
 
Awwl:

O Heiken Ashi embutido parece um pouco subdesenvolvido (será que sou só eu no 745?), mas é claro como ele funciona. E não está claro como WmiFor é construído!

No código Heiken Ashi uma vela é tirada de 4 histogramas de barras:

Ou seja, conforme o número de tampão aumenta (de 0 para 3), novas barras são desenhadas em cima das antigas. A ordem é a seguinte:

BaixoAlto - AltoBaixo - Aberto - Fechado.

A ordem dos candelabros deve ser a seguinte para obter sua aparência adequada, com corpos e caudas:

max(Abrir,Fechar)// linha de cor de espessuras/// - min(Abrir,Fechar)// branco de espessuras/// - alto// linha de cor de espessuras/// - baixo// branco de espessuras///.

Vamos compilar o indicador, colocá-lo no gráfico e ver todos os problemas (ver foto).

Mas este método, como Heiken Ashi, tem uma desvantagem - sob cada "vela" obtemos um laço branco na cor de fundo que cobre tudo mais baixo. Mas com WmiFor tudo é perfeito! Características não documentadas?

Primeira foto - Heiken Ashi (colocada em uma janela separada), segunda foto - WmiFor, o fundo está em verde claro para maior clareza.

Estamos comparando um suave e redondo? Por que colocar Haken em uma janela separada se ela foi projetada para uma janela de mapa e desenhada ali como um candelabro com sombras e corpo? E nenhuma barra nova é desenhada em cima das antigas. Se o valor do tampão mudar, a mesma barra mudará seu tamanho e não uma nova será desenhada em cima dela.

O MT4 não tem um método de desenho na forma de castiçais, portanto, somente um histograma é possível, e como você calcula os valores tampão lá é seu próprio negócio. WmiFor, a propósito, também desenha por histograma. Vamos colocá-lo também em uma janela separada e olhar para suas falhas ))))

Para fazer os castiçais em uma janela separada parecerem castiçais com sombras, eles devem ser desenhados relativamente 0, como o Acelerador. Ou você pode desenhá-los como objetos, veja por exemplo All_Stars.

 

Boa tarde a todos!

Meu cérebro está confuso; não encontrei uma resposta na documentação, mas talvez alguém a tenha encontrado. Aqui está a linha no Expert Advisor (fração de negócios positivos):

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5);

Imprime-o no diário (por exemplo):

3/6=0.00=0 0 40

Ao mesmo tempo, se a solução for 1:

3/3=1.00=1 0 40

A variável BestOd=OderPluseCount/OderTotal é do tipo duplo, o resto é int.

Ou seja, assim que um valor inferior a 1 é encontrado, o compilador o transforma automaticamente em 0... As duas últimas expressões de constantes produzem resultados surpreendentes - parece a mesma coisa, mas não ))))

Tentei diferentes substituições - tudo maior que 1 tem a parte fracionária correta.

 
Igor_:

Boa tarde a todos!

Meu cérebro está confuso; não encontrei uma resposta na documentação, mas talvez alguém a tenha encontrado. Aqui está a linha no Expert Advisor (fração de negócios positivos):

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd,",2/5*100,",100*2/5);

Imprime-o no diário (por exemplo):

3/6=0.00=0 0 40

Ao mesmo tempo, se a solução for 1:

3/3=1.00=1 0 40

A variável BestOd=OderPluseCount/OderTotal é do tipo duplo, o resto é int.

Ou seja, assim que um valor inferior a 1 é encontrado, o compilador o transforma automaticamente em 0... As duas últimas expressões de constantes produzem resultados surpreendentes - parece a mesma coisa, mas não ))))

Eu tentei diferentes substituições, tudo maior que 1 tem a parte fracionária correta.

Tente isto

DoubleToStr((duplo)(OderPluseCount/OderTotal),2)

 
AlexeyVik:

Tente isto

DoubleToStr((duplo)(OderPluseCount/OderTotal),2)

Não ajuda. Mas obrigado )
 
Igor_:
Isso não ajuda. Mas obrigado )
DoubleToStr((double)(OderPluseCount/(OderTotal*1,0)),2)
 
Vinin:
DoubleToStr((double)(OderPluseCount/(OderTotal*1,0)),2)

Funciona assim, obrigado. Parece ser xamanismo ))))

Honestamente, estou mais preocupado não com a exibição, mas com o cálculo corretodo BestOd. Tinha que corrigi-lo também.

Eu o fiz desta maneira:

BestOd=(OderPluseCount/(OderTotal*1.0));

Existe alguma explicação para isto? Afinal de contas, seria muito difícil detectar este erro se não fosse pela impressão. Em que casos isso pode ocorrer?

 
Igor_:

Funciona assim, obrigado. Soa como xamanismo ))))

Honestamente, estou mais preocupado não com a exibição, mas com o cálculo correto doBestOd. Tinha que corrigi-lo também.

Eu o fiz desta maneira:

BestOd=(OderPluseCount/(OderTotal*1.0));

Existe alguma explicação para isto? Afinal de contas, seria muito difícil detectar este erro se não fosse pela impressão. Em que casos ele pode aparecer?

Em qualquer operação com valores inteiros, o resultado será um número inteiro.
 

Eu mesmo encontrei a resposta no livro de referência, seção"Conversão de tipo".

Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме: 

Mas o tipo duplo neste esquema é o mais antigo. E eu tinha as duas intenções. Portanto, o resultado é inteiro. Introdução de uma constante de tipo superior (duplo, flutuador), converteu todas as int's para ela.

Você aprende por um longo tempo, e consulta a documentação))))

 
Olá, eu tenho a seguinte pergunta.
Como devo fazer uma EA que passe e modifique as posições em aberto, para que não modifique repetidamente as ordens que foram modificadas durante a próxima passagem. É preciso "oleá-los" de alguma forma.
Eu não consigo pensar em nada.
Eu ficaria muito grato por isso.