COMPRAR E VENDER - COMO FAZER ? (MQL5)

 

Boa noite pessoal, sou novo no MQL5(APRENDENDO), e estou com um problema que a dias não consigo resolver, caso alguém verifique, encontre o erro e puder ajudar com a solução ficarei muito grato.


Vamos lá, no código que estou utilizando eu gostaria que so abrisse no maximo 2 ordens, de compra e venda ou venda e compra (com TP e SL). Mas ele so consegue fazer uma compra, e nao abre outra até a mesma fechar, segue abaixo o código, agradeço desde já a todos.



#include <Trade\Trade.mqh>

CTrade trade;


int h_mm3;

int h_mm8;

int h_mm20;


double mm3[];

double mm8[];

double mm20[];



MqlRates rates[];


datetime candleNovo;

datetime candleAtual;


int OnInit (){


     ArraySetAsSeries(rates, true);

     ArraySetAsSeries(mm3, true);

     ArraySetAsSeries(mm8, true);

     ArraySetAsSeries(mm20, true);

     

     h_mm3 = iMA(Symbol(), Period(), 3, 0, MODE_SMA, PRICE_CLOSE);

     h_mm8 = iMA(Symbol(), Period(), 8, 0, MODE_SMA, PRICE_CLOSE);

     h_mm20 = iMA(Symbol(), Period(), 20, 0, MODE_SMA, PRICE_CLOSE);

     

      

    return(INIT_SUCCEEDED);

         

}


void OnTick(){


   CopyBuffer(h_mm3, 0, 0, 3, mm3);

   CopyBuffer(h_mm8, 0, 0, 3, mm8);

   CopyBuffer(h_mm20, 0, 0, 3, mm20);

   CopyRates(Symbol(), Period(), 0, 3, rates);

 //-- SETUP  

   bool agCompra          = (mm3[2] > rates[2].low && mm3[2] < rates[2].high) && (mm8[2] > rates[2].low && mm8[2] < rates[2].high) && (mm20[2] > rates[2].low && mm20[2] < rates[2].high);

   bool candleDeAlta        = rates[2].close < rates[1].open && rates[1].open < rates[1].close;

   bool mediasEmOrdemCompra = mm3[1] > mm8[1] && mm8[1] > mm20[1];

   bool agVenda             = (mm3[2] < rates[2].high && mm3[2] > rates[2].low) && (mm8[2] < rates[2].high && mm8[2] > rates[2].low) && (mm20[2] < rates[2].high && mm20[2] > rates[2].low);

   bool candleDeBaixa       = rates[2].close > rates[1].open && rates[1].open > rates[1].close;

   bool mediasEmOrdemVenda  = mm3[1] < mm8[1] && mm8[1] < mm20[1];

   

   candleAtual = rates[0].time;

   

   if (candleAtual != candleNovo){

       candleNovo = rates[0].time;

      Comment("Candle novo: ", rates[0].time);    

   }else{

      Comment("Candle novo: ", rates[0].time);

      return;

   } 

   

   if(agCompra && mediasEmOrdemCompra){

      ObjectCreate(0, rates[1].time+"_", OBJ_ARROW_BUY, 0,rates[1].time, rates[1].low);

   

      if(PositionsTotal() == 0 && OrdersTotal() == 0 ){

         double precoEntrada = NormalizeDouble(rates[1].high + (1*_Point), _Digits);

         double _sl           = NormalizeDouble(rates[1].low - (5*_Point), _Digits); 

         double _tp           = NormalizeDouble(precoEntrada + (2*(precoEntrada - _sl)), _Digits); 

         

      

         trade.BuyStop(1, precoEntrada, Symbol(), _sl, _tp, 0, 0, "Agulhada!");

         }else{

         }

  

  

   if(agVenda && mediasEmOrdemVenda){   

      ObjectCreate(0, rates[1].time+"_", OBJ_ARROW_SELL, 0,rates[1].time, rates[1].high);

   

      if(PositionsTotal() == 0 && OrdersTotal() == 0){

         double precoEntrada = NormalizeDouble(rates[1].high - (1*_Point), _Digits);

         double _sl           = NormalizeDouble(rates[1].low + (5*_Point), _Digits); 

         double _tp           = NormalizeDouble(precoEntrada - (2*(precoEntrada - _sl)), _Digits); 

         

       

         trade.SellStop(1, precoEntrada, Symbol(), _sl, _tp, 0, 0, "Agulhada!");

   }      

   

   

   

   }

   

   

   

   


}

}  

 
souzap:

....

use Alt+S para postar o seu código, é ilegível dessa forma.

 
Jonathan Pereira:

use Alt+S para postar o seu código, é ilegível dessa forma.

#include <Trade\Trade.mqh>

CTrade trade;



int h_mm3;
int h_mm8;
int h_mm20;



double mm3[];

double mm8[];

double mm20[];





MqlRates rates[];



datetime candleNovo;

datetime candleAtual;



int OnInit (){



     ArraySetAsSeries(rates, true);

     ArraySetAsSeries(mm3, true);

     ArraySetAsSeries(mm8, true);

     ArraySetAsSeries(mm20, true);

     

     h_mm3 = iMA(Symbol(), Period(), 3, 0, MODE_SMA, PRICE_CLOSE);

     h_mm8 = iMA(Symbol(), Period(), 8, 0, MODE_SMA, PRICE_CLOSE);

     h_mm20 = iMA(Symbol(), Period(), 20, 0, MODE_SMA, PRICE_CLOSE);

     

      

    return(INIT_SUCCEEDED);

         

}



void OnTick(){



   CopyBuffer(h_mm3, 0, 0, 3, mm3);

   CopyBuffer(h_mm8, 0, 0, 3, mm8);

   CopyBuffer(h_mm20, 0, 0, 3, mm20);

   CopyRates(Symbol(), Period(), 0, 3, rates);

 //-- SETUP  

   bool agCompra          = (mm3[2] > rates[2].low && mm3[2] < rates[2].high) && (mm8[2] > rates[2].low && mm8[2] < rates[2].high) && (mm20[2] > rates[2].low && mm20[2] < rates[2].high);

   bool candleDeAlta        = rates[2].close < rates[1].open && rates[1].open < rates[1].close;

   bool mediasEmOrdemCompra = mm3[1] > mm8[1] && mm8[1] > mm20[1];

   bool agVenda             = (mm3[2] < rates[2].high && mm3[2] > rates[2].low) && (mm8[2] < rates[2].high && mm8[2] > rates[2].low) && (mm20[2] < rates[2].high && mm20[2] > rates[2].low);

   bool candleDeBaixa       = rates[2].close > rates[1].open && rates[1].open > rates[1].close;

   bool mediasEmOrdemVenda  = mm3[1] < mm8[1] && mm8[1] < mm20[1];

   

   candleAtual = rates[0].time;

   

   if (candleAtual != candleNovo){

       candleNovo = rates[0].time;

      Comment("Candle novo: ", rates[0].time);    

   }else{

      Comment("Candle novo: ", rates[0].time);

      return;

   } 

   

   if(agCompra && mediasEmOrdemCompra){

      ObjectCreate(0, rates[1].time+"_", OBJ_ARROW_BUY, 0,rates[1].time, rates[1].low);

   

      if(PositionsTotal() == 0 && OrdersTotal() == 0 ){

         double precoEntrada = NormalizeDouble(rates[1].high + (1*_Point), _Digits);

         double _sl           = NormalizeDouble(rates[1].low - (5*_Point), _Digits); 

         double _tp           = NormalizeDouble(precoEntrada + (2*(precoEntrada - _sl)), _Digits); 

         

      

         trade.BuyStop(1, precoEntrada, Symbol(), _sl, _tp, 0, 0, "Agulhada!");

         }else{

         }

  

  

   if(agVenda && mediasEmOrdemVenda){   

      ObjectCreate(0, rates[1].time+"_", OBJ_ARROW_SELL, 0,rates[1].time, rates[1].high);

   

      if(PositionsTotal() == 0 && OrdersTotal() == 0){

         double precoEntrada = NormalizeDouble(rates[1].high - (1*_Point), _Digits);

         double _sl           = NormalizeDouble(rates[1].low + (5*_Point), _Digits); 

         double _tp           = NormalizeDouble(precoEntrada - (2*(precoEntrada - _sl)), _Digits); 

         

       

         trade.SellStop(1, precoEntrada, Symbol(), _sl, _tp, 0, 0, "Agulhada!");

   }      

   

   

   

   }

   

   

   

   



}

} 
 
Alguém ????
Razão: