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

 
Babu Bonappan:

¿Qué pasa si obtengo el valor exacto del margen en el momento de la apertura de la orden utilizandoMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot- siempre tendrá dos decimales, no? Luego lo multiplicaré por 100 y lo guardaré como MagicNumber de esta orden. Y si es necesario, lo sacaré de ahí y lo dividiré por 100,0.

¿Será esto correcto?

¿Quiere asignar un número mágico a cada pedido?
 
Babu Bonappan:

OrderOpenPrice, según entiendo, me da exactamente lo que necesito. Pero sólo si la moneda del depósito es el USD y el par negociado es el EUR/USD. En este caso, es como si el OrderOpenPrice almacenara el tipo de cambio de la moneda base a la moneda del depósito en el momento de abrir la orden sabiendo que se puede calcular fácilmente el depósito.

Pero si no se cumple al menos una de estas condiciones, ¿cómo podemos obtener el valor del depósito para un pedido individual? ¿Dónde podemos encontrar el tipo de la moneda base de una cotización en relación con la moneda del depósito en el momento de su apertura?

Sí, tenemos la hora de apertura del pedido al segundo más cercano. ¿Pero qué podemos conseguir? Como máximo - los parámetros de la vela de minutos del símbolo requerido. Pero nunca el valor exacto del tipo utilizado para calcular el depósito. ¡Pero la función AccountMargin lo consigue de alguna manera! Sería muy interesante entender cómo lo hace exactamente.

OrderOpenPrice - precio de apertura de la orden, el mismo (precio) es la relación de una moneda a otra

AccountMargin - da el margen total de la cuenta para todas las órdenes abiertas.

 
Vladimir Karputov:

Aplazado:

Vasiliy Danilov, 2016.12.02 07:18

¿Puede decirme, por favor, qué debo hacer? Casiescribí un simple Asesor Experto utilizando un indicador externo, hay un inconveniente.

El cierre de la mitad del lote no funciona correctamente y la orden se modifica por cada tick.

Aquí está el bloque de modificación para comprar

if (CountBuy()>0) //En esta función se calcula el número de órdenes de compra
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ si (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //si el precio ha superado el movimiento requerido del indicador
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); /aquí cambio Stop por Breakeven
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Intento cerrar la mitad del lote
Print("Error de cierre de la mitad del lote a comprar");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) /aquí muevo la parte restante al Breakeven
Print("Error de modificación del punto de equilibrio en la compra");

} } }


Si SL != OrderStopLoss()) modificar .... Entonces la orden se modificará sólo si SL difiere del OrderStopLoss actual.

Y para entender lo que va mal en el cierre, utilice GetLastError(); en general, sería bueno comprobar OrderClose ... bool testOrCls

testOrCls=CierreDePedidos ......

if(!testOrCls) Imprimir (GetLastError() );

es decir, si hay un error, pedimos el código de error; si no hay error, no pedimos el código de error.


 
bablusut:

Gracias por la respuesta... He buscado por medio Internet, hay muy pocos ejemplos de uso de la funciónStringFind, y por lo que he encontrado he llegado a la conclusión de que los parámetros deben ser:

intStringFind(

stringcomment =OrderComment()// la cadena en la que estamos buscando
stringOrderStopLoss, OrderTakeProfit//lo que buscamos
intstart_pos=0// desde qué posición empezar a buscar

);

... Si me equivoco, por favor corríjanme...

No funciona un poco así. Los argumentos de esta función son: 1) la cadena que se quiere buscar; 2) la combinación de caracteres que se quiere encontrar; 3) el inicio de la búsqueda (por defecto, desde el carácter nulo de la cadena según el paso 1).

Devuelve el número de posición en la cadena, en la que comienza la subcadena buscada, o -1 si no se encuentra ninguna subcadena.

En otras palabras, escríbalo así:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov:

Tiene un error al cerrar la mitad del lote, por lo que no es modificable. Por favor, corríjalo de acuerdo con mi post anterior.

Si quiere hacerlo sólo una vez, debe especificar el umbral de rentabilidad en un número fijo de puntos y añadir la condición de comprobación de la toma de beneficios de la orden para ver si coincide con ese número

Y al pasar por tal condición en el bloque de modificación de la orden, la mitad se cierra.

Vasiliy Danilov:
¿Puede decirme, por favor, qué debo hacer? Casi heescrito un simple Asesor Experto utilizando un indicador externo, pero hay un inconveniente.

Si hay OrederClose en el bloque, la mitad del lote se cerrará inmediatamente y OrderModify no funcionará más.

Si eliminamos OrederClose, entonces OrderModify modifica la orden para cada tick

Aquí está el bloque de modificación para comprar

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
¿Cómo cerrar la mitad de la orden cuando el precio alcanza el MinMove, y la otra mitad va al Breakeven una vez?

Por cierto, acabo de prestar atención a OrderSelect by position SELECT_BY_POS, pero ¿dónde está la selección de billetes?

OrderClose(OrderTicket()

 
Babu Bonappan:

Por favor, aconsejar cómo utilizar MQL4 para obtener un valor de margen para cada posición abierta en el terminal?

Yo lo hacía así:

margin = MarketInfo(Symbol(),MODE_LOTSIZE) * OrderOpenPrice() / AccountLeverage() * OrderLots();

Al operar con el EUR/USD esta construcción funcionaba bien y estaba seguro de que su lógica era correcta.

Pero ahora quiero obtener el mismo resultado para EUR/JPY (o EUR/CHF). Obviamente, en lugar deOrderOpenPrice() necesito multiplicar el valor de un lote estándar por la tasa de la moneda base a la moneda de depósito (en mi caso, por EUR/USD). Pero, ¿qué es esta tasa? ¿El tipo de cambio que había en el momento de la apertura de la posición o el que tenemos ahora (en el momento en que queremos saber el importe del depósito para esta posición)?

No ¿MODO_MARGEN DE MANTENIMIENTO?

 
A1exPit:

Por cierto, acabo de darme cuenta de que OrderSelect está en la posición SELECT_BY_POS, pero ¿dónde está el ticket de selección?

OrderClose(OrderTicket()

¿No sabes nada de este hilo?

Si el pedido está seleccionado, OrderTicket() devuelve el ticket del pedido seleccionado. Y no importa cómo se seleccione el orden: por índice o por ticket.

Hay una sutileza en el caso de la selección por ticket - el pool no se tiene en cuenta, y tenemos que comprobar de qué lista se selecciona la orden, comprobando la hora de su cierre.

 
Vasiliy Danilov:
¿Podría decirme qué hacer? Casi heescrito un simple Asesor Experto usando un indicador externo pero me he topado con un problema.

Si hay un OrederClose en el bloque, la mitad del lote se cierra inmediatamente y OrderModify ya no funciona.

Si eliminamos OrederClose, OrderModify modifica la orden para cada tick

Aquí está el bloque de modificación para comprar

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
¿Cómo debo cerrar una mitad de la orden cuando el precio alcanza el nivel de MinMove y la otra mitad llega al Breakeven una vez?

Cuando el cierre parcial del billete cambia. Primero para alcanzar el punto de equilibrio, luego para cerrar.

O cambia la lógica.

 
Artyom Trishkin:

A1exPit:

Por cierto, acabo de ver OrderSelect by SELECT_BY_POS , pero ¿dónde está el ticket de selección?

OrderClose(OrderTicket()

¿No sabes nada de este hilo?

Si se selecciona un pedido, OrderTicket() devuelve el ticket del pedido seleccionado. Y no importa cómo se seleccione la orden: por índice o por ticket.

Hay un matiz cuando se selecciona por ticket - el pool no se tiene en cuenta, y hay que comprobar de qué lista se selecciona la orden comprobando la hora en que se cerró.

Y si miramos el código en el que se escribió este comentario... Allí no es tan sencillo...

{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache:

Y si miras el código en el que se escribió este comentario... Ahí no está tan claro...

{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота Какой тикет?
Bueno... Sí... No me fijé bien. Sólo un vistazo. Por alguna razón no me interesa este hilo
Razón de la queja: