Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 722

 
Alexey Viktorov:
Sí, bueno... ¿Dónde puedo encontrar un corredor como ese... ¿Puede darme un enlace?
Así es. La compra se cierra a la oferta
 
Me disculpo por mi falta de atención. Leí "abre"...
 

Buenas tardes,

Pregunta:

Por favor, pueden decirme por qué no puedo poner una compra pendiente:

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

Si offset=1 ,aparecerá elerror :

stop de compra fallido 0.10 AUDNZD.m a 1.03748 [precio inválido], es decir,pequeñonivel precio (en micaso )

Cuando la misma "orden de ejecución" se coloca justo después

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

todo funciona bien (es decir, el pedido se realiza):

orden de compra 0.10 a 1.03747 [#2 comprar 0.10 AUDNZD.m a 1.03747]

¿Por qué no se acepta la solicitud de una orden pendiente(1,03748), es decir,a 1,03747 se coloca, pero a 1,03748 no? (porqueSYMBOL_ASK tiene en cuenta el spread y el offset - el offset desde el precio actual para colocar la orden, en puntos, se incrementa en 1)

Pero en el offset=100: precio pendiente de BUY_STOP = 1,03847 - ya funciona


Gracias.
 
Konstantin_78:

Buenas tardes,

Pregunta:

Por favor, pueden decirme por qué no puedo poner una compra pendiente:

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

Si offset=1 ,aparecerá elerror :

Stop de compra fallido 0,10 AUDNZD.m a 1,03748 [Precio no válido], es decir,nivel de precio pequeño (en mi caso)

Cuando establezco una "orden de ejecución" inmediatamente después de

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

todo funciona bien (es decir, el pedido se realiza):

orden de compra 0.10 a 1.03747 [#2 comprar 0.10 AUDNZD.m a 1.03747]

¿Por qué no se acepta la solicitud de una orden pendiente(1,03748), es decir,a 1,03747 se coloca la orden, pero a 1,03748 la orden es pequeña?

Pero si offset=100: precio pendiente de BUY_STOP = 1,03847, ya funciona.


Gracias.

Ya has respondido a tu propia pregunta.

Existe un parámetro "stoplevel" -distancia mínima necesaria desde el precio actual hasta el precio de colocación de una orden pendiente- para cada símbolo tiene su propio valor y se establece en las condiciones de negociación

 
Andrey F. Zelinsky:

Вы же сами и ответили на свой вопрос.

Есть такой параметр stoplevel -- минимально необходимое расстояние от текущей цены до цены установки отложенного ордера -- для каждого инструмента своё значение и задаётся в торговых условиях 

Entonces probablemente sería justo escribir

precio =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)*punto

Aunque, si has escrito "...del precio actual ", ¿qué tiene que ver eso con el diferencial? Que se incluye en SYMBOL_ASK (porque SYMBOL_ASK = precio abierto + spread).

 
Vladimir Karputov:

He adjuntado un ejemplo para ayudarte...

Ya veo, el ejemplo ayudó. Gracias.


Ahora, aquí hay una pregunta.

Cuando aumento el lote, en algún momento no hay suficientes fondos libres, y necesito abrir con lote aumentado.

Es decir, introducir el lote máximo, tanto como permite FreeMargin.

Cómo escribir esta condición: si no hay fondos suficientes para abrir la posición con el lote calculado, la función debe devolver el lote máximo posible para abrir la posición.

double LotA()
{
   double Lot=FirstLot;

   if(DoublingCount<=0) return Lot;
   double MaxLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double MainLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(Lot<MainLot)Lot=MainLot;
     if(Lot>MaxLot)Lot=MaxLot;
   double lt1=Lot;
   HistorySelect(0,TimeCurrent());
   if(HistoryOrdersTotal()==0)return(Lot);
   double cl=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-1),ORDER_PRICE_OPEN);
   double op=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_PRICE_OPEN);

   long typeor=HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_TYPE);
   if(typeor==ORDER_TYPE_BUY)
     {
      if(op>cl)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(typeor==ORDER_TYPE_SELL)
     {
      if(cl>op)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(lt1>MaxLot)lt1=MaxLot;
   lt1=LotCheck(lt1);
   return(lt1);
  }
//+------------------------------------------------------------------+}
 
Marina Korotkih:

Ya veo, el ejemplo ayudó. Gracias.


Ahora esta pregunta.

Cuando aumento el lote, en algún momento no hay suficientes fondos libres, y necesito abrir con un lote más grande.

Es decir, introducir el lote máximo, tanto como permite FreeMargin.

Cómo escribir esta condición: si no hay fondos suficientes para abrir la posición con el lote calculado, la función debe devolver el lote máximo posible para abrir la posición.

               

double Mgn,Lot=0,BID,ASK;

    BID=SymbolInfoDouble(_Symbol,SYMBOL_BID);
    ASK=SymbolInfoDouble(_Symbol,SYMBOL_ASK);

   if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

   if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Marina, ¿qué te parece esto?

Se aplican dos opciones de cálculo: una para abrir la VENTA y otra para abrir la COMPRA

 
Renat Akhtyamov:

                  if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

                  if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Marina, ¿podría ser así?

No, no lo es.

No sólo hay que calcular el lote máximo posible, sino que también hay que comprobar todo el asunto del mínimo permitido, porque puede ocurrir que el lote mínimo sea 0,01, y el margen te permita abrir sólo 0,009, entonces atormenta al servidor con peticiones que nunca serán aceptadas, pero pueden tomar medidas sobre ti)

 
Vitaly Muzichenko:

No, no lo es.

Es necesario no sólo calcular el lote máximo posible, sino también comprobar todo el asunto para el mínimo permitido, porque puede suceder que el lote mínimo 0,01, y el margen le permite abrir sólo 0,009, a continuación, la tortura de las solicitudes del servidor, que nunca va a aceptar, pero la acción en usted y puede tomar)

Escribe el código completo, como debe ser, y veré al mismo tiempo....?

Siempre aprenderé de ti y estaré pendiente de que las respuestas sean completas.

He trabajado como supervisor técnico, no te preocupes, ¡todo irá bien!

¡Juntos somos un equipo!

 
Marina Korotkih:

Ya veo, el ejemplo ayudó. Gracias.


Ahora esta pregunta.

Cuando aumento el lote, en algún momento no hay suficientes fondos libres, y necesito abrir con un lote más grande.

Es decir, introducir el lote máximo, tanto como permite FreeMargin.

Cómo escribir esta condición: si no hay fondos suficientes para abrir la posición con el lote calculado, la función debe devolver el lote máximo posible para abrir la posición.


Una pendiente resbaladiza en la que estás).