Los EAs deben estar codificados para recuperarse. Si la energía falla, el sistema operativo se bloquea, el terminal o el gráfico se cierra accidentalmente, en el siguiente tick, cualquier variable estática/global del ticket se habrá perdido. Tendrás una orden abierta pero no lo sabes, por lo que el EA nunca intentará cerrarla, rastrear el SL, etc. ¿Cómo se va a recuperar? Utilice un bucleOrderSelect para recuperar, o un almacenamiento persistente (GV/archivo) de los números de ticket necesarios.
Hola, he añadido que cambiar el código de la siguiente manera.
//---------------------- Buy/Sell function (limit orders) int BuyCall( double BC) { if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } }
Sigue tomando las mismas órdenes múltiples veces con cada garrapata.
Además si quito el signo "!", entonces no toma ninguna operación.
Por último, ¿tengo que eliminar la comprobación de buyticket y sellticket de mi función principal?
Gracias
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
-
Reproducir vídeoPor favor, edite su mensaje.
Para grandes cantidades de código, adjúntalo.
- Nunca escribirías if( (2+2 == 4) == true) ¿verdad? if(2+2 == 4) es suficiente. Así que no escribas if(bool == true), sólo usa if(bool) o if(! bool). El código se vuelve autodocumentado cuando usas nombres de variables con sentido, como bool isLongEnabled. Entrada_larga suena como un precio de activación o un número de billete y "si entrada larga" es una frase incompleta.
- ¿Dónde se comprueba si BuyTicket se ha cerrado? La selección por ticket siempre será verdadera (dado un número de ticket válido), la orden podría ser cualquiera de las pendientes, abiertas, cerradas o eliminadas.
- Has ignorado completamente mi sugerencia de un bucle OrderSelect.
Hola WHReder gracias por su respuesta.
Sí, he añadido esos en el código SRC. Pero no se mostró cuando edité.
He eliminado los términos == true como has sugerido.
Por favor, no me malinterpretes, tengo un punto débil en la comprensión de este bucle orderselect. No lo he ignorado. Intenté añadirlo, pero es demasiado complejo, al ejecutarlo muestra 16 errores y 2 advertencias. ¿En ese código qué es MN.Count?
// extern int Magic.Number.Base = ... // int magic.number.max; // Export to OpenOrder/MySelect // string market.pair; // Export to OpenOrder/MySelect // int init(){ // market.pair = Symbol(); // magic.number.max = Magic.Number.Base + MN.COUNT - 1;
Sobre la comprobación del ticket de compra cerrado. No lo comprobé porque, comprobé si el precio actual está por debajo del buystoploss entonces la operación de compra se cerró.
Bid < BuyStopLoss
Saludos
He arreglado el código de alguna manera como esta... Pero muestra 2 errores ahora... "Myselect" y "MyOrdersTotal" puede ser decleared sólo en el ámbito global.
int BuyCall( double BC) { //-----------code bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){ if(!OrderSelect(iWhat, eSelect, ePool) ) return (false); int mn = OrderMagicNumber(); if(mn < MNB1 ) return (false); if(mn > MNB2 ) return (false); if(OrderSymbol() != Pair ) return (false); if(ePool != MODE_HISTORY ) return (true); return(OrderType() <= OP_SELL); } int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){ #define OP_ALL -1 if(ePool == MODE_TRADES) iPos = OrdersTotal() - 1; else iPos = OrdersHistoryTotal() - 1; for(nOrders=0; iPos >= 0; iPos--) if( MySelect(iPos, SELECT_BY_POS, ePool)) if( op == OP_ALL || op == OrderType() ) nOrders++; return(nOrders); } if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET)) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } } return(BuyTicket); }
No se puede declarar una función dentro de otra función
Entonces como puedo hacer esto. Quiero decir que tengo muchas condiciones que comprobar individualmente para abrir una orden de compra/venta.
Es por eso que hice una función buycall/sellcall para hacer el código más fácil.
Es que el EA está tomando muchas operaciones iguales. No sé cómo detener eso.
No puedes declarar una función dentro de otra función
Entonces como puedo hacer esto. Quiero decir que tengo muchas condiciones que comprobar individualmente para abrir una orden de compra/venta.
Es por eso que hice una función buycall/sellcall para hacer el código más fácil.
Es sólo que el EA está tomando muchas operaciones iguales. No sé cómo detener eso.
En primer lugar, no trate de declarar una función dentro de otra función.
No puedo entender lo que está tratando de hacer mirando el código que ha publicado. Así que no puedo ayudarte.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Hola, he hecho un Ea, pero cuando hago el backtesting está creando muchas órdenes pendientes iguales en cada tick. Como detener eso. Sólo necesito una orden a la vez, no necesito su copia.
Si ejecuto este EA en un gráfico horario con"precio abierto solamente" entonces no crea copia.
Además, mi EA tiene la opción de invertir el comercio si el límite de compra falla, entonces se abre el comercio de venta. Por favor, también me hizo saber que he configurado correctamente o no. Cualquier ayuda será apreciada.
Gracias por su tiempo.