Su formato de código hace que sea difícil de leer, pero por un lado cómo se puede utilizar esto en un trailing stop. La orden tiene que estar todavía abierta por lo que no hay OrderClosePrice()
( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue )
Pero las órdenes de compra funcionan bien
No, no lo hice, todo mi otro script utilizando sólo OrderClosePrice - OrderOpenPrice o viceversa funciona bien.
OK sí, tienes razón, no me di cuenta de que OrderClosePrice sigue el precio actual cuando una orden está todavía abierta, por lo que OrderClosePrice debe ser el precio actual de la oferta en las órdenes de compra. Creo que debe ser una característica no documentada.
Alguien puede echarme una mano, estoy muy cerca. Personalmente no creo que haya un error en mi codificación, pero no sé por qué no funciona correctamente todo el tiempo.
Es un largo EA desde que combiné todo en 1, perdóname un poco mis ojos están bastante borrosos ahora.
La figura devuelve el valor de los puntos para cada par en particular.
Esta es la parte de la cola .
//+------------------------------------------------------------------+ //| Program's global variables | //+------------------------------------------------------------------+ extern double StartTrailingStop = 15.0 ; extern double TrailingStop = 5.0 ; extern double CummulativeValue = 5.0 ; extern int NumberOfTrail = 10 ; double Figure ; //+------------------------------------------------------------------+
//+------------------------------------------------------------------+ //| Program's sub-function | //+------------------------------------------------------------------+double PointsDetection() { Figure = 0.0 ; if ( MarketInfo ( OrderSymbol() , MODE_POINT ) == 0.01 || MarketInfo ( OrderSymbol() , MODE_POINT ) == 0.001 ) { Figure = 0.01 ; } else { if ( MarketInfo ( OrderSymbol() , MODE_POINT ) == 0.0001 || MarketInfo ( OrderSymbol() , MODE_POINT ) == 0.00001 ) { Figure = 0.0001 ; } } return ( Figure ) ; }
//+------------------------------------------------------------------+ //| Program's sub-function | //+------------------------------------------------------------------+ void ProcessTrailingStop() { bool Result ; for ( int x = ( OrdersTotal() - 1 ) ; x >= 0 ; x-- ) { if ( OrderSelect ( x , SELECT_BY_POS , MODE_TRADES ) == True ) { PointsDetection() ; if ( OrderType() == OP_BUY ) { for ( int xai = 0 ; xai < NumberOfTrail ; xai++ ) { if ( xai == 0 ) { if ( ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= StartTrailingStop ) && ( ( OrderStopLoss() == 0 ) || ( OrderStopLoss() < ( OrderOpenPrice() + ( TrailingStop * Figure ) ) ) ) ) { Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ; } } if ( xai == 1 ) { if ( ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) ) && ( OrderStopLoss() == ( OrderOpenPrice() + ( TrailingStop * Figure ) ) ) ) { Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ; } } if ( xai >= 2 ) { if ( ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) ) && ( OrderStopLoss() == ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * ( xai - 1 ) ) ) * Figure ) ) ) ) { Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ; } } } } else { if ( OrderType() == OP_SELL ) { for ( int xaii = 0 ; xaii < NumberOfTrail ; xaii++ ) { if ( xaii == 0 ) { if ( ( ( ( OrderOpenPrice() - OrderClosePrice() ) / Figure ) >= StartTrailingStop ) && ( ( OrderStopLoss() == 0 ) || ( OrderStopLoss() > ( OrderOpenPrice() - ( TrailingStop * Figure ) ) ) ) ) { Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() - ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ; } } if ( xaii == 1 ) { if ( ( ( ( OrderOpenPrice() - OrderClosePrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) ) && ( OrderStopLoss() == ( OrderOpenPrice() - ( TrailingStop * Figure ) ) ) ) { Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() - ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ; } } if ( xaii >= 2 ) { if ( ( ( ( OrderOpenPrice() - OrderClosePrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xaii ) ) ) && ( OrderStopLoss() == ( OrderOpenPrice() - ( ( TrailingStop + ( CummulativeValue * ( xaii - 1 ) ) ) * Figure ) ) ) ) { Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() - ( ( TrailingStop + ( CummulativeValue * xaii ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ; } } } } } } }
Tal vez allí :
( OrderStopLoss() == ( OrderOpenPrice() - ( TrailingStop * Figure ) )
https://forum.mql4.com/45053
Tal vez debería ser codificado de esta manera para evitar el error del servidor :
figure = PointsDetection(); if ( ( ( ( OrderOpenPrice() - OrderClosePrice() ) / Figure ) >= StartTrailingStop ) && ( ( OrderStopLoss() == 0 ) || ( OrderStopLoss() >= OrderOpenPrice() ) || ( OrderStopLoss() > ( OrderOpenPrice() - ( TrailingStop * Figure ) ) ) ) ) { Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() - ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ; if( result == true ) break; }
para la orden de compra:
( OrderStopLoss() < ( OrderOpenPrice() + ( TrailingStop * Figure ) )
- 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
Estaba haciendo un tra-il ing EA , cuando probé en demo me di cuenta de que sólo las órdenes de compra lo consiguieron correctamente ( creo ) , mientras que las órdenes de venta sólo se movieron stop loss ONCE . Todavía no puedo detectar dónde está el problema sin embargo.
** Editado el código **