Discusión sobre el artículo "Implementación de Take Profit en forma de órdenes limitadas sin cambiar el código fuente del EA" - página 6

 
¡me da <Stack Overflow> error! Y el problema está en el archivo de la librería
<LimitTakeProfit.mqh>
¿Alguien ha averiguado qué ha fallado?
 

¡hola Lectores!

¿alguien más se ha tropezado con el error"stack overflow " ?

¡¡¡Creo que el problema está en la librería "LimitTakeProfit.mqh"!!!

 

Hola Dmitry,


Gracias por tu interesante artículo.


Por favor, ¿podrías explicar el error "paramter passed as reference, variable expected" relacionado con cada una de las siguientes líneas (línea 54, 55, 56)?


CSymbolInfo CLimitTakeProfit::c_Symbol = new CSymbolInfo();

CArrayLong CLimitTakeProfit::i_TakeProfit = new CArrayLong();

CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


¡Gracias!

 
Mario Marconi CArrayDouble CLimitTakeProfit::d_TakeProfit = new CArrayDouble();


¡Gracias!

Hola, ¿usas?

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>
 
Dmitriy Gizlyk #:

Hola, ¿usas?

Hola Dmitry,

Las siguientes líneas están escritas exactamente en su "LimitTakeProfit.mqh":

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Trade\SymbolInfo.mqh>

Más precisamente, este error "paramter passed as reference, variable expected" viene de la compilación de su EA " MACD Sample LImitTP.mq5".


Gracias por su respuesta.

 
Mario Marconi #:

Hola Dmitry,

Las siguientes líneas están escritas exactamente en su "LimitTakeProfit.mqh":

Más precisamente, dicho error "paramter passed as reference, variable expected" proviene de la compilación de tu EA " MACD Sample LImitTP.mq5".


Gracias por su respuesta.

Hola, debe agregar * antes de paprameter

CSymbolInfo    * CLimitTakeProfit::c_Symbol       =  new CSymbolInfo();
CArrayLong     * CLimitTakeProfit::i_TakeProfit   =  new CArrayLong();
CArrayDouble   * CLimitTakeProfit::d_TakeProfit   =  new CArrayDouble();
 
Dmitriy Gizlyk #:

Hola, debes añadir * antes de paprameter

Hola Dmitry,


Algo sigue sin funcionar, las mismas tres líneas da los siguientes errores:

- parameter passed as reference, variable expected LimitTakeProfit.mqh 54 57

- redefinición; diferentes modificadores de tipo LimitTakeProfit.mqh 54 35


Gracias por responder.

 

Hola Dmitry,

Sé que este artículo se publicó hace tiempo, ¡pero quería darte las gracias por él! Es muy útil, tu explicación es realmente clara, y la clase funciona a las mil maravillas. Gracias.

Creo que he encontrado un pequeño error en el código publicado. A mitad de camino a través de la función SetTakeProfits, nos encontramos con esta línea:

switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))

Esto es dentro de un bucle a través de todos los TP. El problema es que más adelante en el bucle, se llama a la función CheckLimitOrder, que a su vez llama a la función CheckOrderInHistory, y ahí se puede seleccionar otra Posición. Esto significa que en la siguiente iteración del bucle, el "interruptor" en el código anterior puede ser diferente.

Para solucionar esto, creo que position_type debería almacenarse en una variable, antes de que comience el bucle. Así:

bool CLimitTakeProfit::SetTakeProfits(ulong position_ticket, double new_tp=0)

// (...)

   double position_volume=PositionGetDouble(POSITION_VOLUME);

//********** AÑADA LA LÍNEA SIGUIENTE
   ENUM_POSITION_TYPE position_type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
//****************************

   double closed=0;
   double closed_perc=0;
   double fix_closed_per=0;
//---
   for(int i=0;i<total;i++)
     {
      tp_request.comment="TP"+IntegerToString(i)+"_"+IntegerToString(position_ticket);
      if(i_TakeProfit.At(i)<tp_int && d_TakeProfit.At(i)>0)
        {
         if(closed>=100 || fix_closed_per>=100)
            break;
//---
         double lot=position_volume*MathMin(d_TakeProfit.At(i),100-closed_perc)/(100-fix_closed_per);
         lot=MathMin(position_volume-closed,lot);
         lot=c_Symbol.LotsMin()+MathMax(0,NormalizeDouble((lot-c_Symbol.LotsMin())/c_Symbol.LotsStep(),0)*c_Symbol.LotsStep());
         lot=NormalizeDouble(lot,2);
         tp_request.volume=lot;

//********** MODIFICAR LA LÍNEA SIGUIENTE
         //switch((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE))
         switch(position_type)
//*******************************
           {
            case POSITION_TYPE_BUY:
              tp_request.type=ORDER_TYPE_SELL_LIMIT;
              tp_request.price=c_Symbol.NormalizePrice(open_price+i_TakeProfit.At(i)*c_Symbol.Point());

// (...)

Espero que esto tenga sentido. De nuevo, ¡gracias por un excelente trabajo!

 

¡Hola a todos!

Tengo un problema de [caducidad no válida], ¿alguien sabe cómo solucionarlo?

 

Hola.

Al probar el EA con LimitTakeProfit, devuelve el siguiente mensaje de error: "Vencimiento no válido".

He probado a añadir el vencimiento junto con la estructura de solicitud de operación, pero ha sido en vano.

Alguien por favor me ayude.

Traducción automática aplicada por el moderador