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, "");
}
}
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...
;)
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.
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.
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
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.
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.
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.
;)
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.
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.
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; }
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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: