Le format de votre code le rend difficile à lire, mais d'une part comment pouvez-vous utiliser ceci dans un trailing stop. L'ordre doit être toujours ouvert, donc il n'y a pas de OrderClosePrice().
( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue )
Mais les ordres d'achat fonctionnent bien
Non, je ne l'ai pas fait, tous mes autres scripts utilisant simplement OrderClosePrice - OrderOpenPrice ou vice versa fonctionnent bien.
OK, oui, vous avez raison, je n'avais pas réalisé que OrderClosePrice suit le cours actuel lorsqu'un ordre est encore ouvert, donc OrderClosePrice devrait être le cours acheteur actuel pour les ordres d'achat. Je pense que cela doit être une fonctionnalité non documentée.
Quelqu'un peut-il me donner un coup de main, je suis très proche en fait. Personnellement, je ne pense pas qu'il y ait un problème dans mon codage mais je ne sais pas pourquoi il ne fonctionne pas correctement tout le temps.
Cela fait longtemps que je n'ai pas tout combiné en 1, excusez-moi un peu, mes yeux sont un peu flous maintenant.
La figure renvoie la valeur des points pour chaque paire particulière.
C'est la partie trailing.
//+------------------------------------------------------------------+ //| 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 ) ; } } } } } } }
Peut-être qu'il y a :
( OrderStopLoss() == ( OrderOpenPrice() - ( TrailingStop * Figure ) )
https://forum.mql4.com/45053
Il faudrait peut-être le coder de cette façon pour éviter une erreur de serveur :
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; }
pour l'ordre d'achat:
( OrderStopLoss() < ( OrderOpenPrice() + ( TrailingStop * Figure ) )
J'ai essayé mais ça n'a toujours pas marché .... Pourquoi utiliser break dans une instruction if ? ??
Pour un ordre de vente... il devrait être moins et pour un ordre d'achat il devrait être plus ....
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
J'ai fait un essai sur l'EA, quand j'ai testé sur la démo, j'ai remarqué que seuls les ordres d'achat ont été correctement exécutés (je pense), alors que les ordres de vente n'ont déplacé le stop loss qu'une seule fois. Je ne vois toujours pas où est le problème.
** J'ai modifié le code **