Como codificar? - página 297

 

...

... 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

dif1 é a diferença entre 2 médias na barra 1

dif2 é a diferença entre 2 médias na barra 2

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

tkuan77:
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

Terrance
 

Como 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.

Arquivos anexados:
 

...

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) :

michaelB:
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.
Arquivos anexados:
 

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.

 
mladen:
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

dif1 é a diferença entre 2 médias na barra 1diff2

é a diferença entre 2 médias na barra 2

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

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);

}

//+------------------------------------------------------------------+

Arquivos anexados:
ps.jpg  16 kb
 

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

tkuan77:
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

michaelB:
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.
 
mladen:
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

tkuan77:
Olá, Mladen,

você quer dizer que a maneira como eu defino meu TP e SL está errada ou?

Cumprimentos

Terrance
 

Rosca de Lições MQL

mladen... obrigado pelo link!!