Blz Galera!
Dei uma olhada no fórum, mas não encontrei nada do tipo para minha dúvida.
Gostaria de saber se é possível colocar a abertura de ordem compra ou venda no exato momento do cruzamento das médias,
e não no PRICE_CLOSE ou OPEN do próximo candle que se forma depois do cruzamento como de costume?
Ex: if (iMA(NULL,0,MediaCurta,0,MODE_SMA,PRICE_CLOSE,0) > iMA(NULL,0,MediaLonga,0,MODE_SMA,PRICE_CLOSE,0) && order_compra==true){
Olá TraderPrado,
Isso é perfeitamente possível de ser feito! Entretanto a abordagem correta seria você passar os valores das médias para dois buffers, representando as médias curta e longa.
Uma vez copiados os valores para os buffers, os mesmos deverão ser utilizados em sua lógica operacional, de maneira a capturar o cruzamento das médias utilizando os últimos 2 candles, caso queira trabalhar com confirmação (o que é o mais comum).
Espero ter ajudado.
Abraços,
Malacarne
Olá TraderPrado,
Isso é perfeitamente possível de ser feito! Entretanto a abordagem correta seria você passar os valores das médias para dois buffers, representando as médias curta e longa.
Uma vez copiados os valores para os buffers, os mesmos deverão ser utilizados em sua lógica operacional, de maneira a capturar o cruzamento das médias utilizando os últimos 2 candles, caso queira trabalhar com confirmação (o que é o mais comum).
Espero ter ajudado.
Abraços,
Malacarne
Ok!, obrigado! Sabendo que é possível agora, vou postar o código do EA aqui, pois pode servir para alguém que esteja procurando algo parecido. Eu sou novo em programação, não sei quase nada, e talvez tenha alguém aqui no fórum com a mesma dúvida ou problema. Tentei fazer alguns EAs especulando na net, mas não funcionou muito bem. Então encontrei a ideia deste código abaixo e dei uma modificada, e pra mim que sou novato ele até que atendeu minha expectativa. A única coisa que eu não consegui foi colocar as ordens de abertura e fechamento no exato cruzamento das médias. Eu até tentei baseado no que vc me disse, eu pesquisei algo parecido, mas não funcionou nada depois que eu inseri os códigos, então resolvi voltar ao estado anterior (ou seja, ordens no Price Close). O que eu gostaria é de saber se alguma alma caridosa se arrisca a resolver esta questão, se não for abuso de minha parte. Fazer com que as ordens de abertura e fechamento sejam executadas no exato cruzamento das médias. //+------------------------------------------------------------------+ //| EA médias móveis.mq4 | //| Prado | //| | //+------------------------------------------------------------------+ 7 #define IdentificadorEA 101 8 9 #property copyright "Prado" 10 #property link "" 11 12 //---- Input parameters - parâmetros do Expert Advisor que podem ser alterados quando se executa o dito. 13 extern double Lotes = 0.1; 14 extern int MMlenta = 40; 15 extern int MMrapida = 5; 16 extern int StopLoos = 300; 17 18 //------------------------------------------------------------------------------------------------- 19 20 datetime LastTradeBarTime; 21 22 //------------------------------------------------------------------------------------------------- 23 // init, função executada quando o EA se inicia ou reinicia 24 25 int init() 26 { 27 // Necessário para controlar se estamos numa nova barra 28 LastTradeBarTime = Time[1]; 29 return(0); 30 } 31 //------------------------------------------------------------------------------------------------- 32 // start, função executada a cada tick recebido pelo EA 33 34 int start() 35 { 36 37 // Variáveis temporárias, renovadas a cada chamada do EA 38 39 double vMMrapida0; // MM rápida da última barra 40 double vMMrapida1; // MM rápida da penúltima barra 41 double vMMlenta0; // MM lenta da última barra 42 double vMMlenta1; // MM lenta da penúltima barra 43 int resposta; // Variável que obterá a resposta do terminal quando envia uma ordem 44 45 // Verifica se estamos no início de uma barra e apenas processa as instruções se isso for verdade 46 if (LastTradeBarTime == Time[0]) 47 return(0); // Não é o primeiro tick de uma nova barra, por isso sai 48 else 49 { 50 LastTradeBarTime = Time[0]; // continua 51 52 // Valores das médias móveis na barra que acabou de terminar, e na imediatamente anterior 53 vMMrapida0=iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,1); // Obtém o valor da MM rápida da barra que terminou 54 vMMrapida1=iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,2); // Obtém o valor para a MM rápida da barra anterior 55 vMMlenta0=iMA(Symbol(),0,MMlenta,0,MODE_SMA,PRICE_CLOSE,1); // Obtém o valor da MM lenta da barra que terminou 56 vMMlenta1=iMA(Symbol(),0,MMlenta,0,MODE_SMA,PRICE_CLOSE,2); // Obtém o valor para a MM lenta da barra anterior 57 58 // Verifica se existiu um cruzamento da MM rápida acima da MM lenta 59 if (vMMrapida1<vMMlenta1 && vMMrapida0>vMMlenta0) 60 { 61 // Se já existem trades abertos, tem de os fechar 62 if (OrdersTotal() > 0) FecharTodosTrades(); 63 64 // Abre um trade longo 65 resposta = OrderSend(Symbol(),OP_BUY,Lotes,NormalizeDouble(Ask,Digits),3,StopLoos,0,"mm exemplo buy",IdentificadorEA,0,Blue); 66 } 67 68 69 // Verifica se existiu um cruzamento da MM rápida abaixo da MM lenta 70 if (vMMrapida1>vMMlenta1 && vMMrapida0<vMMlenta0) 71 { 72 // Se já existem trades abertos, tem de os fechar 73 if (OrdersTotal() > 0) FecharTodosTrades(); 74 75 // Abre um trade curto 76 resposta = OrderSend(Symbol(),OP_SELL,Lotes,NormalizeDouble(Bid,Digits),3,StopLoos,0,"mm exemplo sell",IdentificadorEA,0,Red); 77 } 78 } 79 return(0); 80 } 81 82 83 //------------------------------------------------------------------------------------------------- 84 // deinit, função executada quando o EA termina 85 86 int deinit() 87 { 88 // Se existem trades abertos, tem de os fechar 89 if (OrdersTotal() > 0) FecharTodosTrades(); 90 return(0); 91 } 92 93 94 //------------------------------------------------------------------------------------------------- 95 // Função que fecha todos os trades existentes 96 97 int FecharTodosTrades() 98 { 99 for(int i=0;i<OrdersTotal();i++) 100 { 101 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false) break; 102 103 // A função vai fechar todas as ordens que sejam deste EA e sobre o símbolo corrente 104 if(OrderMagicNumber() == IdentificadorEA && OrderSymbol() == Symbol()) 105 { 106 if(OrderType()==OP_BUY) 107 int rec = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,White); 108 if(OrderType()==OP_SELL) 109 rec = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,White); 110 } 111 } 112 return(0); 113 } 114 115 116 // FIM 117 //-------------------------------------------------------------------------------------------------
Poderiam me ajudar?
gostaria de abrir uma ordem de compra no cruzamento de MM 6/21, e efetuar o fechamento no movimento inverso no cruzamento da MM 21/6. Porém, somente se houver lucro.
int start()
{
double MyPoint=Point;
if(Digits==3 || Digits==5) MyPoint=Point*10;
double TheStopLoss=0;
double TheTakeProfit=0;
if( TotalOrdersCount()==0 )
{
int result=0;
if((iMA(NULL,0,6,1,MODE_SMA,PRICE_CLOSE,1)>iMA(NULL,0,21,1,MODE_SMA,PRICE_CLOSE,1))) // Here is your open buy rule
{
result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Blue);
if(result>0)
{
TheStopLoss=0;
TheTakeProfit=0;
if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
OrderSelect(result,SELECT_BY_TICKET);
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
}
return(0);
}
}
for(int cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber
)
{
if(OrderType()==OP_BUY)
{
if((iMA(NULL,0,6,1,MODE_SMA,PRICE_CLOSE,1)<iMA(NULL,0,21,1,MODE_SMA,PRICE_CLOSE,1))) //here is your close buy rule
{
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
}
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
{
if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else
{
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
{
if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
int TotalOrdersCount()
{
int result=0;
for(int i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);
if (OrderMagicNumber()==MagicNumber) result++;
}
return (result);
}
//+------------------------------------------------------------------+ //| MM EA.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #define IdentificadorEA 101 //--- Input parameters - parâmetros do Expert Advisor que podem ser alterados quando se executa o dito. extern double Lotes = 0.1; extern int MMlenta = 40; extern int MMrapida = 5; extern int StopLoss = 300; extern int TakeProfit = 30; extern bool MMfechar = false; // Fechar no cruzamento das MMs (true / false) //--- datetime LastTradeBarTime; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Necessário para controlar se estamos numa nova barra LastTradeBarTime = Time[1]; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Se existem trades abertos, tem de os fechar if(OrdersTotal() > 0) {FecharTodosTrades();} } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- Variáveis temporárias, renovadas a cada chamada do EA double vMMrapida0; // MM rápida da última barra double vMMrapida1; // MM rápida da penúltima barra double vMMlenta0; // MM lenta da última barra double vMMlenta1; // MM lenta da penúltima barra int resposta; // Variável que obterá a resposta do terminal quando envia uma ordem //--- Verifica se estamos no início de uma barra e apenas processa as instruções se isso for verdade if(LastTradeBarTime == Time[0]) {return;} // Não é o primeiro tick de uma nova barra, por isso sai else { LastTradeBarTime = Time[0]; // continua //--- Valores das médias móveis na barra que acabou de terminar, e na imediatamente anterior vMMrapida0 = iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,1); // Obtém o valor da MM rápida da barra que terminou vMMrapida1 = iMA(Symbol(),0,MMrapida,0,MODE_SMA,PRICE_CLOSE,2); // Obtém o valor para a MM rápida da barra anterior vMMlenta0 = iMA(Symbol(),0,MMlenta, 0,MODE_SMA,PRICE_CLOSE,1); // Obtém o valor da MM lenta da barra que terminou vMMlenta1 = iMA(Symbol(),0,MMlenta, 0,MODE_SMA,PRICE_CLOSE,2); // Obtém o valor para a MM lenta da barra anterior //--- Verifica se existiu um cruzamento da MM rápida acima da MM lenta if(vMMrapida1 < vMMlenta1 && vMMrapida0 > vMMlenta0) { //--- Verifica se existem posições abertas e se devem ser fechadas if(OrdersTotal() > 0 && MMfechar) {FecharTodosTrades();} //--- Abre um trade longo resposta = OrderSend(Symbol(), OP_BUY, Lotes, Ask, 3, Ask - StopLoss * Point, Ask + TakeProfit * Point, "mm exemplo buy", IdentificadorEA, 0, clrBlue); } //--- Verifica se existiu um cruzamento da MM rápida abaixo da MM lenta if(vMMrapida1 > vMMlenta1 && vMMrapida0 < vMMlenta0) { //--- Verifica se existem posições abertas e se devem ser fechadas if(OrdersTotal() > 0 && MMfechar) {FecharTodosTrades();} //--- Abre um trade curto resposta = OrderSend(Symbol(), OP_SELL, Lotes, Bid, 3, Bid + StopLoss * Point, Bid - TakeProfit * Point, "mm exemplo sell", IdentificadorEA, 0, clrRed); } } } //+------------------------------------------------------------------+ //| Função que fecha todos os trades existentes | //+------------------------------------------------------------------+ void FecharTodosTrades() { bool rec; for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) {break;} //--- A função vai fechar todas as ordens que sejam deste EA e sobre o símbolo corrente if(OrderMagicNumber() == IdentificadorEA && OrderSymbol() == Symbol()) { if(OrderType() == OP_BUY) {rec = OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrWhite);} else if(OrderType() == OP_SELL) {rec = OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrWhite);} } } } //+------------------------------------------------------------------+ //| Expert End | //+------------------------------------------------------------------+
// + ----------------------------------------------- ------------------- + #property copyright "Copyright 2019," #property link "https://www.mql5.com" #property version "1.00" #property strict #define IdentifierEA 101 // --- Input parameters - parameters of the Expert Advisor that can be changed when the function is executed. extern double Lots = 0.1 ; extern int MMlenta = 40 ; extern int MMrapida = 5 ; extern int StopLoss = 300 ; extern int TakeProfit = 30 ; extern bool MMfechar = false ; // Close at the intersection of the MMs (true / false) extern int Mild = 0 ; // extern int identifierEA = 12345; // --- datetime LastTradeBarTime; // + ----------------------------------------------- ------------------- + // | Expert initialization function | // + ----------------------------------------------- ------------------- + int OnInit () { // --- Required to control if we are in a new bar LastTradeBarTime = Time [ 1 ]; // --- return ( INIT_SUCCEEDED ); } // + ---------------------------------------------- - ------------------- + // | Expert deinitialization function | // + ----------------------------------------------- ------------------- + void OnDeinit ( const int reason) { // --- If there are open trades, you have to close them if ( OrdersTotal ()> 0 ) {CloseAllTrades ();} } // + ----------------------------------------------- ------------------- + // | Expert tick function | // + ----------------------------------------------- ------------------- + void OnTick () { // --- Temporary variables, renewed every call of EA double vMMrapida0; // Fast MM of the last double vMMrapida1; // Fast MM of penultimate double vMMlenta0; // slow MM of the last double vMMlenta1; // slow MM of the penultimate bar int response; // Variable that will get the terminal response when sending an order // --- Checks if we are at the beginning of a bar and only if this is true if (LastTradeBarTime == Time [ 0 ]) { return ; } // This is not the first tick of a new slash, so exit else { LastTradeBarTime = Time [ 0 ]; // to be continued // Moving averages values in the bar that just finished, and in the immediately preceding vMMrapida0 = iMA ( Symbol (), 0 , MMrapida, 0 , MODE_SMA, PRICE_CLOSE , 1 ); // Get the fast MM value of the bar that ends vMMrapida1 = iMA ( Symbol (), 0 , MMrapida, 0 , MODE_SMA , PRICE_CLOSE , 2 ); // Gets the value for the fast MM of the previous bar vMMlenta0 = iMA ( Symbol (), 0 , Mild, 0 , MODE_SMA , PRICE_CLOSE , 1 ); // Get the slow MM value of the bar that ends vMMlenta1 =iMA ( Symbol (), 0 , Mild, 0 , MODE_SMA , PRICE_CLOSE , 2 ); // Gets the value for the slow MM of the previous bar int MMclose, answer, identifierEA; --- // Check if there was a fast of the cross above the MM MM slow if (vMMrapida1 <&& vMMlenta1 vMMrapida0> vMMlenta0) { // Checks if exist and open positions Should be closed if ( OrdersTotal ()> 0 && MMclose ) {CloseAllTrades ();} // Opens a long trade answer = OrderSend (Symbol (), OP_BUY, Lots, Ask, 3 , Ask - StopLoss * Point , Ask + TakeProfit * Point , "mm example buy" , identifierEA, 0 , clrBlue ); } // --- Checks if there was a cross of the fast MM MM below the slow if (vMMrapida1> vMMlenta1 && vMMrapida0 <vMMlenta0) { // Checks if exist and open positions Should be closed if ( OrdersTotal ()> 0 && }} {CloseAllTrades ();} // Opens a short trade answer = OrderSend ( Symbol(), OP_SELL, Lots, Bid, 3 , Bid + StopLoss * Point , Bid - TakeProfit * Point , "mm example sell" , identifierEA, 0 , clrRed ); } } } // + -------------------------------------------- --- ------------------- + // | Function that closes all existing trades | // + ----------------------------------------------- ------------------- + void CloseAllTrades () // int identifierEA; { bool rec; for ( int i = 0 ; i < OrdersTotal(); i ++) { if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == false ) { break ;} // // The function will be close to that of this EA and the current symbol if (OrderMagicNumber () == identifierEA && OrderSymbol () == Symbol ()) { if (OrderType () == OP_BUY) { rec = OrderClose (OrderTicket (), OrderLots (), Bid, 3 , clrWhite ); } else if (OrderType () == OP_SELL) {rec = OrderClose (OrderTicket (), OrderLots (), Ask,3 , clrWhite );} } } } // + -------------------------------------- --------- ------------------- + // | Expert End | // + ----------------------------------------------- ------------------- +
try that
Olá pessoal,
Alguém ai tem um robô de duas Medias Móveis sem SL que abra apenas uma ordem de cada vez ?
- 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
Blz Galera!
Dei uma olhada no fórum, mas não encontrei nada do tipo para minha dúvida.
Gostaria de saber se é possível colocar a abertura de ordem compra ou venda no exato momento do cruzamento das médias,
e não no PRICE_CLOSE ou OPEN do próximo candle que se forma depois do cruzamento como de costume?
Ex: if (iMA(NULL,0,MediaCurta,0,MODE_SMA,PRICE_CLOSE,0) > iMA(NULL,0,MediaLonga,0,MODE_SMA,PRICE_CLOSE,0) && order_compra==true){