Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 661

 
berezhnuy:

Buon pomeriggio, potreste dirmi come risolvere questo problema?

Io uso in gufo:

Owl funziona ad ogni tick, altrimenti le condizioni di base non saranno soddisfatte. Uso solo 20 barre per iMAOnArray, ma sul tester il gufo impiega molto tempo per pensare. Lo imposto e lo chiamo nel blocco di partenza.

Come ottimizzare l'uso di questo strumento in modo che la condizione principale sia controllata ad ogni tick e il tester non sia rallentato. Perché il mio test di un gufo su un grafico a 4 ore per un anno dura solo 2 ore. Ho paura di immaginare quanta ottimizzazione deve essere fatta ))))


Nessuno può aiutarvi senza codice
 

Questo è fondamentalmente tutto il codice:

//------- Внешние параметры советника -----------------------------------------+
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);
}
//==========================================================================================+

Se Center_errey viene rimosso, il test richiede meno di un minuto. Se questa condizione è ancora inclusa nel codice, il test viene eseguito per 2 ore

 
berezhnuy:

Questo è fondamentalmente tutto il codice:

Se Center_errey viene rimosso, il test richiede meno di un minuto. Se questa condizione è ancora inclusa nel codice, il test viene eseguito per 2 ore


Non hai provato a fare un indicatore?
 

hanno una variabile A, che può assumere i valori 0,1,2.

Questi confronti saranno equivalenti?

se(A=0 || A=1){do} e se(A != 2){do}

 
evillive:

hanno una variabile A, che può assumere i valori 0,1,2.

Questi confronti saranno equivalenti?

se(A=0 || A=1){do} e se(A != 2){do}

Se la variabile è di tipo enum, le espressioni sono identiche.
 
evillive:

hanno una variabile A che può assumere i valori 0,1,2.

Questi confronti saranno uguali?

se(A=0 || A=1){do} e se(A != 2){do}

No, perché né "A=0" né "A=1" è un confronto.

Ma il confronto è "A == 0" e "A == 1".

 
simpleton:

No, perché né "A=0" né "A=1" è un confronto.

Ma "A == 0" e "A == 1" sono confronti.

+1! :)
 
berezhnuy:

Questo è fondamentalmente tutto il codice:

Se Center_errey viene rimosso, il test richiede meno di un minuto. Se questa condizione è ancora inclusa nel codice, il test dura circa 2 ore.

Per i termini, i ricalcoli e i controlli non sono rilevanti su ogni tick, ma solo quando appare una nuova barra.

Ecco perché ha senso applicare una funzione corrispondente, come questa:

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

ed eseguire Center_errey solo quando appare.

Si può anche buttare ogni sorta di "spazzatura". Ma non influenzerà essenzialmente la velocità.

C'è anche un errore grossolano nel tuo codice - se non c'è margine, si annulla l'intero codice. E la pesca a strascico? Anche se... forse è perché è solo una parte del codice, come ho capito dai commenti.

 
simpleton:

No, perché né "A=0" né "A=1" è un confronto.

Ma "A == 0" e "A == 1" sono confronti.


Credito ))))


Solo che l'ho scritto non in MQL, ma formalmente, questo è il problema (:

 
evillive:

Punteggio ))))


Solo che non ho scritto in MQL, ma formalmente, questo è il problema (:

Non tecnicamente, perché ci può essere NULL