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

 

Dans mon cas, c'était "<=", mais les valeurs stochastiques changent très fortement, même à chaque tick - il y a quatre décimales supplémentaires, c'est-à-dire qu'en un tick, les valeurs peuvent passer de (par exemple) 75.0003 à 74.0900.

Ainsi, le signe "=" peut être omis sans crainte. Mais bien sûr, pour ne pas penser - je pense que je le ferai.

 
J'ai regardé l'expert - tout semble être correct. Impossible de le vérifier - pas d'indicateur.
Essayez d'ajouter Print avant OrderClose et voyez si le signal de fermeture apparaît.
 

C'est fait. Ajouté. Non, ..... ! L'avis de clôture n'apparaît pas dans le journal de bord.

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

Je ne comprends pas ! J'ai mis ce bloc dans un autre EA. Et un troisième. ... . Mais la situation n'a pas changé ! Les postes ne sont pas fermés. Bien que rarement, rarement (une ou deux fois sur l'historique = 1 an) et clignote un triangle vert de fermeture sur le graphique visuel. Mais ça ne devrait pas être comme ça ! Les positions, à en juger par le code, devraient se fermer comme une navette de machine à coudre !

Indicateur NOnLagMA dans le téléchargement

Dossiers :
 

Peut-être que ce bloc ne devrait pas fonctionner ? Après tout, nous avons des stops dans le code lorsque nous ouvrons : - stoploss et takeprofit. Et peut-être que toutes les autres conditions de clôture sont ignorées pour cette raison ?

ticket=OrderSend(Symbol(),0,Lots,Ask,Slippage,Bid-SL_long*Point,Ask+TP_long*Point, NULL,MagicNum, 0,CLR_NONE) ;

Vous devrez vous en occuper d'une autre manière.

 
rid:

Je ne comprends rien !

Le bloc de fermeture de la position se trouvait à l'intérieur de la clause "if(OrdersTotal() == 0)".
Vous devriez être plus attentif.)

Voici la fonction start() de la variante de test (sans SL et TP, avec des messages corrects et sans glissement inutile) :
int start()
  {
 
 if(Time[0] <= prevtime) 
       return(0);
 prevtime = Time[0];
  if (UseTrailing) TrailPositions();   
//----
   double NLg_Signal_0 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,0); 
   double NLg_Signal_1 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,1); 
   double NLg_long0    =iCustom(NULL,0,"NonLagMA_v5",0,NLg_buy,0,0,0,0,DV_buy,0,0);
   double NLg_short0   =iCustom(NULL,0,"NonLagMA_v5",0,NLg_sell,0,0,0,0,DV_sell,0,0);
 
  if (OrdersTotal()   == 0)//если нет открытых позиций
  { 
//---------проверяем условие на покупку-----------------      
       if   ( 
              (NLg_Signal_1<=NLg_long0)  &&
              (NLg_Signal_0>NLg_long0)  )
       { 
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера BUY" ); prevtime = Time[1]; }
       }
    //---------проверяем условие на продажу----------------- 
         if  (   
              (NLg_Signal_1>=NLg_short0)  &&
              (NLg_Signal_0<NLg_short0)  )
       { 
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера SELL" ); prevtime = Time[1]; }
       }
   }
//------------------------------------------------------------------
//********* Закрытие позиций ****************************************
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_ 
 //****************************************************************************   
   return(0);
      }



Mais je n'utiliserais pas cet EA sur un compte réel si j'étais vous. Il faut le mettre en ordre, ou en "préparation", si vous voulez ;)
 

Oui, bien sûr. Merci pour votre aide ! Je comprends votre commentaire sur mon erreur.

Et j'ai pris note de vos recommandations. Il y a encore un long chemin à parcourir avant un véritable commerce...

p.s/ Tout fonctionne.... ! Et comment ça a marché !

 
Il est compréhensible que les bénéfices ne soient pas augmentés par ces fermetures. Mais le tirage au sort..... Diminue souvent de manière significative.
 
komposter:
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)".

Une meilleure solution serait : if(Stochast_1-75.0>0 && Stochast_0-75.0<=0) afin d'éviter les conversions inutiles des types int et double.
 
Et comment éviter les int et double inutiles. ? De plus, au lieu de chiffres, nous pouvons utiliser des paramètres externes - extern int Up_lim = 80 ; extern int Low_lim = 20 ;
 
rid:
Et comment éviter les int et double inutiles. ? Je n'arrive pas à comprendre. En outre, au lieu de chiffres, nous pouvons utiliser des paramètres externes : extern int Up_lim = 80 ; extern int Low_lim = 20 ;

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 avec zéro.

"Comparaison de nombres réels".

Raison: