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

 
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! Me gustaría mucho entender cómo lo hace exactamente.

Se necesitan tres fórmulas para calcular el margen.

Dependiendo de la moneda de su depósito, se calculará el margen para cualquier par de divisas.

Es posible que haya un error en el cálculo. Pero será mucho menor que el que aparecerá al redondear el resultado del cálculo a la centésima de unidad de la moneda base del depósito, es decir, si es un dólar, entonces me refiero a céntimos.

PS

AccountMargin es el valor actual, es decir, el último

 

¿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?

 
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?

De nuevo, el MagicNumber no sirve para eso. Sería mejor escribirlo en un archivo de registro y luego leerlo.

Todo depende de la finalidad de dicho cálculo y del número de pedidos para el que esté diseñado el programa.

Me parece que esos cálculos precisos sólo son necesarios para un corredor o una empresa de corretaje.

Desde este punto de vista, la solución óptima sería la tala de árboles.

 
Vitaly Muzichenko:

¿Por qué mientes sobre el número de carteles? No engañes a la gente.

Ha.

¿Nunca ha oído hablar del recuento de alta precisión?

 

Aplazado:

escribí un simple Asesor Experto usando un indicador externo, pero hay un inconveniente.

El cierre de medio lote no funciona correctamente y la orden se modifica en cada tick.

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

if (CountBuy()>0) /Esta función cuenta 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");

} } }


 
Vladimir Karputov:

Reenviado:

Vasiliy Danilov, 2016.12.02 07:18

Para empezar, intente utilizar NormalizeDouble(OrderLot()/2,2) en lugar de Lots/2

Y pegar el código en el post a través del botón "SRC" para que sea legible

 
Por favor, pueden darme algunos consejos sobre cómo solucionar este problema. Casi heescrito un simple Asesor Experto usando un indicador externo pero me he topado con un obstáculo.

Si el bloque tiene OrederClose - 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?
 
Vasiliy Danilov:
¿Podríais darme algunos consejos sobre cómo solucionar esto? Casi heescrito un simple Asesor Experto utilizando un indicador externo, pero hay un inconveniente.

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

Si elimina OrederClose, OrderModify modificará la orden en 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 y hacer que la otra mitad sea Breakeven una vez si el precio alcanza el MinMove?

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

Y para hacerlo una vez, hay que establecer el breakeven a un número fijo de puntos y añadir la condición de comprobación de take profit de la orden al hecho de cumplir con este número

Y cuando el precio pasa por tal condición en el bloque de modificación de la orden, la mitad de la orden debe ser cerrada

 
Alexey Kozitsyn:
No. Trata de entender lo que estás haciendo. Lo que has escrito es sólo un prototipo de la función (es decir, sólo una descripción de lo que hace). Así que lo has sacado de la documentación. Tienes que usarlo. Así que tienes que sustituir los argumentos por tus propios valores. Y la función devolverá el resultado. Entonces este resultado debe ser procesado.

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 donde buscamos
stringOrderStopLoss, OrderTakeProfit//lo que buscamos
intstart_pos=0// en qué posición comenzar la búsqueda

);

... Si me equivoco, corrígeme...

 
Vitaly Muzichenko:

¿Por qué mientes sobre el número de carteles? No engañes a la gente.

El punto de vista de cada corredor es diferente
Razón de la queja: