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

 
goldtrader:

Premièrement, il est incorrect de comparer le réel Stochast_ et l'entier 75, et deuxièmement, il est plus correct de comparer leur différence à zéro.

Je pense que dans cette situation, une erreur de 8 décimales n'affectera pas le résultat.
 

Un autre problème se pose avec le bloc de fermeture de position. J'ai mis ce bloc dans mon conseiller expert préféré. Il n'ouvre que des transactions strictement dans le sens de la tendance (je lui en suis profondément reconnaissant...).

Mais en fonction de la force de la tendance, le conseiller expert est (et le fait !) constamment capable d'ouvrir plusieurs transactions, - l'une après l'autre ! C'est ici que j'ai besoin du bloc de positions de fermeture au signal de l'indicateur. Mais voilà le problème : si et quand plusieurs positions sont ouvertes dans une tendance et que la correction contre la tendance commence, l'indicateur dans le bloc donne un signal de fermeture. Comme j'en ai besoin.

Cependant, dans le même temps, pour une raison quelconque, toutes les positions ouvertes ne sont pas fermées. En fait, seulement la plus ancienne. Ceux qui ont été ouverts plus tard ne réagissent pas au signal de fermeture - mais continuent le mouvement. Et encore, - "l'histoire se répète comme une farce" ! À chaque signal de fermeture, une seule position, la position ouverte la plus ancienne, est fermée, et les autres continuent de bouger ! Le lot de toutes les positions est constant.

Voici le graphique du mode visuel. La fermeture par le signal de l'indicateur est marquée par un triangle vert. On voit clairement qu'une seule position est fermée à chaque fois par le signal. Je voudrais que tous les postes ouverts soient fermés ! Veuillez me conseiller, quelle en est la raison ?

Un rappel de code :

/********* Закрытие позиций ****************************************
if (AutoClose) {  
//----------------------------------------------------------------------
if (ExpertOrder(MagicLong)) {   //есть открытые ордера на покупку
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);//закрываем позицию
                 return(0); // выходим         
              }  }
 //--------------------------------------------------------
if (ExpertOrder(MagicShort)) {   //есть открытые ордера на продажу
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем позицию
                 return(0); // выходим
              }  } 
 //-------------------------------------------------------                       
}  //if (AutoClose)
 
rid:

Un autre problème se pose avec le bloc de fermeture...

Où se trouve la boucle sur OrdersTotal() ?
 
granit77:
Où se trouve la boucle sur OrdersTotal() ?
Même s'il y en a une, elle va de 0 à OrdersTotal()-1, et ce devrait être l'inverse ;)
 

Non, ce n'est pas le cas ici. Les commandes sont définies - différemment :

//---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                           |
// true  - есть ордера данного эксперта;                                           |
//---------------------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
bool result=false;
int  _OrdersTotal=OrdersTotal();
if (_OrdersTotal>0) { for (int jk=0; jk<_OrdersTotal; jk++) {    
      if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderMagicNumber()==VersionID) 
          { result=true;  break; }//Найден ордер принадлежащий эксперту
        else  { result=false; } 
       } } } else { result=false; }  
//---------------------        
return(result);}

Et cette version du code est plus confortable pour moi ! Parce que mes positions longues et courtes s'ouvrent indépendamment les unes des autres.

//---------проверяем условие на покупку----------------------------
if (LONG) {     //если  "выключатель" включен
 if  ( ... ... ...      )
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,
                                        Ask+TP*Point,NULL,MagicLong,0,CLR_NONE); 
 

Cependant, c'est toujours la même chose avec la fermeture standard. ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_
 
rid:

Cependant, c'est toujours la même chose avec la fermeture standard. ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

Vous pouvez essayer de faire une boucle inverse de OrdersTotal à 0. Cela devrait aider.
 

Comment faire ? S'il vous plaît, écrivez, si ce n'est pas trop difficile. Au fait, voici le graphique - avec la "norme" ci-dessus : tout est identique - une seule position se ferme sur le signal de l'indicateur -...

 
rid:

Comment faites-vous ?

Selon komposter et Vinin, au lieu de :
for (int v=0 ; v<OrdersTotal() ; v++)

écrire :
for (int v=OrdersTotal()-1 ; v>0 ; v--)

Ça marche pour moi.
 
granit77:
rid:

Comment faites-vous ?

Si l'on en croit Komposter et Vinin, au contraire :
for (int v=0 ; v<OrdersTotal() ; v++)

écrire :
for (int v=OrdersTotal()-1 ; v>0 ; v--)

Ça marche pour moi.

Vous avez tout à fait raison. Bien que KimV dispose de scripts et de bibliothèques qui mettent en œuvre tout cela. Vous devriez peut-être le chercher sur son forum.
Raison: