Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 722
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Sí, bueno... ¿Dónde puedo encontrar un corredor como ese... ¿Puede darme un enlace?
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.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
Вы же сами и ответили на свой вопрос.
Есть такой параметр 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).
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 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);
}
//+------------------------------------------------------------------+}
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
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;
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)
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!
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.