Fermeture de postes. Signal lumineux de marche. - page 5

 
komposter:
rid:

Le résultat est toujours le même ! Avec la dernière variante, seule la dernière position ouverte est fermée !

Maintenant, supprimez le retour après OrderClose, et observez le résultat ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Je l'ai fait comme indiqué. Et un miracle s'est produit. Toutes les positions ouvertes sont fermées par le signal de l'indicateur ! Mais pourquoi ?
 
rid:
komposter:
rid:

Le résultat est toujours le même ! Avec la dernière variante, seule la dernière position ouverte est fermée !

Maintenant, supprimez le retour après OrderClose, et observez le résultat ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Je l'ai fait comme indiqué. Et un miracle s'est produit. Toutes les positions ouvertes ont été fermées en fonction du signal de l'indicateur ! Mais pourquoi ?
Votre retour a interrompu le cycle de traitement.
 
Je l'ai. Merci à tous ceux qui ont répondu !
 
KimIV:

J'ai l'habitude de mettre en œuvre ce type de fonctionnalité :

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions() {
  double sl=0, tp=0;
  int    ms[2];
 
  ArrayInitialize(ms, 0);
  GetTradeSignal(ms);
  if (ExistPositions("", -1, Magic)) {
    if (ms[1]>0) ClosePositions("", OP_BUY , Magic);
    if (ms[1]<0) ClosePositions("", OP_SELL, Magic);
  } else {
    if (ms[0]>0) {
      if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      OpenPosition(OP_BUY, sl, tp, Magic);
    }
    if (ms[0]<0) {
      if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      OpenPosition(OP_SELL, sl, tp, Magic);
    }
  }
}
Comme vous pouvez le constater, des fonctions sont écrites pour effectuer des actions bien spécifiques. Ces fonctions sont ensuite combinées de manière à mettre en œuvre la tactique de travail souhaitée avec les positions.
S'il vous plaît, Igor, décrivez votre fonctionnalité un peu plus en détail. Je veux la comprendre, mais en raison de mes modestes connaissances, je perds le fil de mes pensées dès le début.
 
rid писал (а):
S'il vous plaît, Igor, décrivez votre fonction plus en détail. Je veux le comprendre, mais en raison de mes modestes connaissances, je risque de perdre le fil de mes pensées dès le début.

Il s'agit d'un exemple tiré d'une EA qui fonctionne. Affectation des fonctions :

  1. La fonction GetTradeSignal() remplit le tableau ms[] avec des signaux de transaction. Chaque expert a sa propre façon de remplir la fonction GetTradeSignal(), bien sûr.
  2. La fonction ExistPositions() renvoie l'indicateur de présence de la position.
  3. La fonction ClosePositions() ferme une ou plusieurs positions en présence d'un signal correspondant dans le tableau ms[]. Avant la fermeture, la présence d'une position est vérifiée par la condition if (ExistPositions("", -1, Magic)).
  4. La fonction OpenPosition() ouvre une position au prix actuel en présence d'un signal correspondant dans le tableau ms[]. La position ne peut être ouverte que s'il n'y a pas de signal.

Tactique :

  1. S'il y a des positions et qu'il y a un signal de fermeture, alors fermez les positions.
  2. S'il n'y a pas de positions et qu'il y a un signal pour ouvrir une position, alors ouvrez une position.

Vous voyez comme c'est facile ? :-)

 
Oui, merci. Je vais voir ce que je peux trouver.
 

Bonjour à tous ! Joyeux Noël !

Un autre problème est apparu. J'ai examiné la théorie, mais je n'ai pas encore trouvé de solution. Pour une raison quelconque, j'ai besoin de fermer les positions ouvertes dans mon Expert Advisor en utilisant la fonction au lieu d'utiliser les stops (Stop Loss et Take Profit). Je l'ai fait. Ça a marché ! Cependant...

En essayant d'insérer dans un Expert Advisor la bibliothèque pour le calcul des lots (B-lots), j'ai découvert qu'elle a commencé à fonctionner d'une manière inconnue ! Si je n'avais pas utilisé les MM, la courbe d'équilibre (après optimisation) montait régulièrement avec un drawdown à peine perceptible, après avoir ajouté les MM, j'ai soudainement connu une chute brutale ! De plus ! Même si nous supprimons la bibliothèque des lots B et augmentons simplement la taille des lots de 0,1 à 0,2, nous constatons à nouveau une forte baisse. Même lorsque le dépôt initial est augmenté en plusieurs fois ...... C'est-à-dire que ce n'est ni la bibliothèque ni la taille du dépôt - le prélèvement était misérable au départ... . J'entre sur le marché comme ça :

//---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if (Long)    {  //выключатель вкл   
if (!ExpertOrder( MagicLong ))     {//если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicLong,0,Blue); 
    if(ticket<0){Print("Ошибка открытия ордера BUY #",GetLastError());return(0);}
              }
              }
Tout est clair et compréhensible ici. Ensuite, je ferme les positions en utilisant la fonction OrderClose(. ...). Comme ça :
for (int v=0; v<OrdersTotal(); v++)               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))  {           
        if (OrderSymbol()==Symbol() )                   { 
//-----------------------------------------------------             
if (ExpertOrder( MagicLong ))  {
  if(OrderProfit() > tp)   { OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); return(0);}
  if(OrderProfit() <= -sl) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); return(0);}
                               }
}}}
Lorsque je règle initialement le lot=0.1, la conception fonctionne bien ! Lorsque j'essaie de modifier la taille du lot (augmentation) ou lorsque j'essaie d'activer la bibliothèque MM, l'opération est interrompue ! Je ne comprends pas pourquoi ? J'ai utilisé "Lots" au lieu de OrderLots(), mais rien n'a changé. S'il vous plaît, dites-moi.
 
rid:
Lorsque j'essaie de modifier la taille du lot (augmentation) ou lorsque j'essaie d'activer la bibliothèque MM, l'opération est interrompue ! Je ne comprends pas pourquoi ? J'ai utilisé "Lots" au lieu de OrderLots(), mais rien n'a changé. S'il vous plaît, conseillez-nous.
Nous devons examiner comment l'EA agit différemment.
Les commandes sont-elles ouvertes/fermées au même moment qu'auparavant ?
 

Non. En augmentant le lot de 0,1 à 0,2, les transactions commencent à se produire plus souvent, plus de deux fois plus souvent ! Avec les mêmes paramètres externes ... C'est étrange. Mais je ne suis pas trop paresseux ! Je l'ai fait comme ça :

J'ai supprimé la clôture des positions à l'aide de la fonction OrderClose, et prévu une clôture normale par Stop Loss et Take Profit dans la fonction ticket=OrderSend(... ... ...). Dans ce cas, le bloc MM a fonctionné comme il le devait ! Il semble que tout dépende de la fonction.

if(OrderProfit() > tp)    { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  }
Peut-être que la valeur de "tp" devrait être modifiée en conséquence lors de l'augmentation du lot ?
 
Devons-nous pointer nos doigts vers le ciel ? ;)

L'erreur se trouve dans le code. Où - je ne sais pas, car il n'y a même pas de code. Appelez les voyants de la branche suivante ;)
Raison: