Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 833

 
Igor Zakharov:

Corregido... Pero queda uno por alguna razón.



Y no puedo reproducirlo en el probador. Sólo que no lo tengo en la misma fecha


 

¿Por qué no puedo conectar la biblioteca en mql4 desde c++? Aquí está mi código en C++ Visual Studio 2012. Archivo main. con extensión cpp (main.csr)

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

Luego creé un archivo con extensión main def (main.def), que tiene una lista de funciones exportadas, el código se ve así :

LIBRARY "dllmt42"
EXPORTS
add

Luego lo importé en el compilador

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

No hay problemas después de la compilación, pero cuando se deja el EA en el gráfico, me confunde

Llamada a función de importación no resuelta, encontrar '_add' en 'dllmt42.dll'. Total Comander ve la función así como el propio compilador al arrastrar el archivo

¿Quién puede ayudar?

 
Alexandr Sokolov:

Corregido... Pero queda uno por alguna razón.

Y no puedo reproducirlo en el probador. No tengo este error en la misma fecha

Este error indica que está intentando modificar una posición/orden al precio al que hizo la modificación anteriormente...

 

Estoy tratando de recuperar los datos del indicador en MT5 utilizando una función:

//************************************************************************************************/
double Envelopes(string symb, ENUM_TIMEFRAMES TF_1, int period, int method, int shift, int price,double Deviation(ENUM_TIMEFRAMES TF_2, int kanal), int buff, int index)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TF_1, period, method, shift, price, Deviation(TF_2, kanal), buff);
   if(handle<0)
   {
    Print("Failed to create handle ATR, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,0,index,1,buf)<0)
    {
     Print("Failed to copy data from the indicator ATR, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Me sale un error :


Por favor, aconsejar cómo corregir el código para MT5

 
Vladimir Pastushak:

Este error indica que estás intentando modificar una posición/orden al precio al que ya la has modificado...

No, ya lo he comprobado muchas veces, el problema estaba en la aleatoriedad de la selección de los parámetros de entrada de MQL al probar los productos, que no siempre son compatibles - también lo he arreglado. Pero ahora recibo un mensaje de que no hay ningún pedido abierto


Aunque los tengo en los mismos pares y plazos

 
Alexandr Sokolov:

No, ya lo he comprobado muchas veces. El problema estaba en la aleatoriedad a la hora de seleccionar los parámetros de entrada de MQL al probar los productos, que no siempre son compatibles - también lo he solucionado. Pero ahora recibo un mensaje de que no hay ningún pedido abierto


Pero los tengo en los mismos pares y plazos

No sé por qué mi EA no opera.

 
Vladimir Pastushak:

Averigüe por qué el EA no opera.

Puede que no opere si los parámetros de entrada se eligen al azar, de modo que las señales simplemente no se producen. Pero tampoco hay que limitarlo

 

¿Qué se entiende por" negociarla distancia de congelación "? Recibido a través de

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL)

MQL4

 

Vuelvo a tener el error nº 1 al modificar. En este EA, los niveles de SL o TP sólo se modifican en cuatro bloques


1 bloque

if(OrderMagicNumber() == id_number && OrderStopLoss() != NormalizeDouble(0,_Digits) && BMod(OrderTicket()) == true)
           {
            if(OrderType() == OP_BUY)
              {
               if(OrderComment() == "1" && Bid - OrderOpenPrice() >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && Bid - OrderOpenPrice() >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              }
            else
              {
               if(OrderComment() == "1" && OrderOpenPrice() - Ask >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && OrderOpenPrice() - Ask >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              };


2 bloques

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() - sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


3 bloques

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


4 bloques

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && OrderTakeProfit() == NormalizeDouble(0,_Digits))
              {
               if(MyOrders() == 1)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
                 }
               else if(OrderTakeProfit() == 0)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + (OrderComment() == "1" ? t1 : t2) : OrderOpenPrice() - (OrderComment() == "1" ? t1 : t2)),0,clrNONE);
                 };


Ya he comprobado todo muchas veces pero no encuentro ningún error

 
Alexandr Sokolov:

Vuelvo a tener el error nº 1 al modificar. En este EA, los niveles de SL o TP sólo se modifican en cuatro bloques



OrderStopLoss() != NormalizeDouble(0,_Digits)


Esto no es correcto, también en otros ejemplos

Si pones un stop en 1,2356 y en un nuevo tick vuelves a poner un stop en 1,2356, obtendrás el error 1