Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 176

 

Chicos, ayudadme a arreglar el EA. En lugar de comprobar las órdenes, comprará sin parar, a la primera señal, hasta gastar todo el depósito. Gracias a todos por adelantado

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
extern double Lots            = 1;
extern int    TakeProfit      = 300;
extern int    StopLoss        = 50;
extern int    Magic           = 111;
extern int    Slippage        = 3;
//+------------------------------------------------------------------+
extern string TMA             = "Параметры индикатора TMA";
extern string TimeFrame       = "current time frame";
extern int    HalfLength      = 56;
extern int    Price           = PRICE_CLOSE;
extern double ATRMultiplier   = 2.0;
extern int    ATRPeriod       = 100;
extern bool   Interpolate     = true;
//+------------------------------------------------------------------+
double PriceHigh,PriceLow,SL,TP,OrderMagicNumber;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits==3 || Digits==5)
     {
      TakeProfit *= 10;
      StopLoss   *= 10;
      Slippage   *= 10;
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   PriceHigh= iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
   PriceLow = iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);

   if(CountSell()==0 && Bid>=PriceHigh)
     {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"ТМА",Magic,0,Red);
      if(ticket>0)
        {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
        }
      else Print("Ошибка открытия ордера на продажу");
     }
   if(CountBuy()==0 && Ask<=PriceLow)
     {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"ТМА",Magic,0,Blue);
      if(ticket>0)
        {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
            if(!OrderModify(ticket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на покупку");
        }
      else Print("Ошибка открытия ордера на покупку");
     }
   if(Ask<=PriceLow && CountSell()>0)
     {
      for(int i=OrdersTotal() -1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Black))
                  Print("Ошибка закрытия ордера на продажу");
           }
        }
     }
   if(Bid>=PriceHigh && CountBuy()>0)
     {
      for(i=OrdersTotal() -1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black))
                  Print("Ошибка закрытия ордера на покупку");
           }
        }
     }
  }
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber && Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber && Magic && OrderType()==OP_BUY)
            count++;
        }
     }
//+------------------------------------------------------------------+
 
Zelimhannahal00:

Chicos, ayudadme a arreglar el EA. En lugar de comprobar las órdenes, comprará sin parar, a la primera señal, hasta gastar todo el depósito. Gracias a todos por adelantado.

El código puede ser formateado normalmente en el editor de código utilizando el estilizador de código: Ctrl + <

Lo he formateado para ti - ahora es normalmente legible.

 
Zelimhannahal00:

Chicos, ayudadme a arreglar el EA. En lugar de comprobar las órdenes, comprará sin parar, a la primera señal, hasta gastar todo el depósito. Gracias a todos por adelantado.

Lo has identificado correctamente, el error está en la función de comprobación de posiciones

//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_SELL)
            count++;
        }
     }

   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY)
            count++;
        }
     }
//+----------------------

He resaltado en rojo, fijo.

Lo he corregido.

 
Alekseu Fedotov:

Ha identificado correctamente el error en las funciones de comprobación de la posición

rojo resaltado, corregido.

Eso es todo.

Arreglado, sigue igual. El problema sigue ahí.
 
Zelimhannahal00:
Arreglado, sigue igual. El problema sigue ahí.
//+------------------------------------------------------------------+
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic && OrderType()==OP_BUY)
            count++;
        }
     }
return(count);


¿has copiado todo el código ahí?

 
Vladislav Andruschenko:


¿Copiaste todo el código ahí?

No he copiado todo el código por error. Está bien allí return(count);

}

Así es como termina el código, como debe ser. No hay ningún error ni advertencia al compilar el código. Debo haber cometido un error en las funciones, no puedo averiguar dónde. Lo he arreglado como me han dicho más arriba. Tampoco tengo errores, pero el asesor en sí funciona de la misma manera (la primera señal, compra por todo el depósito, lotes dados, como 1 conjunto de lotes y él compra 1 lote de ofertas 200 o más, siempre y cuando el depósito es suficiente. Pero la señal es correcta, compra también correctamente, sólo que mucho)

 
Zelimhannahal00:

No he copiado todo el código por error. Está bien return(count);

}

Así es como termina el código, como debe ser. No hay ningún error ni advertencia al compilar. Debo haber cometido un error en las funciones, no puedo averiguar dónde. Lo he arreglado como me han dicho más arriba. Tampoco tengo errores, pero el asesor en sí funciona de la misma manera (la primera señal, compra por todo el depósito, lotes dados, como 1 conjunto de lotes y él compra 1 lote de ofertas 200 o más, siempre y cuando el depósito es suficiente. Pero la señal es correcta, compra también correctamente, pero mucho)

Lo he comprobado y corregido.

Archivos adjuntos:
ProjectName.mq4  11 kb
 
¿Cómo se encuentra el número de velas entre fechas?
 
Alexander Fedosov:
¿Cómo encontrar el número de velas entre fechas?

si el TF está sincronizado entonces cualquier función CopyXXXX() :

Referenciando las fechas de inicio y fin del intervalo de tiempo requerido

intCopiarTiempo(
stringsymbol_name,// nombre del símbolo
ENUM_TIMEFRAMEStimeframe,// período
datetimestart_time,// desde qué fecha
datetimestop_time,// hasta qué fecha
datetimetime_array[]//array para copiar la hora de apertura
);

Valor devuelto

Número de elementos del array copiados o -1 en caso de error.


puedes usar iBarShift() para encontrar 2 barras por tiempo


 
Igor Makanu:

si el TF está sincronizado entonces cualquier función CopyXXXX() :

Referenciando las fechas de inicio y fin del intervalo de tiempo requerido

intCopiarTiempo(
stringsymbol_name,// nombre del símbolo
ENUM_TIMEFRAMEStimeframe,// período
datetimestart_time,//desde qué fecha
datetimestop_time,// hasta qué fecha
datetimetime_array[]//array para copiar la hora de apertura
);

Valor devuelto

Número de elementos del array copiados o -1 en caso de error.


Eso es raro... No recuerdo que hubiera estas características en mt4 antes. ¿También se añadieron a los cincos?
Razón de la queja: