Fermeture de postes. Signal lumineux de marche.

 

Bonsoir ! Un problème est survenu.

Je dois fermer une position. Par le signal de l'indicateur. En outre, je dois pouvoir clôturer la position par un Stop Loss ou un Take Profit. (Juste au cas où le signal de l'indicateur arrive trop tard. - Cela arrive souvent) :

if                    (... ... ...  )         
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,
                                               NULL,MAGIC ,0,CLR_NONE);

Par la suite, afin de fermer les positions ouvertes, je stipule :

for (int v=0; v<OrdersTotal(); v++)                          {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))             {           
        if (OrderSymbol()==Symbol()) && OrderMagicNumber()==MAGIC)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY)                   { 
      if (Stochast_1>75 &&  Stochast_0<75)     {
                   OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); 
                 return(0); // выходим
                }       
               }   
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { ... .... ....

Cependant, les positions ne sont toujours fermées qu'au niveau du stoploss ou du takeprofit. (à une très rare - unique exception près !)

Bien que l'indicateur sur le graphique montre - que presque toutes les positions ouvertes devraient être fermées juste par le signal de l'indicateur. S'il vous plaît dites-moi - où il peut y avoir une erreur ... ?

 

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 les tactiques souhaitées pour travailler sur les positions.
 
Probablement quelque chose avec Stochast_1, Stochast_0, tout le reste est bien.
 
Merci, KIM IV. Je vais essayer de trouver une solution.
 
Integer:
Probablement quelque chose avec Stochast_1, Stochast_0, tout le reste est bien.


Non..... Les stochastiques sont bien. (travail sur les prix d'ouverture)

double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
 
L'achat est clôturé par une offre. Dans ce cas, la clôture n'est déclenchée que si une cotation différente de l'écart spécifié se trouve dans le dernier flux de cotations. Si une telle cotation n'a pas encore réussi (par vieillesse) à quitter la liste des cotations considérées par le courtier, l'ordre de clôture a une chance d'être exécuté.
 

Est-ce que je vous ai bien compris ? La position d'achat devrait être fermée

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green) ;

Et la position de vente doit être fermée :

OrderClose(OrderTicket(),OrderLots(),Ask,3,Green) ; ?
 
rid:

Est-ce que je vous ai bien compris ?

Vous avez raison en général.

 
Exactement ! Le problème est dans Ask
 

Je ne veux toujours pas fermer des positions par stochastique ! Je l'ai bien fait ! J'ai inséré un interrupteur dans les paramètres externes. A la fin du code - bloc séparé pour la fermeture des positions ! J'ai prévu un triangle vert pour la fermeture.

La tactique est simple : le franchissement des frontières du canal formé par les MA lentes avec des déviations vers le haut et vers le bas. Le code est très simple. Vous trouverez ci-dessous un conseiller expert.

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
//********* Закрытие позиций ****************************************
if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNum)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>75 && Stochast_0<75)     {
           OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<25 && Stochast_0>25)    {
                 OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

Quelqu'un peut-il y jeter un coup d'œil ? Et dis-moi ce qui ne va pas. ....

Peut-être que lors de l'ouverture d'une commande, les offres et les demandes sont mal définies ? J'ai toujours été confus à ce sujet :

ticket=OrderSend(Symbol(),... ....
Dossiers :
 
Je n'ai pas regardé le code.
Mais une chose est sûre : au lieu de "if(Stochast_1>75 && Stochast_0<75)", je ferais "if(Stochast_1>75 && Stochast_0<=75)".
Raison: