Problema con Cantidad de Operaciones por Vela

 

Hola. Tengo un problema. Quisiera saber como limitar la cantidad de operaciones que abro por vela, es decir, quiero que durante la vela en que corresponde que abra la operación solo me abra una operación. Comparto el código (esta creado con un constructor de códigos. Estoy aprendiendo de a poco).



#include <Trade\Trade.mqh>

input int MagicNumber=10001;

input double Lots =0.01;

input double StopLoss=0;

input double TakeProfit=5;

input int TrailingStop=0;

//+------------------------------------------------------------------+

//    expert start function

//+------------------------------------------------------------------+


 ENUM_MA_METHOD MethodMigrate(int method)

  {

   switch(method)

     {

      case 0: return(MODE_SMA);

      case 1: return(MODE_EMA);

      case 2: return(MODE_SMMA);

      case 3: return(MODE_LWMA);

      default: return(MODE_SMA);

     }

  }

  

ENUM_STO_PRICE StoFieldMigrate(int field)

  {

   switch(field)

     {

      case 0: return(STO_LOWHIGH);

      case 1: return(STO_CLOSECLOSE);

      default: return(STO_LOWHIGH);

     }

  }

ENUM_APPLIED_PRICE PriceMigrate(int price)

  {

   switch(price)

     {

      case 1: return(PRICE_CLOSE);

      case 2: return(PRICE_OPEN);

      case 3: return(PRICE_HIGH);

      case 4: return(PRICE_LOW);

      case 5: return(PRICE_MEDIAN);

      case 6: return(PRICE_TYPICAL);

      case 7: return(PRICE_WEIGHTED);

      default: return(PRICE_CLOSE);

     }

  }


ENUM_TIMEFRAMES TFMigrate(int tf)

  {

   switch(tf)

     {

      case 0: return(PERIOD_CURRENT);

      case 1: return(PERIOD_M1);

      case 5: return(PERIOD_M5);

      case 15: return(PERIOD_M15);

      case 30: return(PERIOD_M30);

      case 60: return(PERIOD_H1);

      case 240: return(PERIOD_H4);

      case 1440: return(PERIOD_D1);

      case 10080: return(PERIOD_W1);

      case 43200: return(PERIOD_MN1);

      

      case 2: return(PERIOD_M2);

      case 3: return(PERIOD_M3);

      case 4: return(PERIOD_M4);      

      case 6: return(PERIOD_M6);

      case 10: return(PERIOD_M10);

      case 12: return(PERIOD_M12);

      case 16385: return(PERIOD_H1);

      case 16386: return(PERIOD_H2);

      case 16387: return(PERIOD_H3);

      case 16388: return(PERIOD_H4);

      case 16390: return(PERIOD_H6);

      case 16392: return(PERIOD_H8);

      case 16396: return(PERIOD_H12);

      case 16408: return(PERIOD_D1);

      case 32769: return(PERIOD_W1);

      case 49153: return(PERIOD_MN1);      

      default: return(PERIOD_CURRENT);

     }

  }

  

#define MODE_MAIN 0  

#define MODE_SIGNAL 1

#define MODE_PLUSDI 1

#define MODE_MINUSDI 2

#define MODE_OPEN 0

#define MODE_LOW 1

#define MODE_HIGH 2

#define MODE_CLOSE 3

#define MODE_VOLUME 4 

#define MODE_REAL_VOLUME 5



#define OP_BUY 0           //Buy 

#define OP_SELL 1          //Sell 

#define OP_BUYLIMIT 2      //Pending order of BUY LIMIT type 

#define OP_SELLLIMIT 3     //Pending order of SELL LIMIT type 

#define OP_BUYSTOP 4       //Pending order of BUY STOP type 

#define OP_SELLSTOP 5      //Pending order of SELL STOP type 

//---

#define MODE_TRADES 0

#define MODE_HISTORY 1

#define SELECT_BY_POS 0

#define SELECT_BY_TICKET 1

//---

#define DOUBLE_VALUE 0

#define FLOAT_VALUE 1

#define LONG_VALUE INT_VALUE

//---

#define CHART_BAR 0

#define CHART_CANDLE 1

//---

#define MODE_ASCEND 0

#define MODE_DESCEND 1

//---


#define MODE_TIME 5

#define MODE_BID 9

#define MODE_ASK 10

#define MODE_POINT 11

#define MODE_DIGITS 12

#define MODE_SPREAD 13

#define MODE_STOPLEVEL 14

#define MODE_LOTSIZE 15

#define MODE_TICKVALUE 16

#define MODE_TICKSIZE 17

#define MODE_SWAPLONG 18

#define MODE_SWAPSHORT 19

#define MODE_STARTING 20

#define MODE_EXPIRATION 21

#define MODE_TRADEALLOWED 22

#define MODE_MINLOT 23

#define MODE_LOTSTEP 24

#define MODE_MAXLOT 25

#define MODE_SWAPTYPE 26

#define MODE_PROFITCALCMODE 27

#define MODE_MARGINCALCMODE 28

#define MODE_MARGININIT 29

#define MODE_MARGINMAINTENANCE 30

#define MODE_MARGINHEDGED 31

#define MODE_MARGINREQUIRED 32

#define MODE_FREEZELEVEL 33

//---

#define EMPTY -1

void OnTick()

{

CTrade trade;

trade.SetExpertMagicNumber(MagicNumber);

double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);

double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);


  double MyPoint=_Point;

  if(_Digits==3 || _Digits==5) MyPoint=_Point*1;

  double TheStopLoss=0;

  double TheTakeProfit=0;

  if( TotalOrdersCount()==0 ) 

  {

     

     if((iMACDMQL4(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)>0)&&(iMACDMQL4(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1)>0)&&(iMACDMQL4(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2)<0)) // Here is your open buy rule

     {

     

        if(StopLoss>0) TheStopLoss=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-StopLoss*MyPoint;

        if(TakeProfit>0) TheTakeProfit=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+TakeProfit*MyPoint;

        trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lots,SymbolInfoDouble(_Symbol,SYMBOL_ASK),TheStopLoss,TheTakeProfit);

        return;

     }

     

     if((iMACDMQL4(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)<0)&&(iMACDMQL4(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1)<0)&&(iMACDMQL4(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2)>0)) // Here is your open Sell rule

     {

        if(StopLoss>0) TheStopLoss=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+StopLoss*MyPoint;

        if(TakeProfit>0) TheTakeProfit=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TakeProfit*MyPoint;

        trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,Lots,SymbolInfoDouble(_Symbol,SYMBOL_BID),TheStopLoss,TheTakeProfit);

        return;

     }

     

  }

  

   int posTotal=PositionsTotal();

   for(int posIndex=posTotal-1;posIndex>=0;posIndex--)

     {

      ulong ticket=PositionGetTicket(posIndex);

      if(PositionSelectByTicket(ticket) && PositionGetInteger(POSITION_MAGIC)==MagicNumber) 

      {

     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)

        {

         if(TrailingStop>0)  

              {                 

               if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN)>MyPoint*TrailingStop)

                 {

                  if(PositionGetDouble(POSITION_SL)<SymbolInfoDouble(_Symbol,SYMBOL_BID)-MyPoint*TrailingStop)

                    {

                    trade.PositionModify(ticket,SymbolInfoDouble(_Symbol,SYMBOL_BID)-MyPoint*TrailingStop,PositionGetDouble(POSITION_TP));

                     return;

                    }

                 }

              }

        }

      

       if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)

        {

          if(TrailingStop>0)  

              {                 

               if(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK)>MyPoint*TrailingStop)

                 {

                  if(PositionGetDouble(POSITION_SL)>SymbolInfoDouble(_Symbol,SYMBOL_ASK)+MyPoint*TrailingStop)

                    {

                    trade.PositionModify(ticket,SymbolInfoDouble(_Symbol,SYMBOL_ASK)+MyPoint*TrailingStop,PositionGetDouble(POSITION_TP));

                     return;

                    }

                 }

              }

        }

      }

     }  

    return;

}



int TotalOrdersCount()

{

  int result=0;

  int posTotal=PositionsTotal();

   for(int posIndex=posTotal-1;posIndex>=0;posIndex--)

     {

      ulong ticket=PositionGetTicket(posIndex);

      if(PositionSelectByTicket(ticket) && PositionGetInteger(POSITION_MAGIC)==MagicNumber) result++;

     }  

  return (result);

}



int Hour()

{

   MqlDateTime tm;

   TimeCurrent(tm);

   return(tm.hour);

}

int Minute()

{

   MqlDateTime tm;

   TimeCurrent(tm);

   return(tm.min);

}


double CopyBufferMQL4(int handle,int index,int shift)

  {

   double buf[];

   switch(index)

     {

      case 0: if(CopyBuffer(handle,0,shift,1,buf)>0)

         return(buf[0]); break;

      case 1: if(CopyBuffer(handle,1,shift,1,buf)>0)

         return(buf[0]); break;

      case 2: if(CopyBuffer(handle,2,shift,1,buf)>0)

         return(buf[0]); break;

      case 3: if(CopyBuffer(handle,3,shift,1,buf)>0)

         return(buf[0]); break;

      case 4: if(CopyBuffer(handle,4,shift,1,buf)>0)

         return(buf[0]); break;

      default: break;

     }

   return(EMPTY_VALUE);

  }

  

  

double iACMQL4(string symbol,

               int tf,

               int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iAC(symbol,timeframe);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  

  

  double iADMQL4(string symbol,

               int tf,

               int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=(int)iAD(symbol,timeframe,VOLUME_TICK);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }  

  

  double iAlligatorMQL4(string symbol,

                      int tf,

                      int jaw_period,

                      int jaw_shift,

                      int teeth_period,

                      int teeth_shift,

                      int lips_period,

                      int lips_shift,

                      int method,

                      int price,

                      int mode,

                      int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_MA_METHOD ma_method=MethodMigrate(method);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iAlligator(symbol,timeframe,jaw_period,jaw_shift,

                         teeth_period,teeth_shift,

                         lips_period,lips_shift,

                         ma_method,applied_price);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,mode-1,shift));

  }

  

double iADXMQL4(string symbol,

                int tf,

                int period,

                int price,

                int mode,

                int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iADX(symbol,timeframe,period);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,mode,shift));

  }


double iAOMQL4(string symbol,

               int tf,

               int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iAO(symbol,timeframe);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  double iATRMQL4(string symbol,

                int tf,

                int period,

                int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iATR(symbol,timeframe,period);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  

 double iBearsPowerMQL4(string symbol,

                       int tf,

                       int period,

                       int price,

                       int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iBearsPower(symbol,timeframe,period);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  

 double iBullsPowerMQL4(string symbol,

                       int tf,

                       int period,

                       int price,

                       int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iBullsPower(symbol,timeframe,period);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  

  double iBandsMQL4(string symbol,

                  int tf,

                  int period,

                  double deviation,

                  int bands_shift,

                  int method,

                  int mode,

                  int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_MA_METHOD ma_method=MethodMigrate(method);

   int handle=iBands(symbol,timeframe,period,

                     bands_shift,deviation,ma_method);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,mode,shift));

  }

  double iCCIMQL4(string symbol,

                int tf,

                int period,

                int price,

                int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iCCI(symbol,timeframe,period,price);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  


double iDeMarkerMQL4(string symbol,

                     int tf,

                     int period,

                     int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iDeMarker(symbol,timeframe,period);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  double EnvelopesMQL4(string symbol,

                     int tf,

                     int ma_period,

                     int method,

                     int ma_shift,

                     int price,

                     double deviation,

                     int mode,

                     int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_MA_METHOD ma_method=MethodMigrate(method);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iEnvelopes(symbol,timeframe,

                         ma_period,ma_shift,ma_method,

                         applied_price,deviation);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,mode-1,shift));

  }

  

  double iForceMQL4(string symbol,

                  int tf,

                  int period,

                  int method,

                  int price,

                  int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_MA_METHOD ma_method=MethodMigrate(method);

   int handle=iForce(symbol,timeframe,period,ma_method,VOLUME_TICK);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  

  double iFractalsMQL4(string symbol,

                     int tf,

                     int mode,

                     int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iFractals(symbol,timeframe);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,mode-1,shift));

  }



double iBWMFIMQL4(string symbol,

                  int tf,

                  int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=(int)iBWMFI(symbol,timeframe,VOLUME_TICK);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }



double iMomentumMQL4(string symbol,

                     int tf,

                     int period,

                     int price,

                     int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iMomentum(symbol,timeframe,period,applied_price);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  double iMFIMQL4(string symbol,

                int tf,

                int period,

                int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=(int)iMFI(symbol,timeframe,period,VOLUME_TICK);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  double iMAMQL4(string symbol,

               int tf,

               int period,

               int ma_shift,

               int method,

               int price,

               int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_MA_METHOD ma_method=MethodMigrate(method);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iMA(symbol,timeframe,period,ma_shift,

                  ma_method,applied_price);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  double iMACDMQL4(string symbol,

                 int tf,

                 int fast_ema_period,

                 int slow_ema_period,

                 int signal_period,

                 int price,

                 int mode,

                 int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iMACD(symbol,timeframe,

                    fast_ema_period,slow_ema_period,

                    signal_period,applied_price);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,mode,shift));

  }

  

  double iOBVMQL4(string symbol,

                int tf,

                int price,

                int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iOBV(symbol,timeframe,VOLUME_TICK);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  double iSARMQL4(string symbol,

                int tf,

                double step,

                double maximum,

                int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iSAR(symbol,timeframe,step,maximum);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  double iRSIMQL4(string symbol,

                int tf,

                int period,

                int price,

                int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iRSI(symbol,timeframe,period,applied_price);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  

  double iStdDevMQL4(string symbol,

                   int tf,

                   int ma_period,

                   int ma_shift,

                   int method,

                   int price,

                   int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_MA_METHOD ma_method=MethodMigrate(method);

   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);

   int handle=iStdDev(symbol,timeframe,ma_period,ma_shift,

                      ma_method,applied_price);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }

  double iStochasticMQL4(string symbol,

                       int tf,

                       int Kperiod,

                       int Dperiod,

                       int slowing,

                       int method,

                       int field,

                       int mode,

                       int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   ENUM_MA_METHOD ma_method=MethodMigrate(method);

   ENUM_STO_PRICE price_field=StoFieldMigrate(field);

   int handle=iStochastic(symbol,timeframe,Kperiod,Dperiod,

                          slowing,ma_method,price_field);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,mode,shift));

  }

  double iWPRMQL4(string symbol,

                int tf,

                int period,

                int shift)

  {

   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);

   int handle=iWPR(symbol,timeframe,period);

   if(handle<0)

     {

      return(-1);

     }

   else

      return(CopyBufferMQL4(handle,0,shift));

  }


 
LupusLunam:

Hola. Tengo un problema. Quisiera saber como limitar la cantidad de operaciones que abro por vela, es decir, quiero que durante la vela en que corresponde que abra la operación solo me abra una operación. Comparto el código (esta creado con un constructor de códigos. Estoy aprendiendo de a poco).



Hola Carlos

Prueba agregar estas líneas de código a ver. Espero te funcione.

Saludos


Observaciones: No revisé tu código pero veo que utilizas Trade.SetExpertMagicNumber(...) dentro de OnTick. Es mejor utilizarlo dentro de OnInit ya que no necesitas establecer el Magic Number cada vez que llega un tick. También veo que creas el objeto trade dentro de OnTick. Estás creando el objeto cada vez que llega un tick. Yo lo definiria como una variable global. 

//+------------------------------------------------------------------+
//|                                                       Prueba.mq5 |
//|                                                Simón Del Vecchio |
//|                    https://www.mql5.com/es/users/simondelvecchio |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
input int MagicNumber = 10001;
input double Lots = 0.01;
input double StopLoss = 0;
input double TakeProfit = 5;
input int TrailingStop = 0;
.
.
.
//---
#define EMPTY -1
//Variable global agregada para saber en qué vela estamos
int VelaActualParaBuy;
int VelaActualParaSell;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void int OnInit(void)
  {
//Reseteamos el valor a cero cada vez que se inicie el EA
   VelaActualParaBuy = 0;
   VelaActualParaSell = 0;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
.
.
.


      if(TotalOrdersCount() == 0)
     {
      if((iMACDMQL4(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) > 0) && (iMACDMQL4(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1) > 0) && (iMACDMQL4(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2) < 0)) // Here is your open buy rule
        {
         if(StopLoss > 0)
            TheStopLoss = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - StopLoss * MyPoint;
         if(TakeProfit > 0)
            TheTakeProfit = SymbolInfoDouble(_Symbol, SYMBOL_ASK) + TakeProfit * MyPoint;
         //Antes de abrir la posición, verificamos que no estemos en la misma vela
         if(VelaActualParaBuy != iBars(Symbol(), PERIOD_CURRENT))
           {
            trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), TheStopLoss, TheTakeProfit);
            VelaActualParaBuy = iBars(Symbol(), PERIOD_CURRENT);
           }
         return;
        }
      if((iMACDMQL4(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0) < 0) && (iMACDMQL4(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1) < 0) && (iMACDMQL4(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2) > 0)) // Here is your open Sell rule
        {
         if(StopLoss > 0)
            TheStopLoss = SymbolInfoDouble(_Symbol, SYMBOL_ASK) + StopLoss * MyPoint;
         if(TakeProfit > 0)
            TheTakeProfit = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - TakeProfit * MyPoint;
         //Antes de abrir la posición, verificamos que no estemos en la misma vela
         if(VelaActualParaSell != iBars(Symbol(), PERIOD_CURRENT))
           {
            trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, Lots, SymbolInfoDouble(_Symbol, SYMBOL_BID), TheStopLoss, TheTakeProfit);
            VelaActualParaSell = iBars(Symbol(), PERIOD_CURRENT);
           }
         return;
        }
     }

.
.
.
 
int Minute()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.min);
  }
//+------------------------------------------------------------------+
 

Hola Antonio! Muchas Gracias! Hice las modificaciones y funciona perfecto!

Ahora tengo un ultimo problema T_T. Te comento haber si me puedes ayudar. Normalmente trabajo con un spread de 5-10 pero hay veces que el mercado sube el spread a 50+ o hasta 100+, en esos momentos si abro operación si o si la pierdo. Sabes como puedo ponerle un filtro de spread? He buscado en internet y he intentado varias formas pero el código no lo agarra, oxea cuando compilo me da error.

 
LupusLunam #:

Hola Antonio! Muchas Gracias! Hice las modificaciones y funciona perfecto!

Ahora tengo un ultimo problema T_T. Te comento haber si me puedes ayudar. Normalmente trabajo con un spread de 5-10 pero hay veces que el mercado sube el spread a 50+ o hasta 100+, en esos momentos si abro operación si o si la pierdo. Sabes como puedo ponerle un filtro de spread? He buscado en internet y he intentado varias formas pero el código no lo agarra, oxea cuando compilo me da error.

Me alegra que te haya funcionado. 

Para el spread, puedes hacer algo como esto

.
.
.

void OnTick()
  {
//Puedes comenzar con un filtro: Si el filtro se cumple, te sales de la función OnTick y no ejecutas la estrategia
   if(Filtro())
      return;
   Estrategia();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Filtro()
  {
   int Spread = SymbolInfoInteger(Symbol(), SYMBOL_SPREAD);
//Si el spread es mayor a una cierta cantidad de puntos, retorno true.
   if(Spread > Puntos)
      return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Estrategia()
  {
//Su estrategia
   .
   .
   .
  }
//+------------------------------------------------------------------+

Espero te sirva de guía.


Saludos.

 

Antonio esta vez no me funciono pero creo que es por la manera como lo estoy insertando. No me da error al compilar pero cuando hago el backtest no abre operaciones queda en 0. Inserte el filtro así como tengo el horario de operación y puse el bool Filtro() al final. 

Razón de la queja: