Dúvida sobre script simples para média móvel

 

Boa tarde amigos,


Estou começando agora a programar robôs e estou começando através de um simples exercício. Esse exercício cria um robô que opera através da média móvel de 21 períodos, funciona através do seguinte raciocínio: 

Quando o preço cruza pra cima a mm21 ele compra, já abre o stop gain e loss automaticamente, quando o preço cruza pra baixa ele vende.

Porém, estou com um problema, por exemplo, quando ele abre a compra e atinge o alvo, ele automaticamente abre outra compra (pois o preço continua acima da média). Como resolver isso? Eu queria q ele efetivasse apenas uma vez e só voltasse a abrir novas operações quando o preço cruzasse novamente a média.

Segue o meu código: 


#include <Trade\Trade.mqh>

CTrade trade;



 double ask, bid, last;

 double smaArray[];

 int smaHandle;





int OnInit()



      {

               smaHandle = iMA(_Symbol, _Period, 21, 0, MODE_SMA, PRICE_CLOSE);

               ArraySetAsSeries(smaArray, true);

         

         

                return(INIT_SUCCEEDED);

       }



void OnTick()

  {  

         ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

         bid =  SymbolInfoDouble(_Symbol, SYMBOL_BID);

         last = SymbolInfoDouble(_Symbol, SYMBOL_LAST);

         

         CopyBuffer(smaHandle, 0, 0, 3, smaArray);

         

         if(last>smaArray[0] && PositionsTotal () == 0)

             {

               Comment("Compra");

               trade.Buy(5,  _Symbol, ask, ask-5, ask+5, "");

              }

         else if(last<smaArray[0])

              { 

              Comment("Vende");

               trade.Sell(5,  _Symbol, bid, bid-5, bid+5, "");

              

              }

   

  }

 
Vinicius Werneck:

Boa tarde amigos,


Estou começando agora a programar robôs e estou começando através de um simples exercício. Esse exercício cria um robô que opera através da média móvel de 21 períodos, funciona através do seguinte raciocínio: 

Quando o preço cruza pra cima a mm21 ele compra, já abre o stop gain e loss automaticamente, quando o preço cruza pra baixa ele vende.

Porém, estou com um problema, por exemplo, quando ele abre a compra e atinge o alvo, ele automaticamente abre outra compra (pois o preço continua acima da média). Como resolver isso? Eu queria q ele efetivasse apenas uma vez e só voltasse a abrir novas operações quando o preço cruzasse novamente a média.

Segue o meu código: 


#include <Trade\Trade.mqh>

CTrade trade;


 double ask, bid, last;

 double smaArray[];

 int smaHandle;



int OnInit()


      {

               smaHandle = iMA(_Symbol, _Period, 21, 0, MODE_SMA, PRICE_CLOSE);

               ArraySetAsSeries(smaArray, true);

         

         

                return(INIT_SUCCEEDED);

       }


void OnTick()

  {  

         ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

         bid =  SymbolInfoDouble(_Symbol, SYMBOL_BID);

         last = SymbolInfoDouble(_Symbol, SYMBOL_LAST);

         

         CopyBuffer(smaHandle, 0, 0, 3, smaArray);

         

         if(last>smaArray[0] && PositionsTotal () == 0)

             {

               Comment("Compra Porra");

               trade.Buy(5,  _Symbol, ask, ask-5, ask+5, "");

              }

         else if(last<smaArray[0])

              { 

              Comment("Vende Porra");

               trade.Sell(5,  _Symbol, bid, bid-5, bid+5, "");

              

              }

   

  }


1 - Você precisa de mais uma tonelada de checagens para ter um EA minimamente decente. A maior complexidade de um EA está em gerenciar o trade, não na estratégia em si. Recomendo o livro Expert Advisor Programming for MetaTrader 5 de Andrew Young...


2 - Cruzamento de médias só funciona em tendência. Em consolidação você vai falir e inclusive entregar todo o lucro obtido durante a tendência...


;)

 
Minions Labs:
1 - Você precisa de mais uma tonelada de checagens para ter um EA minimamente decente. A maior complexidade de um EA está em gerenciar o trade, não na estratégia em si. Recomendo o livro Expert Advisor Programming for MetaTrader 5 de Andrew Young...


2 - Cruzamento de médias só funciona em tendência. Em consolidação você vai falir e inclusive entregar todo o lucro obtido durante a tendência...


;)

Obrigado pela resposta Minions Labs.

Porém gostaria que, se puder, que foque apenas na pergunta feita. Demais informações, agradeço, mas não respondem a minha pergunta.

Vamos manter o foco na dúvida levantada no exercício que expliquei acima.

Abs.

 
Vinicius Werneck:

Obrigado pela resposta Minions Labs.

Porém gostaria que, se puder, que foque apenas na pergunta feita. Demais informações, agradeço, mas não respondem a minha pergunta.

Vamos manter o foco na dúvida levantada no exercício que expliquei acima.

Abs.

Vinicius Werneck:

Boa tarde amigos,


Estou começando agora a programar robôs e estou começando através de um simples exercício. Esse exercício cria um robô que opera através da média móvel de 21 períodos, funciona através do seguinte raciocínio: 

Quando o preço cruza pra cima a mm21 ele compra, já abre o stop gain e loss automaticamente, quando o preço cruza pra baixa ele vende.

Porém, estou com um problema, por exemplo, quando ele abre a compra e atinge o alvo, ele automaticamente abre outra compra (pois o preço continua acima da média). Como resolver isso? Eu queria q ele efetivasse apenas uma vez e só voltasse a abrir novas operações quando o preço cruzasse novamente a média.

Segue o meu código: 


#include <Trade\Trade.mqh>

CTrade trade;


 double ask, bid, last;

 double smaArray[];

 int smaHandle;



int OnInit()


      {

               smaHandle = iMA(_Symbol, _Period, 21, 0, MODE_SMA, PRICE_CLOSE);

               ArraySetAsSeries(smaArray, true);

         

         

                return(INIT_SUCCEEDED);

       }


void OnTick()

  {  

         ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

         bid =  SymbolInfoDouble(_Symbol, SYMBOL_BID);

         last = SymbolInfoDouble(_Symbol, SYMBOL_LAST);

         

         CopyBuffer(smaHandle, 0, 0, 3, smaArray);

         

         if(last>smaArray[0] && PositionsTotal () == 0)

             {

               Comment("Compra Porra");

               trade.Buy(5,  _Symbol, ask, ask-5, ask+5, "");

              }

         else if(last<smaArray[0])

              { 

              Comment("Vende Porra");

               trade.Sell(5,  _Symbol, bid, bid-5, bid+5, "");

              

              }

   

  }


Como resolver isso? Em minha estrategia, com situação parecida, resolvi problema inserindo um limitador de numero de trades na logica.

Se estivesse em seu caso, faria o mesmo.

[ ]'s


 
Joscelino Celso de Oliveira:

Como resolver isso? Em minha estrategia, com situação parecida, resolvi problema inserindo um limitador de numero de trades na logica.

Se estivesse em seu caso, faria o mesmo.

[ ]'s


Boa noite Joscelino

Obrigado pela sugestão, vou fazer isso.

Boa colaboração, caso dê certo, volto para compartilhar.

Abs.

 
Vinicius Werneck:

Boa tarde amigos,


Estou começando agora a programar robôs e estou começando através de um simples exercício. Esse exercício cria um robô que opera através da média móvel de 21 períodos, funciona através do seguinte raciocínio: 

Quando o preço cruza pra cima a mm21 ele compra, já abre o stop gain e loss automaticamente, quando o preço cruza pra baixa ele vende.

Porém, estou com um problema, por exemplo, quando ele abre a compra e atinge o alvo, ele automaticamente abre outra compra (pois o preço continua acima da média). Como resolver isso? Eu queria q ele efetivasse apenas uma vez e só voltasse a abrir novas operações quando o preço cruzasse novamente a média.

Segue o meu código: 


#include <Trade\Trade.mqh>

CTrade trade;


 double ask, bid, last;

 double smaArray[];

 int smaHandle;



int OnInit()


      {

               smaHandle = iMA(_Symbol, _Period, 21, 0, MODE_SMA, PRICE_CLOSE);

               ArraySetAsSeries(smaArray, true);

         

         

                return(INIT_SUCCEEDED);

       }


void OnTick()

  {  

         ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

         bid =  SymbolInfoDouble(_Symbol, SYMBOL_BID);

         last = SymbolInfoDouble(_Symbol, SYMBOL_LAST);

         

         CopyBuffer(smaHandle, 0, 0, 3, smaArray);

         

         if(last>smaArray[0] && PositionsTotal () == 0)

             {

               Comment("Compra Porra");

               trade.Buy(5,  _Symbol, ask, ask-5, ask+5, "");

              }

         else if(last<smaArray[0])

              { 

              Comment("Vende Porra");

               trade.Sell(5,  _Symbol, bid, bid-5, bid+5, "");

              

              }

   

  }


1. Quando você for inserir trechos de código em seu post, por favor utilize o Alt+S.

2. Você precisa definir um ponto inicial e um ponto final. Você pode fazer isso de diferentes formas, exemplo: se Open[x]<MA e Close[x] >MA -> Abrir Compra.   

 
Vinicius Werneck:

Obrigado pela resposta Minions Labs.

Porém gostaria que, se puder, que foque apenas na pergunta feita. Demais informações, agradeço, mas não respondem a minha pergunta.

Vamos manter o foco na dúvida levantada no exercício que expliquei acima.

Abs.

Então sugiro o livro "Expert Advisor Programming for MetaTrader 5" de Andrew Young... Assim você vai poupar você e o Fórum das futuras cabeçadas que você irá dar...

Boa sorte.

;)

 
Minions Labs:

Então sugiro o livro "Expert Advisor Programming for MetaTrader 5" de Andrew Young... Assim você vai poupar você e o Fórum das futuras cabeçadas que você irá dar...

Boa sorte.

;)

Penso eu que fóruns existem para se trocar informações, compartilhar informações e etc, mas vejo q vc não enxerga dessa forma. Segue definição sobre o que é um fórum:


"O fórum é um lugar físico ou virtual empregado para reunir-se, trocar ideias e experiências sobre diversos temas.

O fórum é um espaço utilizado como cenário de intercambio entre pessoas que desejam discutir sobre problemas específicos ou qualquer tipo de tema."

                                                                                                                                                                                    Fonte: https://queconceito.com.br/forum

Sendo assim, recomendo duas coisas pra vc:

1) Saia dos fóruns q participa, ou

2) Ignore aquilo que não lhe satisfaz (começando por esse tópico)


Obs.: ninguém é melhor do que ninguém, seja humilde na vida. E já estou estudando pelo Expert Advisor Programming for MetaTrader 5" de Andrew Young  ;)

Abs e boa sorte.

 
Pedro Potter:

1. Quando você for inserir trechos de código em seu post, por favor utilize o Alt+S.

2. Você precisa definir um ponto inicial e um ponto final. Você pode fazer isso de diferentes formas, exemplo: se Open[x]<MA e Close[x] >MA -> Abrir Compra.   

Obrigado pela dica Pedro, sou novo no fórum.


Vc tem razão, preciso definir limites, vou tentar utilizar o seu exemplo no meu script.

Obrigado.


Abs.

 
Vinicius Werneck:

Obrigado pela dica Pedro, sou novo no fórum.


Vc tem razão, preciso definir limites, vou tentar utilizar o seu exemplo no meu script.

Obrigado.


Abs.

De nada. Não sei se você entendeu o exemplo, a forma mais simples de você fazer isso é comparando o Open do candle em relação à MA e comparando o High ou Low ou Close (dependendo do tipo da entrada) desse mesmo candle em relação à MA.  

 

Primeiramente, um bom ano novo para você.

Agora vamos a solução do problema.

1) Abrir a operação somente no cruzamento do preço com a média móvel.

CopyClose(_Symbol,_Period,0,2,Close);

if(last>smaArray[0] && Close[1]<smaArray[1] && PositionsTotal()==0)    // Teste para comprar

if(last<smaArray[0] && Close[1]>smaArray[1] && PositionsTotal()==0 ) // Teste para vender


2) Abrir a operação somente no cruzamento do preço com a média móvel e somente uma vez na barra onde o preço cruzou com a média.

CopyClose(_Symbol,_Period,0,2,Close);
barras=Bars(_Symbol,_Period);
if(last>smaArray[0] && Close[1]<smaArray[1] && PositionsTotal()==0 && barras!=barrasAnt)
     {
      Comment("Compra");
      trade.Buy(5,  _Symbol, ask, ask-5, ask+5, "");
      barrasAnt=barras;
     }
if(last<smaArray[0] && Close[1]>smaArray[1] && PositionsTotal()==0 && barras!=barrasAnt)
     {
      Comment("Vende");
      trade.Sell(5,  _Symbol, bid, bid+5, bid-5, "");  // Atenção corrigi o seu código
      barrasAnt=barras;
     }
Razão: