Jeito correto de enviar ordens por EA

 

Estou tentado fazer com que o EA dispare apenas uma ordem  toda vez que a condicao for verdadeira mas ele fica disparando varias ordens alguem pode me ajudar 

Obrigado

//+------------------------------------------------------------------+
//|                                                      Genesis.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh> //Biblioteca para ordens de compra e venda
CTrade trade;//Da nome a classe da biblioteca de compra e venda
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input double lote=1; //LOTE
input double stopLoss=250;//STOP LOSS
input double takeProfit=250;//TAKE PROFIT
input ulong desvPts=20;//DESVIO EM PONTOS

double smaArray1[]; // ARRAY PARA MEDIA MOVEL
double smaArray2[]; // ARRAY PARA MEDIA MOVEL
double smaArray3[]; // ARRAY PARA MEDIA MOVEL
double smaArray4[]; // ARRAY PARA MEDIA MOVEL
int smaHandle1; //HANDLE PARA MEDIA MOVEL
int smaHandle2;
int smaHandle3;
int smaHandle4;
MqlTick ultimoTick;  //CLASSE PARA PUXAR AS INFORMACOES DE PRECO
MqlRates rates[];//CLASSE ARMAZENA OS VALORES DE OPEN CLOSE HIGH LOW ETC
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   smaHandle1=iMA(_Symbol,PERIOD_M1,34,0,MODE_EMA,PRICE_CLOSE); //FUNCAO QUE PUXA OS DADOS DO INDICADOR E INSERE NA VARIAVEL INT POR PADRAO CHAMADE HANDLE
   ArraySetAsSeries(smaArray1,true);// FUNCAO QUE ORGANIZA O ARRAY PARA RECEBER OS VALORES DE VARIAVEL HANDLE

   smaHandle2=iMA(_Symbol,PERIOD_M4,72,0,MODE_EMA,PRICE_CLOSE); //FUNCAO QUE PUXA OS DADOS DO INDICADOR E INSERE NA VARIAVEL INT POR PADRAO CHAMADE HANDLE
   ArraySetAsSeries(smaArray2,true);// FUNCAO QUE ORGANIZA O ARRAY PARA RECEBER OS VALORES DE VARIAVEL HANDLE

   smaHandle3=iMA(_Symbol,PERIOD_M15,144,0,MODE_EMA,PRICE_CLOSE); //FUNCAO QUE PUXA OS DADOS DO INDICADOR E INSERE NA VARIAVEL INT POR PADRAO CHAMADE HANDLE
   ArraySetAsSeries(smaArray3,true);// FUNCAO QUE ORGANIZA O ARRAY PARA RECEBER OS VALORES DE VARIAVEL HANDLE

   smaHandle4=iMA(_Symbol,PERIOD_M4,144,0,MODE_EMA,PRICE_CLOSE); //FUNCAO QUE PUXA OS DADOS DO INDICADOR E INSERE NA VARIAVEL INT POR PADRAO CHAMADE HANDLE
   ArraySetAsSeries(smaArray4,true);// FUNCAO QUE ORGANIZA O ARRAY PARA RECEBER OS VALORES DE VARIAVEL HANDLE
   ArraySetAsSeries(rates,true); //FUNCAO QUE ORGANIZA O ARRAY RATES

   trade.SetTypeFilling(ORDER_FILLING_RETURN);//FUNCAO QUE ARMAZENA O TIPO DE ORDEM
   trade.SetDeviationInPoints(desvPts);//TAMANHA MAXIMO DO DESVIO PARA E EXECUCAO DA ORDEM
   trade.SetExpertMagicNumber(12356);//FUNCAO PARA O NUMERO MAGICO
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

   if(!SymbolInfoTick(_Symbol,ultimoTick))//FUNCAO PARA CLASSE QUE PUXA INFORMACOES DE PRECO
     {
      Alert("Erro Ao Obter Ultimo Tick",GetLastError());
      return;
     }

   CopyRates(_Symbol,_Period,0,3,rates);//COPIA OS DADOS DE PRECO HISTORICO PARA A FUNCAO RATES

   CopyBuffer(smaHandle1,0,0,3,smaArray1);//COPIA OS DADOS DO HANDLE PARA O ARRAY
   CopyBuffer(smaHandle2,0,0,3,smaArray2);//COPIA OS DADOS DO HANDLE PARA O ARRAY
   CopyBuffer(smaHandle3,0,0,3,smaArray3);//COPIA OS DADOS DO HANDLE PARA O ARRAY
   CopyBuffer(smaHandle4,0,0,3,smaArray4);//COPIA OS DADOS DO HANDLE PARA O ARRAY

                                          //COMPRA--------------------------------------//-------------------------//----------------------------------//--------//
   if(smaArray1[1]>smaArray1[2] && PositionsTotal()==0)//PositionsTotal verifica se a posicoes em aberto de todos os ativos
     {
      if(smaArray2[1]>smaArray2[2])
        {
         if(smaArray3[1]>smaArray3[2])
           {
            if(smaArray2[1]>smaArray4[1])
              {
               trade.Buy(lote,_Symbol,ultimoTick.ask,ultimoTick.ask-stopLoss,ultimoTick.ask+takeProfit,"");
              }
           }
        }
     }

//VENDA----------------------------//----------------------------//-------------------------------------//-----//

   if(smaArray1[1]<smaArray1[2] && PositionsTotal()==0)//PositionsTotal verifica se a posicoes em aberto de todos os ativos
     {
      if(smaArray2[1]<smaArray2[2])
        {
         if(smaArray3[1]<smaArray3[2])
           {
            if(smaArray2[1]<smaArray4[1])
              {
               trade.Sell(lote,_Symbol,ultimoTick.ask,ultimoTick.ask+stopLoss,ultimoTick.ask-takeProfit,"");
              }
           }
        }
     }

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
  • www.mql5.com
Tire dúvidas sobre análise técnica, fale com outros traders sobre sistemas de negociação e melhore suas habilidades de programação de estratégias em linguagem MQL5. Participe do fórum, compartilhe ideias com traders de todo o mundo e ajude com feedback os novatos — nossa comunidade está crescendo junto com você. Problemas de criação de EA com...
 
Bruno Gonçalves:

Estou tentado fazer com que o EA dispare apenas uma ordem  toda vez que a condicao for verdadeira mas ele fica disparando varias ordens alguem pode me ajudar 

Obrigado

Tenta colocar um if antes das condições de abrir ordens:


if(!PositionSelect(_Symbol)) {

        //Aqui todas as condições de abertura de ordens :)

}


Basicamente, se não houver nenhuma posição aberta, ele segue para o caminho de abrir alguma posição. Se alguma posição já estiver aberta, ele só ignora :P


Só não entendi por que não funcionou com PositionsTotal() =/

 
Bruno Gonçalves:

Estou tentado fazer com que o EA dispare apenas uma ordem  toda vez que a condicao for verdadeira mas ele fica disparando varias ordens alguem pode me ajudar 

Obrigado

Você está cortando caminho...

Volte pra prancheta...


https://www.amazon.com/Expert-Advisor-Programming-MetaTrader-automated/dp/0982645953/ref=sr_1_1?ie=UTF8&qid=1544566433&sr=8-1&keywords=mql5+programming

 
Bruno Gonçalves:

Estou tentado fazer com que o EA dispare apenas uma ordem  toda vez que a condicao for verdadeira mas ele fica disparando varias ordens alguem pode me ajudar 

Obrigado

Alem das recomendações que foram passadas, sugiro você limitar o número de trades, usando por exemplo uma variável "MaxTrades".

Se não fizer isso, mesmo limitando para abrir ordem somente quando não tiver ordem aberta, após fechar a ordem (por SL ou TP), se as condições estiverem sendo satisfeitas, o EA coloca nova ordem e por ai vai.

[ ]´s

Razão: