- Tienes varios bloques de código desalineados debido a los paréntesis que faltan. Aunque equilibrados, faltan, como al principio del "for" y algunos de los bloques "if"
- La línea"if(OrderSymbol()!=Symbol()) continue;{" es muy sospechosa y hace difícil ver cómo debería ser el flujo de código. Basta con que sea "if(OrderSymbol()==_Symbol) {". En lugar de "Symbol()", también puede utilizar"_Symbol"
- Utilice"OrderClosePrice()" y no"Ask" o"Bid".
- Añade paréntesis cuando hagas comparaciones para facilitar la lectura y garantizar el orden de las cosas. Por ejemplo, en lugar de"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" utilice"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )".
- Trate de fusionar los bloques de código de compra y venta en un solo bloque de código que maneje ambos. Eso hará que sea menos código para depurar y más fácil de leer y modificar en el futuro.
¡PS! ¡NB! Utilice también un número mágico para los pedidos.
P.D. Recuerde también tener en cuenta el deslizamiento que puede causar los 130 errores. Un mínimo de StopLevel no es suficiente. Hágalo un poco más grande para tener en cuenta el posible deslizamiento, como la adición de un factor de la propagación actual. ¡También puede haber un FreezeLevel en el lugar por el corredor!
- Tienes varios bloques de código desalineados debido a que faltan paréntesis. Aunque están equilibrados, faltan, por ejemplo, al principio de los bloques "for" y algunos de los bloques "if
- La línea"if(OrderSymbol()!=Symbol()) continue;{" es muy sospechosa y hace difícil ver cómo debería ser el flujo de código.
Basta con que sea "if(OrderSymbol()==_Symbol) {". En lugar de "Símbolo()", también puedes usar"_Símbolo" - Utilice"OrderClosePrice()" y no"Ask" o"Bid".
- Añade paréntesis cuando hagas comparaciones para facilitar la lectura y garantizar el orden de las cosas:
Por ejemplo en lugar de"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" utilice"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )" - Intente fusionar los bloques de código de Compra y Venta en un solo bloque de código que maneje ambos. Eso hará que haya menos código que depurar y que sea más fácil de leer y modificar en el futuro.
P.D. ¡NB! Utilice también un número mágico para los pedidos.
¡PS! Recuerde también tener en cuenta el deslizamiento que puede causar los 130 errores. Un mínimo de StopLevel solo no es suficiente. Hágalo un poco más grande para tener en cuenta el posible deslizamiento como la adición de un factor de la propagación actual. ¡También puede haber un FreezeLevel en el lugar por el corredor!
Muchas gracias por su respuesta y por intentar ayudarme. Tengo algunas preguntas/comentarios:
1. En el número 1 me sugeriste que añadiera paréntesis (), lo que hice según tu sugerencia en el número 4. Pero no veo cómo puedo añadir paréntesis () al principio del "for". ¿Podrías explicarlo o te referías a las llaves {}?
2. Lo he cambiado por _Symbol, pero para mejorar mis conocimientos me preguntaba si puedes explicar cuál es el beneficio/ventaja de usar _Symbol sobre Symbol()?
3. He cambiado todos los Asks y Bids a OrderClosePrice(), sin embargo, ¿podrías por favor explicar cuál es el beneficio/ventaja de esto?
4. He hecho esto
5. Intentaré ver cómo puedo simplificar esto más.
6. Como introduzco mis operaciones manualmente, tengo entendido que no puedo utilizar MagicNumbers, ¿no es cierto?
7. No veo cómo o dónde puedo tener en cuenta el deslizamiento. ¿Podría decirme dónde o cómo añadirlo? Para OrderModify sólo permite los siguientes parámetros:
bool OrderModify( int ticket, // ticket double price, // price double stoploss, // stop loss double takeprofit, // take profit datetime expiration, // expiration color arrow_color // color );
8. En mi código ya he añadido 1 pip (10 puntos) al stoplevel mínimo, que debería dar cuenta del spread en la mayoría de los casos.
9. He imprimido el Freezelevel para todos los pares y todos son 0,0, por lo que no parece ser un problema.
10. A pesar de que todavía estoy recibiendo el error 130 y el error uno, cuando el EA funciona, todavía modifica y cierra la orden. Así que según estos resultados, estoy recibiendo el error ya que la orden está siendo modificada al mismo tiempo. Como si fuera un problema de tiempo parcial:
2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28598 tp: 0.00000 ok
2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: Buy = 130
2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28597 tp: 0.00000 ok
2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28596 tp: 0.00000 ok
2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: Buy = 130
2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15: Buy = 130
2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28590 tp: 0.00000 ok
2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28582 tp: 0.00000 ok
2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28581 tp: 0.00000 ok
2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28577 tp: 0.00000 ok
2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: Buy = 130
2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28575 tp: 0.00000 ok
2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: Buy = 130
2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: Buy = 1
2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28571 tp: 0.00000 ok
Aquí hay otro ejemplo en el que el Trailingstop está claramente por encima del stoplevel (por 10 pips/100 puntos) y sin embargo sigue produciendo el error 130:
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: Error de compra = 130
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TS = 20
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: stoplevel = 10.0
Por favor, suministra el código más reciente con las actualizaciones que hayas realizado. De lo contrario, no podré comentar los cambios recientes realizados por usted para ver si son correctos.
- Perdón, me refería a las llaves. Tienes que arreglar eso, sino seguirá fallando. Este es el más importante de todos los puntos.
- a) Este punto no tiene que ver principalmente con el "_Symbol", sino con el "!=" y el "continue".
b) "_Symbol" se ejecuta más rápido porque es una variable, mientras que "Symbol()" se ejecutaría como una llamada a una función, lo que es más lento. - OrderClosePrice() es el precio de cierre actual de la orden. Si todavía está abierta, informará automáticamente del precio de compra o de venta dependiendo del tipo de orden. Por favor, lea la documentación de esta función.
- BIEN. Veamos los cambios de código que has hecho.
- ¡OK! Veamos los cambios de código que has hecho.
- Sí, para las operaciones manuales, el número mágico es 0. Sin embargo, en su código defina el número mágico como un "externo" o "entrada", asignándole un "0" como valor predeterminado, y luego utilice esa variable en su código. De este modo, podrá utilizar fácilmente el EA para otras situaciones o reutilizar su código para otros EAs.
- He explicado cómo tener en cuenta el deslizamiento. Asegúrese de que el "TrailStop > ( StopLevel + ( CurrentSpread * Factor )" donde Factor es al menos "1.0" (idealmente "1.5" o "2.0"; mayor si ve que todavía experimenta el Error 130 debido al deslizamiento excesivo).
- No hay ninguna garantía de que 10 puntos representen el diferencial, porque el diferencial es diferente dependiendo del símbolo y siempre está cambiando, especialmente durante los eventos de noticias y cuando la liquidez es baja, como durante las horas bajas.
- DE ACUERDO. Si el "FreezeLevel" no se utiliza está bien, pero sugiero que todavía lo atienda en su código, de modo que en caso de que lo utilice con un corredor diferente (que podría tenerlo). el EA seguirá funcionando.
- Suministre el nuevo código con los cambios para que pueda ser analizado.
Por favor, suministra el código más reciente con las actualizaciones que hayas realizado. De lo contrario, no podré comentar los cambios recientes realizados por usted para ver si son correctos.
- Lo siento, me refería a los corchetes. Usted tiene que arreglar eso, o de lo contrario seguirá fallando. Este es el más importante de todos los puntos.
- a) Este punto no tiene que ver principalmente con el "_Symbol", sino con el "!=" y el "continue".
b) "_Symbol" se ejecuta más rápido porque es una variable, mientras que "Symbol()" se ejecutaría como una llamada a una función, lo que es más lento. - OrderClosePrice() es el precio de cierre actual de la orden. Si todavía está abierta, informará automáticamente del precio de compra o de venta dependiendo del tipo de orden. Por favor, lea la documentación de esta función.
- BIEN. Veamos los cambios de código que has hecho.
- ¡OK! Veamos los cambios de código que has hecho.
- Sí, para las operaciones manuales, el número mágico es 0. Sin embargo, en su código defina el número mágico como un "externo" o "entrada", asignándole un "0" como valor predeterminado, y luego utilice esa variable en su código. De este modo, podrá utilizar fácilmente el EA para otras situaciones o reutilizar su código para otros EAs.
- He explicado cómo tener en cuenta el deslizamiento. Asegúrese de que el "TrailStop > ( StopLevel + ( CurrentSpread * Factor )" donde Factor es al menos "1.0" (idealmente "1.5" o "2.0"; mayor si ve que todavía experimenta el Error 130 debido al deslizamiento excesivo).
- No hay ninguna garantía de que 10 puntos representen el diferencial, porque el diferencial es diferente dependiendo del símbolo y siempre está cambiando, especialmente durante los eventos de noticias y cuando la liquidez es baja, como durante las horas bajas.
- DE ACUERDO. Si no se utiliza el "FreezeLevel" está bien, pero sugiero que lo tengas en cuenta en tu código, para que en caso de que lo utilices con otro broker (que lo tenga), el EA siga funcionando.
- Suministre el nuevo código con los cambios para que pueda ser analizado.
Muchas gracias, miraré todos los consejos y sugerencias anteriores. Mientras tanto, aquí está el último código. Además, creo que he encontrado un error en esta línea:
#property strict; extern string Label_TrailingStart="Pip threshold to activate TrailingStop"; extern int TrailingStart=12; extern int TrailingStop=5; double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10; int TS=TrailingStart-TrailingStop; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init(){ if(TS<stoplevel){ MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+ "\nbe less than the minimum levels required by your broker and the"+ "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+2)+" Pips"); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit(){ return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start(){ double Pip=Point*10; int ticket=0; if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2; /*Print("stoplevel = ",stoplevel); Print("TrailingStart = ",TrailingStart); Print("TrailingStop = ",TrailingStop); Print("TS = ",TS); Print("Buy error = ",GetLastError()); Print("OrderOpenPrice = ",OrderOpenPrice()); Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ", OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip); Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip); Print("TrailingStart*Pip = ",TrailingStart*Pip); Print("TrailingStop*Pip = ",TrailingStop*Pip); Print("OrderClosePrice = ",OrderClosePrice()); Print("OrderStopLoss = ",OrderStopLoss()); Print("OrderSymbol = ",OrderSymbol()); Print("OrdersTotal = ",OrdersTotal()); Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET)); Print("ticket = ",ticket); Print("OrderTicket = ",OrderTicket()); Print("Selectbyticket = ",SELECT_BY_TICKET); Print("Selectbypos = ",SELECT_BY_POS); Print("Ask = ",Ask); Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip), OrderTakeProfit(),Blue));*/ for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)){ ticket++; if(OrderSymbol()==_Symbol){ if(OrderType()==OP_BUY){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){ if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){ RefreshRates(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue)) Print("Buy error = ",GetLastError()); } } } } if(OrderType()==OP_SELL){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){ if(TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){ RefreshRates(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red)) Print("Sell error = ",GetLastError()); /*Print("Ask = ",Ask); Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip); Print("TrailingStart*Pip = ",TrailingStart*Pip);*/ } } } } } } return(0); } //+------------------------------------------------------------------+
Un cambio bastante importante que hice fue que cambié la primera línea de abajo por la segunda, porque creo que debe haber un valor mayor que cero para el stoploss ¿Es eso cierto?
if(OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
El siguiente ejemplo de código sirve como una posible solución/alternativa a su código. Sin embargo, tenga en cuenta que el código no ha sido probado ni depurado (sólo compilado), así que utilícelo sólo como "pseudo" código:
#property strict extern double dblTrailStartPips = 11.0, // Trailing Start (Pips) dblTrailStopPips = 5.0, // Trailing Stop (Pips) dblPipMultiplier = 10.0, // Pips to Points Multiplier dblSpreadFactor = 2.0; // Spread Factor for Slippage Compensation extern int intMagicNumber = 0; // Magic Number (0 for Manual Orders) double dblTickSizeDelta, // Size of a Tick (Delta) dblStopLevelDelta, // Market Stop Level (Delta) dblTrailStartDelta, // Trailing Start (Delta) dblTrailStopDelta; // Trailing Stop (Delta) // Initialisation int OnInit() { dblTickSizeDelta = MarketInfo( _Symbol, MODE_TICKSIZE ); dblStopLevelDelta = MarketInfo( _Symbol, MODE_STOPLEVEL ) * _Point; dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier * _Point; dblTrailStopDelta = dblTrailStopPips * dblPipMultiplier * _Point; return( INIT_SUCCEEDED ); } // Process Tick Event void OnTick() { double dblSpreadDelta = Ask - Bid, dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ), dblTrailDelta = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta; for( int i = OrdersTotal() - 1; i >= 0; i-- ) { if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) { if( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) ) { int intDirection = 0; switch( OrderType() ) { case OP_BUY: intDirection = +1; break; case OP_SELL: intDirection = -1; break; default: continue; } double dblOpenPrice = OrderOpenPrice(), dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection; if( dblCloseDelta > dblTrailStartDelta ) { double dblStopLossPrice = OrderStopLoss(), dblStopLossDelta = ( dblStopLossPrice - dblOpenPrice ) * intDirection, dblTrailingDelta = dblCloseDelta - dblTrailDelta; if( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) ) { double dblStopLoss = round( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta; if( dblStopLoss != dblStopLossPrice ) { if( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) ) { Print( "Order Modification Failed with Error: ", GetLastError() ); } } } } } } } }
Prueba este Trader3000
Compara este código con el que ya tienes... es muy parecido y lo he estado usando durante años y funciona como una bomba...
//+------------------------------+ //| TRAILING STOP Function | //+------------------------------+ void Trailing_Stop_Function() { bool Ticket_TS_Long; for(int iTS_Long = OrdersTotal() - 1; iTS_Long >= 0 ; iTS_Long --) { if(OrderSelect(iTS_Long,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumberLong && Trailing_Stop_In_Pips > 0 && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier)) { Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green)); if (Ticket_TS_Long != true) { Print("TS-Order Modify Error ",GetLastError()); } } } bool Ticket_TS_Short; for(int iTS_Short = OrdersTotal() - 1; iTS_Short >= 0 ; iTS_Short --) { if(OrderSelect(iTS_Short,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumberShort && Trailing_Stop_In_Pips > 0 && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier)) { Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green)); if (Ticket_TS_Short != true) { Print("TS-Order Modify Error ",GetLastError()); } } } }
Trail_After_Pips_Profit es una variable doble externa que el usuario rellena...y
PipMultiplier es una simple función que calcula el valor del punto decimal de la moneda...
Si no usas MagicNumbers entonces elimina ese criterio....
Esto...o más bien "debería" seguir cualquier orden en cualquier gráfico.....
Estoy bajo corrección, pero funciona para mí....
//+------------------------------------------+ //| Check for 5 Digits - Pipmultiplier | //+------------------------------------------+ if(Digits==5||Digits==3) { PipMultiplier = 10*Point; } else if(Digits==2) { PipMultiplier = 100*Point; } else { PipMultiplier = Point; }
Estoy impresionado con su ayuda FMIC.... Muy bueno
@Mike.T: Algo parece estar fuera de lugar con su código PipMulytiplier:
else if(Digits==2) { PipMultiplier = 100*Point; }
¡Eso no parece ser correcto! ¿Por qué multiplicarlo por 100 para símbolos de 2 dígitos? No debería multiplicarse en absoluto. Debería ser la misma condición que los símbolos de 4 dígitos.
Aquí hay un ejemplo. Si el precio del USD/JPY pasa de 108.65 a 108.77; eso es un aumento de 12 pips, ¡no 1200 pips!Gracias.
Un consejo; no utilice "Ask" o "Bid" - utilice "OrderClosePrice()" en su lugar. Es un valor en tiempo real independientemente de que sea una orden de compra o de venta.
Gracias... no sabía que .... así que... (sin secuestrar este hilo)... ¿Debería usar OrderClosePrice() en lugar de Bid o Ask...?
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- 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 a todos. No consigo que mi EA funcione correctamente. Lo estoy ejecutando en 10 pares/gráficos diferentes simultáneamente. Parece que hay dos problemas:
1. No activa el Trailingstop la mayor parte del tiempo. Sin embargo, a veces funciona. Creo que el problema radica en mi OrderSelect, pero no puedo resolverlo.
2. A veces me da el error 130, pero no puedo ver cómo mi SL/TP puede ser inválido. Todos los valores que estoy imprimiendo están por encima del stoplevel para todos los pares. Y aunque me da el error 130, en realidad a veces sí modifica la orden como si nada estuviera mal.
Aquí está el EA completo, ¿podríais echarle un vistazo y decirme cuál puede ser el problema?