Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
...
... Terrance
Você queria testar para uma cruz em um bar fechado. O turno 1 significa primeira barra fechada e o turno 2 significa primeira barra antes disso. E se você deseja testar para uma cruz em uma barra fechada, essas são as barras que você tem que testar
A partir de (dif1*diff2)<0) : é bastante simples na verdade
Qualquer um pode ser positivo ou negativo. O que nos interessa é quando um é positivo e o outro negativo, porque isso significa que as médias já se cruzaram. Multiplicá-las nos dá uma resposta rápida se houver uma cruz (se os sinais são diferentes, então o resultado é menor que 0, se os sinais são iguais o resultado dessa multiplicação é maior que 0).
Espero que isso esclareça o que esse código faz
Oi Mladen, eu experimentei o que você me disse e isso funciona maravilhosamente. Entretanto, não entendo bem a lógica por trás dos códigos. por que você define a mudança do iMA para 1 e 2 e por que você codifica isto: (dif1*diff2)<0) também? Desculpe, mas atualmente ainda estou na frase de aprendizagem.
Obrigado e cumprimentos
TerranceComo adicionar setas
Em anexo está uma versão abreviada do MA crossover EA discutido nos últimos posts.
Quando um crossover ocorre em uma vela fechada, esta versão imprime uma mensagem para o arquivo de registro.
Seria possível substituir a lógica de impressão por código para exibir setas para cima/para baixo no gráfico?
Obrigado por sua ajuda.
...
Tente desta forma ...
Ele desenhará uma seta e mostrará um comentário no canto inferior direito do gráfico - assim (acrescentou as médias no gráfico apenas para tornar óbvio o que ele faz) :
Em anexo está uma versão abreviada do MA crossover EA discutido nos últimos posts.
Quando um cruzamento ocorre em uma vela fechada, esta versão imprime uma mensagem para o arquivo de registro.
Seria possível substituir a lógica de impressão por código para exibir setas para cima/para baixo no gráfico?
Obrigado por sua ajuda.Setas de MA
O "2MAcrossover com comentários" funciona muito bem.
Apenas uma pergunta - uma vez que uma flecha aparece, ela desaparecerá quando uma nova vela se abrir, isto foi intencional?
Eu gosto do comentário no canto inferior direito do gráfico.
Mais uma vez, obrigado.
Terrance
Você queria testar para uma cruz em um bar fechado. O turno 1 significa primeira barra fechada e o turno 2 significa primeira barra antes disso. E se você deseja testar para uma cruz em uma barra fechada, essas são as barras que você tem que testar
A partir de (dif1*diff2)<0) : é bastante simples na verdade
Qualquer um pode ser positivo ou negativo. O que nos interessa é quando um é positivo e o outro negativo, porque isso significa que as médias já se cruzaram. Multiplicá-las nos dá uma resposta rápida se houver uma cruz (se os sinais são diferentes, então o resultado é menor que 0, se os sinais são iguais o resultado dessa multiplicação é maior que 0).
Espero que isso esclareça o que esse código fazObrigado Mladen por sua ajuda! Mas quando eu acrescentei esse código, minha EA parece ficar um pouco fora de controle. Ocasionalmente, ele irá auto SL ou TP por conta própria, mesmo antes que o SL ou TP real seja alcançado como o mostrado na minha captura de tela. por que isso acontece?
Obrigado e cumprimentos
Terrance
//--- parâmetros de entrada
duplo TakeProfit externo=1000.0;
duplo externo Lots=0,1;
duplo StopLoss externo=1500.0;
//+------------------------------------------------------------------+
//| função de iniciação de especialista |
//+------------------------------------------------------------------+
int init()
{
//----
//----
retorno(0);
}
//+------------------------------------------------------------------+
//| função de desinicialização especializada |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
retorno(0);
}
int mainCrossed (dupla linha principal1 , dupla linha principal2)
{
estático no último_direcionamento principal = 0;
direção_multi_corrente estática int = 0;
if(mainline1>mainline2)maincurrent_dirction = 1; //main up
if(mainline1<mainline2)maincurrent_dirction = 2; //main down
if(maincurrent_dirction != mainlast_direction) //main changed
{
mainlast_direction = maincurrent_dirction;
retorno (último_direção_principal);
}
senão
{
retorno (0);
}
}
//+------------------------------------------------------------------+
//| função de início especializado |
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, bilhete, total;
duplo shortEma, longEma, mainshortEma, mainlongEma;
if(Bars<100)
{
Impressão ("barras com menos de 100");
retornar(0);
}
if(TakeProfit<10)
{
Imprimir ("TakeProfit menos de 10");
retornar(0); // verificar TakeProfit
}
int isCrossed = 0;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);
duplo longoEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);
duplo curtoEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);
duplo longoEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);
duplo dif1 = curtoEma1-longoEma1;
duplo dif2 = curtoEma2-longoEma2;
mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);
mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);
if ((diff1*diff2)<0)
{
se (shortEma1>longEma1)
isCrossed = 1;
caso contrário, isCrossed = 2;
}
total = EncomendasTotal();
if(total < 1)
{
if(isCrossed == 1 && mainshortEma > mainlongEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"Minha EA",12345,0,Verde);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Imprimir("Pedido aberto : ",OrderOpenPrice());
}
else Print("Erro na abertura do pedido de compra : ",GetLastError());
retornar(0);
}
if(isCrossed == 2 && mainshortEma < mainlongEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,
Bid-TakeProfit*Point, "My EA",12345,0,Red);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Imprimir("Pedido de venda aberto : ",OrderOpenPrice());
}
else Print("Erro na abertura do pedido de VENDA : ",GetLastError());
retornar(0);
}
retorno(0);
}
retorno(0);
}
//+------------------------------------------------------------------+
Terrance
Esse código não tem nada a ver com SL ou TP. Ele simplesmente testa 2 médias para cruzamentos (veja como michaelB usou esse mesmo código em seus 2MACrosses, já que isso também é nan EA). O resto de seu código precisa ser revisado para aqueles erros SL e TP
Obrigado Mladen por sua ajuda! Mas quando eu acrescentei esse código, minha EA parece ficar um pouco fora de controle. Ocasionalmente, ele irá auto SL ou TP por conta própria, mesmo antes que o SL ou TP real seja alcançado como o mostrado na minha captura de tela. por que isso acontece?
Obrigado e cumprimentos
Terrance
//--- parâmetros de entrada
duplo TakeProfit externo=1000.0;
duplo externo Lots=0,1;
duplo StopLoss externo=1500.0;
//+------------------------------------------------------------------+
//| função de iniciação de especialista |
//+------------------------------------------------------------------+
int init()
{
//----
//----
retorno(0);
}
//+------------------------------------------------------------------+
//| função de desinicialização especializada |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
retorno(0);
}
int mainCrossed (dupla linha principal1 , dupla linha principal2)
{
estático no último_direcionamento principal = 0;
direção_multi_corrente estática int = 0;
if(mainline1>mainline2)maincurrent_dirction = 1; //main up
if(mainline1<mainline2)maincurrent_dirction = 2; //main down
if(maincurrent_dirction != mainlast_direction) //main changed
{
mainlast_direction = maincurrent_dirction;
retorno (último_direção_principal);
}
senão
{
retorno (0);
}
}
//+------------------------------------------------------------------+
//| função de início especializado |
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, bilhete, total;
duplo shortEma, longEma, mainshortEma, mainlongEma;
if(Bars<100)
{
Impressão ("barras com menos de 100");
retornar(0);
}
if(TakeProfit<10)
{
Imprimir ("TakeProfit menos de 10");
retornar(0); // verificar TakeProfit
}
int isCrossed = 0;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);
duplo longoEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);
duplo curtoEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);
duplo longoEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);
duplo dif1 = curtoEma1-longoEma1;
duplo dif2 = curtoEma2-longoEma2;
mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);
mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);
if ((diff1*diff2)<0)
{
se (shortEma1>longEma1)
isCrossed = 1;
caso contrário, isCrossed = 2;
}
total = EncomendasTotal();
if(total < 1)
{
if(isCrossed == 1 && mainshortEma > mainlongEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"Minha EA",12345,0,Verde);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Imprimir("Pedido aberto : ",OrderOpenPrice());
}
else Print("Erro na abertura do pedido de compra : ",GetLastError());
retornar(0);
}
if(isCrossed == 2 && mainshortEma < mainlongEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,
Bid-TakeProfit*Point, "My EA",12345,0,Red);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Imprimir("Pedido de venda aberto : ",OrderOpenPrice());
}
else Print("Erro na abertura do pedido de VENDA : ",GetLastError());
retornar(0);
}
retorno(0);
}
retorno(0);
}
//+------------------------------------------------------------------+...
Sim, é intencional
Como você fez uma EA e não um indicador, a adição foi para mostrar apenas a última cruz ativa e quando não há nenhuma cruz ativa, não mostrar uma seta. Para torná-la capaz de mostrar várias setas, seria necessário primeiro convertê-la em indicador e depois reescrever tudo, mas acho que há muitos indicadores que já mostram as médias de cruzamentos no gráfico
O "2MAcrossover com comentários" funciona muito bem.
Apenas uma pergunta - uma vez que uma seta aparece, ela desaparecerá quando uma nova vela se abrir, isto foi intencional?
Eu gosto do comentário no canto inferior direito do gráfico.
Mais uma vez, obrigado.Terrance Esse código não tem nada a ver com SL ou TP. Ele simplesmente testa 2 médias para cruzamentos (veja como michaelB usou esse mesmo código em seus 2MACrosses, já que isso também é nan EA). O resto de seu código precisa ser revisado para aqueles erros SL e TP
Olá, Mladen,
você quer dizer que a maneira como eu defino meu TP e SL está errada ou?
Cumprimentos
Terrance
...
... Terrance
Você viu esta seção do TSD : Lições?
Acho que muitas perguntas já estão respondidas lá e que você pode encontrar exemplos muito bons para a escrita geral da EA lá. A partir de sua pergunta : Eu não testei sua EA, então eu não sei. O problema de testar a EA de outra pessoa é que é preciso conhecer a idéia e a lógica da EA e muitas vezes é simplesmente impossível "ler" as do próprio código. O trecho de código de que estávamos falando tratava de como detectar 2 cruzamentos de médias em uma barra fechada e esse código está fazendo exatamente isso e nada mais que isso. É por isso que eu disse que "não tem nada a ver com SL ou TP".
cumprimentos
Mladen
Olá, Mladen,
você quer dizer que a maneira como eu defino meu TP e SL está errada ou?
Cumprimentos
TerranceRosca de Lições MQL
mladen... obrigado pelo link!!