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

 

No puedo terminar el Asesor Experto. La esencia es simple - primero dibujo un rectángulo, que es un disparador de compra, en caso de que el precio llegue a su área, luego dibujo el segundo - cuando el precio llega allí, el trato debe ser cerrado.

Pero ocurre lo contrario: el precio comienza a abrirse y cerrarse dentro de la zona. ¿Qué estoy haciendo mal?


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

//| RECTANGLES OP_BUY.mq4 ||

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

#property copyright ""

#enlace de la propiedad ""

#versión de la propiedad "1.00"

#propiedad estricta


extern int Magia = 777701;

extern double Lote = 0,01;

extern int Deslizamiento = 3;



int ticket;

int OrderOfSymbol;




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

//| Función de inicialización de expertos |

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

int OnInit()

{

//---

return(INIT_SUCCEED);

}

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

//| Función de desinicialización experta |

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

void OnDeinit(const int reason)

{

//---

}

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

//| función de tic experto |

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

void OnTick()

{

//---

//Comprobar si hay un rectángulo:

if(ObjectsTotal(OBJ_RECTANGLE)==0)

{Comentario("¡Dibuja un rectángulo para abrir una operación de compra!");}


//Obtener el NOMBRE del rectángulo:

for(int n=0;n<ObjectsTotal();n++)

{

string name=Nombre del objeto(n);

if(ObjectType(name)==OBJ_RECTANGLE)

{

datetime t1a = (datetime) ObjectGet(name,OBJPROP_TIME1);

datetime t2a = (datetime) ObjectGet(name,OBJPROP_TIME2);


double p1a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits);

double p2a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits);

OrderOfSymbol=CounterOrderTradeType(-1);

si (OrderOfSymbol<1)

si (Cierre[1]>Apertura[1])

if(TimeCurrent()>t1a && TimeCurrent()< t2a &&

Oferta < p1a && Oferta > p2a )

{

ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, Slippage, 0, 0, "open buy order", Magic, 0, Blue);

}

}

}

//Comprobar si ya hay un segundorectángulo:

if(ObjectsTotal(OBJ_RECTANGLE)==1)

{Comentario("¡Dibuja un segundo rectángulo para cerrar la operación de compra!");}


//Obtener el NOMBRE del rectángulo:

for(int n=0;n<ObjectsTotal();n++)

{

string name=Nombre del objeto(n);

if(ObjectType(name)==OBJ_RECTANGLE)

{

datetime t1b = (datetime) ObjectGet(name,OBJPROP_TIME1);

datetime t2b = (datetime) ObjectGet(name,OBJPROP_TIME2);


double p1b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits);

double p2b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits);


if(TimeCurrent()>t1b && TimeCurrent()< t2b &&

Oferta < p1b && Oferta > p2b )

CerrarCompraPosiciones1();

}

}

//Comprobar si ya hay un segundo rectángulo:

if(ObjectsTotal(OBJ_CHANNEL)==2)

{Comentario("Las áreas de apertura y cierre de la orden de compra están establecidas - ¡la operación está en marcha!");}


}

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

void CerrarCompras1()

{

for(int i = OrdersTotal() - 1; i >= 0; i--)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderMagicNumber() == Magic)

if(OrderSymbol() == Symbol())

{



if(OrderType()==OP_BUY)

{

if(OrderClose(OrderTicket(), OrderLots(), Bid, 3, NULL)){Print("Order Close");}

}

}

}

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

//| Conteo de órdenes |

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

int CounterOrderTradeType(ENUM_ORDER_TYPE tipo_orden)

{

int cnt=0;

//----

for(int pos=OrdersTotal()-1;pos>=0;pos--)

{

if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)==false) continue;

if(OrderSymbol()!=_Symbol) continuar;

if(order_type == OrderType() || order_type == -1) cnt++;

}

//----

return(cnt);

}

 
Порт-моне тв:

Hay una función para publicar código como este, hará que sea más fácil para todos leer su código para ayudar.

 
MakarFX:

Hay una función para publicar código como este, facilitaría que todos leyeran tu código para ayudar.

No le ayudará. Las líneas en blanco sólo las lee gente como él.

 

Порт-моне тв:

¿Qué estoy haciendo mal?

No hay unicidad en el nombre de la plaza, tienes cualquier plaza como condición para comprar y vender

 
Порт-моне тв:

Esto también le ayudará a


 

Por favor, indique cómo corregir el error

//+------------------------------------------------------------------+
#property copyright   "Copyright 2020,"
#property version     "1.0"
#property strict

//--- Inputs
int   side_position                    = 1;
input ENUM_BASE_CORNER  CornerInfo     = CORNER_RIGHT_UPPER; 
input ENUM_BASE_CORNER  CornerInfo1    = CORNER_LEFT_UPPER; 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(side_position == 2)
   {
   CornerInfo  = CORNER_RIGHT_LOWER; 
   CornerInfo1 = CORNER_LEFT_LOWER;
   }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

Este es el error

'CornerInfo' - constant cannot be modified      Wa.mq4  22      1
'CornerInfo1' - constant cannot be modified     Wa.mq4  23      1
2 errors, 0 warnings            3       1
 
Forallf:

Gracias.

De nada.)

MakarFX:

¿Podría decirme cómo corregir el error?

Aquí hay un error

Las variables de entrada no se pueden modificar.

Puedes hacerlo así:

input ENUM_BASE_CORNER  CornerInfo     = CORNER_RIGHT_UPPER; 

ENUM_BASE_CORNER  MyCornerInfo     = CornerInfo; 


.......

if(side_position == 2)
   {
   MyCornerInfo  = CORNER_RIGHT_LOWER; 



 
Aleksei Stepanenko:

De nada.)

lasvariables de entrada no pueden ser modificadas.

Puedes hacerlo así:

Gracias. Lo tengo.

 
MakarFX:

Esto también te ayudará.


No lo hizo. Y me he dado cuenta de que los valores del cuadrado no se toman de dos como debería ser, sino del último. No sé cómo superar eso. ¿No me habría dado cuenta por mi cuenta? No domino el mql, por eso te pregunto aquí y me ofreces peines.

 
Порт-моне тв:

no ayudó. Y me he dado cuenta de que los valores del cuadrado no se toman de dos como debería ser, sino del último. No sé cómo superar eso. Yo mismo no lo habría adivinado. No domino el mql, por eso te pregunto y me ofreces peines.

Te ofrezco peines para que tu código sea fácil de leer para aquellos a los que te diriges (sin malicia).

En cuanto a tus cuadrados, para identificarlos correctamente debes entender su origen, es decir, los dibujas tú o el EA

Razón de la queja: