Tengo un problema al inicializar un asistente experto en metatrader 5 mi codigo esta bien compilado

 
#include <Trade\Trade.mqh>

// variable input
input int ma1_period = 8;
input int ma2_period = 50;

input double pips_sl = 0;// stopo loss
input double pips_tp = 0;// profit
input double lotaje = 0;// lotaje
// variable interna
int media_8_per = 0;
int media_50_per = 0;
double media_9_array[];
double media_15_array[];


CTrade trade;//nombre del objeto para relizar operaciones

int OnInit()
{
    // inicializar MA
    media_8_per = iMA(_Symbol, _Period, 8, 0, MODE_EMA, PRICE_CLOSE);
    media_50_per = iMA(_Symbol, _Period, 50, 0, MODE_EMA, PRICE_CLOSE);

    return (INIT_SUCCEEDED);
}



void OnTick()
  {
  static datetime date = 0;
  
   if(iTime(Symbol(),Period(),0)!=date)
     {
     if(entradaCompra())
       {
       double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
    
    trade.Buy(lotaje, _Symbol, Ask, Ask - pips_sl * _Point, Ask + pips_tp * _Point, "entrada en compra");
    
        
       }else if(entradaVenta())
               {
               double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
    
                trade.Sell(lotaje, _Symbol, Bid, Bid + pips_sl * _Point, Bid - pips_tp * _Point, "entrada en venta");
               }
      date=iTime(Symbol(),Period(),0);
     }
  }


bool entradaCompra()
{
    ArraySetAsSeries(media_15_array, true);
    CopyBuffer(media_50_per, 0, 0, 1, media_15_array);

    ArraySetAsSeries(media_9_array, true);
    CopyBuffer(media_8_per, 0, 0, 2, media_9_array);

    if (media_9_array[0] > media_15_array[0] && media_9_array[1] < media_15_array[1])
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool entradaVenta()
{
    ArraySetAsSeries(media_15_array, true);
    CopyBuffer(media_50_per, 0, 1, 1, media_15_array);

    ArraySetAsSeries(media_9_array, true);
    CopyBuffer(media_8_per, 0, 1, 2, media_9_array);

    if (media_9_array[0] < media_15_array[0] && media_9_array[1] > media_15_array[1])
    {
        return true;
    }
    else
    {
        return false;
    }
}

  
 

Los array media_9_array[1] y media_15_array[1] están desbordando. La cantidad de datos a copiar deben ser 2, el que tendrá índice 0 y el que tendrá índice 1.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool entradaCompra()
  {
   ArraySetAsSeries(media_15_array, true);
   CopyBuffer(media_50_per, 0, 0, 2, media_15_array);
   ArraySetAsSeries(media_9_array, true);

...

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool entradaVenta()
  {
   ArraySetAsSeries(media_15_array, true);
   CopyBuffer(media_50_per, 0, 1, 2, media_15_array);
   ArraySetAsSeries(media_9_array, true);


Saludos...

 
muchas gracias antonio de igual manera a la hora de agregar el bot al grafico no me redacta entradas ni se agrega las entradas en el grafico
 
Manuel hrnndz #:
muchas gracias antonio de igual manera a la hora de agregar el bot al grafico no me redacta entradas ni se agrega las entradas en el grafico
Qué datos de entrada estás utilizando? Lote, SL, TP
 

Buenos tardes Manuel, además de los apuntado perfectamente por Antonio he intentado buscar qué es lo que fallaba en tu código y me estaba volviendo loco. Con tu permiso... lo he transcrito, entendiendo que lo que pretende el robot es operar un cruce de medias. Te dejo el código y si te funciona, en principio debería, a seguir picando código.

#include <Trade/Trade.mqh>
CTrade trade;

input int ma_fast_period = 8;
input int ma_slow_period = 50;

input double inpSL = 0;
input double inpTP = 0;
input double inpLots = 0.1;

int ma_fast_handler;
int ma_slow_handler;

double ma_fast[];
double ma_slow[];

datetime ultimaVela;
datetime velaActual;
MqlRates rates[];
ulong trade_ticket;

bool cruceCompra () {
   return ma_fast[1] < ma_slow[1] && ma_fast [0] > ma_slow[0];
}

bool cruceVenta () {
   return ma_fast[1] > ma_slow[1] && ma_fast [0] < ma_slow[0];
}

bool nuevaVela () {
   velaActual = rates[0].time;
   if (velaActual != ultimaVela) {
      ultimaVela = velaActual;
      return true;
   }
   return false;
}

void cerrar_posiciones () {
   if (PositionsTotal () > 0) trade.PositionClose(trade_ticket);
}

int OnInit () {
   ma_fast_handler = iMA(_Symbol, _Period, ma_fast_period, 0, MODE_EMA, PRICE_CLOSE);
   ma_slow_handler = iMA(_Symbol, _Period, ma_slow_period, 0, MODE_EMA, PRICE_CLOSE);
   
   if (ma_fast_handler == INVALID_HANDLE || ma_slow_handler == INVALID_HANDLE) {
      Print("[Error] Carga de indicadores");
      return INIT_FAILED;
   }
   ArraySetAsSeries(ma_fast, true);
   ArraySetAsSeries(ma_slow, true);
   return INIT_SUCCEEDED;
}

void OnDeinit (const int reason) {
   if (ma_fast_handler != INVALID_HANDLE) IndicatorRelease(ma_fast_handler);
   if (ma_slow_handler != INVALID_HANDLE) IndicatorRelease(ma_slow_handler);
}

void OnTick () {
   CopyBuffer(ma_fast_handler, 0, 1, 2, ma_fast);
   CopyBuffer(ma_slow_handler, 0, 1, 2, ma_slow);
   CopyRates(_Symbol, _Period, 0, 2, rates);
   
   if (cruceCompra () && nuevaVela ()) {
      cerrar_posiciones ();
      trade.Buy(inpLots);
      trade_ticket = trade.ResultOrder();
      
   } else if (cruceVenta () && nuevaVela ()) {
      cerrar_posiciones ();
      trade.Sell(inpLots);
      trade_ticket = trade.ResultOrder();
   } 
}

Saludos.