Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 661

 
berezhnuy:

Bonjour, pourriez-vous me dire comment résoudre ce problème ?

Je l'utilise dans le hibou :

Le hibou fonctionne à chaque tic, sinon les conditions de base ne seront pas remplies. J'utilise seulement 20 barres pour iMAOnArray, mais sur le testeur le hibou prend beaucoup de temps pour réfléchir. Je le fixe et l'appelle dans le bloc de départ.

Comment optimiser l'utilisation de cet outil afin que la condition principale soit vérifiée à chaque tic et que le testeur ne soit pas ralenti. Parce que le test d'une chouette sur une carte de 4 heures pendant un an ne me prend que 2 heures. J'ai peur d'imaginer la quantité d'optimisation qui doit être faite. ))))


Personne ne peut vous aider sans le code
 

C'est en gros tout le code :

//------- Внешние параметры советника -----------------------------------------+
extern string _P_Expert = "---------- Параметры советника";
extern int      Magic      = 777;                 // Магический номер позиций
extern double   SL=10;                            // Размер лося
extern double   TP=10000;                           // Размер профита 
extern string     ____= "Параметры блока MoneyManagement";
extern bool      MoneyManagement=false;
extern double    Lots          = 0.01;  
extern int       MarginPercent=3;
//------- Параметры трала -----------------------------------------------------+
extern string     ______= "Параметры блока TrallingStop";
extern bool      TralSimple=true;
//------- Характкристики баров ------------------------------------------------+

//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>
#include <stderror.mqh>

int start()
{

   total=OrdersTotal();
   Comment( LotsCounting() );
//+=================================================================================+
  // Проверка средств
   if(AccountFreeMargin()<(1000*Lots)){
      Print("We have no money. Free Margin = ", AccountFreeMargin());   
      return(0);  
   }
//===========================  Открытие позиций  ===================================+ 
//==========================================================================================+
//=============================   Center_array      ========================================+
      double Center_array[50];
      int    h,limit=ArraySize(Center_array);
      ArraySetAsSeries(Center_array,true);
      for(h=0; h<limit; h++)
         Center_array[h]=iRSI(NULL,0,14,0,h);
      double MA_1 =iMAOnArray(Center_array,0,14,0,MODE_SMA,1);
      double rs_1 = iRSI(NULL,0,14,0,1);
      
      if (Last_Max1!=Max1){
      if (Close[1]>Close[2] && rs_1<MA_1){
               lots=LotsCounting();
               OrderSend(Symbol(),OP_BUYSTOP,lots,(Max1),0,SL_buy,TP_buy, "Покупаем ",Magic,Expiration,Blue);
               Last_Max1=Max1;
               PlaySound("ok.wav");
               {
               Print ("При открытии произошла ошибка ", GetLastError());
               return;
               }
            }
         }
       }

//==========================================================================================+
      if (delet) DeleteOppositeOrders("",-1,Magic);
//==========================================================================================+
//=======================================TrallingStop=======================================+
      for ( int v = OrdersTotal() - 1; v >= 0; v -- ){       
         if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES)){           
            if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){ 
               //+=================================================================================+
               ///+================================Обычный трал ====================================+
               if (TralSimple){
                  //+=================================================================================+
                  if(OrderType() == OP_BUY){
                     if((Bid-OrderOpenPrice()) > (Point*TrailingStop)){
                        if(OrderStopLoss() < Bid-Point*TrailingStop || (OrderStopLoss()==0)){
                           OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);  
                        }
                     }
                  }
               }                                   
            }  // Symbol()  
         } // select
      } //total 
        //============================== Конец блока закрытия ==============================+
 return(0);
}
//==========================================================================================+

Si le Centre_errey est supprimé, le test prend moins d'une minute. Si cette condition est toujours incluse dans le code, le test se déroule pendant 2 heures.

 
berezhnuy:

C'est en gros tout le code :

Si le Centre_errey est supprimé, le test prend moins d'une minute. Si cette condition est toujours incluse dans le code, le test se déroule pendant 2 heures.


N'avez-vous pas essayé de faire un indicateur ?
 

ont une variable A, qui peut prendre les valeurs 0,1,2.

Ces comparaisons seront-elles équivalentes ?

si(A=0 || A=1){do} et si(A != 2){do}

 
evillive:

ont une variable A, qui peut prendre les valeurs 0,1,2.

Ces comparaisons seront-elles équivalentes ?

si(A=0 || A=1){do} et si(A != 2){do}

Si la variable est de type enum, les expressions sont identiques.
 
evillive:

avoir une variable A qui peut prendre les valeurs 0,1,2.

Ces comparaisons seront-elles égales ?

si(A=0 || A=1){do} et si(A != 2){do}

Non, car ni "A=0" ni "A=1" ne sont des comparaisons.

Mais la comparaison est "A == 0" et "A == 1".

 
simpleton:

Non, car ni "A=0" ni "A=1" ne sont des comparaisons.

Mais "A == 0" et "A == 1" sont des comparaisons.

+1 ! :)
 
berezhnuy:

C'est en gros tout le code :

Si le Centre_errey est supprimé, le test prend moins d'une minute. Si cette condition est toujours incluse dans le code, le test dure environ 2 heures.

Par ailleurs, les recalculs et les vérifications ne sont pas pertinents à chaque tick, mais seulement lorsqu'une nouvelle barre apparaît.

C'est pourquoi il est logique d'appliquer une fonction correspondante, comme celle-ci :

bool NevBar(){
   static int PrevTime=0;
   if (PrevTime==Time[0]) return(false);
   PrevTime=Time[0];
   return(true);}

et ne lancez Center_errey que lorsqu'il apparaît.

Vous pouvez également jeter toutes sortes de "déchets". Mais cela n'affectera pas essentiellement la vitesse.

Il y a également une erreur grossière dans votre code - s'il n'y a pas de marge, vous annulez l'ensemble du code. Et le chalut ? Bien que... C'est peut-être parce que ce n'est qu'une partie du code, comme je le comprends d'après les commentaires.

 
simpleton:

Non, car ni "A=0" ni "A=1" ne sont des comparaisons.

Mais "A == 0" et "A == 1" sont des comparaisons.


Crédit ))))


Seulement je ne l'ai pas écrit en MQL, mais formellement, c'est le problème ( :

 
evillive:

Score ))))


Seulement je n'ai pas écrit en MQL, mais formellement, c'est le problème ( :

Pas techniquement, car il peut y avoir NULL
Raison: