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
Hace poco planteé un tema sobre la reapertura de pedidos. Pensé que había resuelto el problema, ya que todo funcionó sin problemas durante una semana. Pero hoy me he encontrado con un problema similar sólo al abrir.
Se abrieron muchas órdenes en Finam, y 9 en Otkritie... aunque sólo debería haberse abierto una orden en todos los casos.
Este es un fragmento de código del EA
{
Coment="Open Sell "+string(OpenOrders+1);
ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
}
if(ret)
{
OpenOrders++;
PriceLastOpen=price;
}
bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
MqlTradeRequest Request;
MqlTradeResult Results;
ZeroMemory(Request);
ZeroMemory(Results);
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Request.action=TRADE_ACTION_DEAL;
Request.type=ORDER_TYPE_SELL;
Request.symbol=symbol;
Request.volume=volume;
Request.deviation=deviation;
Request.comment=comment;
Request.type_filling=filling;
bool res=false;
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
}
es decir, podemos ver en el código que si la operación tiene éxito, aumenta la variableOpenOrders, que inicialmente es igual a 0
Si es superior a 0, no debe haber más apertura de la orden, sino que toda la pila de órdenes se abre con el comentario Orden1.
Compruebo si hay una respuesta positiva en la función de apertura de la orden y si se ha recibido el ticket de la orden, pero por alguna razón esta función devuelve false, aunque la orden esté realmente establecida.
Explique qué es lo que falla, cómo resolver este problema.
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
También me he dado cuenta de que no hay ninguna comprobación OrderCheck(Request, checkResult), lo cual es malo.
Ah, y también en orden de mercado - precio = 0
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); olvídalo
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_ticket=0;
request.action = TRADE_ACTION_DEAL;
request.magic = 9876543211;
request.symbol = Symbol();
request.volume = 1;
request.price = 0;
request.type=ORDER_TYPE_BUY;
request.comment="Sync mode";
request.type_filling=ORDER_FILLING_FOK;
request.type_time=ORDER_TIME_DAY;
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
{
if(result.order>0)
{
order_ticket=result.order;
Print(__FUNCTION__," Order sent in sync mode");
return(true);
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Order not sent in sync mode.");
}
return(false);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
Además, es posible comprobar la apertura de la posición intentando seleccionarla. Y es mejor intentarlo varias veces
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
También me he dado cuenta de que no hay ninguna comprobación OrderCheck(Request, checkResult), lo cual es malo.
¿Y si el puesto ya existía?
¿O si ya hay una posición pero la orden no se llena completamente?
Además, se puede comprobar la apertura de la posición intentando seleccionarla. Y varios intentos son mejores.
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
También me he dado cuenta de que no hay ninguna comprobación OrderCheck(Request, checkResult) y esto es malo.
Bueno, tal vez inserteOrderCheck(Request, checkResult)
Gracias
Pero no me gusta especialmente ese bucle
Ah, y también en orden de mercado - precio = 0
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); olvídalo
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_ticket=0;
request.action = TRADE_ACTION_DEAL;
request.magic = 9876543211;
request.symbol = Symbol();
request.volume = 1;
request.price = 0;
request.type=ORDER_TYPE_BUY;
request.comment="Sync mode";
request.type_filling=ORDER_FILLING_FOK;
request.type_time=ORDER_TIME_DAY;
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
{
if(result.order>0)
{
order_ticket=result.order;
Print(__FUNCTION__," Order sent in sync mode");
return(true);
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Order not sent in sync mode.");
}
return(false);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
Y sobre el precio.... sí, más acostumbrado a MT4, y allí siempre hay que poner el precio...
Repita
Además, debe comprobar el estado del pedido y si ya ha aparecido en el historial o no.
La bolsa no funciona con posiciones, sólo con órdenes.
Tendrías razón si pusiera órdenes pendientes, pero yo trabajo por mercado, y aquí la entrada se obtiene conResults.deal
No entiendo qué significa tu sonrisa.
No esperaba oírte decir eso. ¿Qué pausas, o estás bromeando?
Mala herencia de forex.
...
¿Y si el puesto ya existía?
¿O es que ya hay una posición pero el pedido no está completo?