Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 661

 
berezhnuy:

Guten Tag, könnten Sie mir bitte sagen, wie ich dieses Problem lösen kann?

Ich verwende in Eule:

Die Eule läuft bei jedem Tick, sonst werden die Grundbedingungen nicht erfüllt. Ich verwende nur 20 Balken für iMAOnArray, aber auf dem Prüfstand Eule braucht sehr lange Zeit zu denken. Ich setze ihn im Startblock und rufe ihn auf.

Wie kann die Nutzung dieses Tools optimiert werden, so dass die wichtigste Bedingung bei jedem Tick geprüft wird und der Tester nicht verlangsamt wird? Ich teste Eule seit einem Jahr auf einem 4-Stunden-Chart und brauche dafür 2 Stunden. Ich habe Angst, mir vorzustellen, wie viel Optimierungsarbeit geleistet werden muss))))


Ohne Code kann Ihnen niemand helfen
 

Dies ist im Grunde der gesamte 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);
}
//==========================================================================================+

Wenn Center_errey entfernt wird, dauert der Test weniger als eine Minute. Wenn diese Bedingung noch im Code enthalten ist, läuft der Test 2 Stunden lang

 
berezhnuy:

Dies ist im Grunde der gesamte Code:

Wenn Center_errey entfernt wird, dauert der Test weniger als eine Minute. Wenn diese Bedingung noch im Code enthalten ist, läuft der Test 2 Stunden lang


Haben Sie nicht versucht, einen Indikator zu erstellen?
 

haben eine Variable A, die die Werte 0,1,2 annehmen kann.

Werden diese Vergleiche gleichwertig sein?

if(A=0 || A=1){do} und if(A != 2){do}

 
evillive:

haben eine Variable A, die die Werte 0,1,2 annehmen kann.

Werden diese Vergleiche gleichwertig sein?

if(A=0 || A=1){do} und if(A != 2){do}

Wenn die Variable vom Typ Enum ist, sind die Ausdrücke identisch.
 
evillive:

eine Variable A haben, die die Werte 0,1,2 annehmen kann.

Werden diese Vergleiche gleichwertig sein?

if(A=0 || A=1){do} und if(A != 2){do}

Nein, denn weder "A=0" noch "A=1" ist ein Vergleich.

Der Vergleich lautet jedoch "A == 0" und "A == 1".

 
simpleton:

Nein, denn weder "A=0" noch "A=1" ist ein Vergleich.

Aber "A == 0" und "A == 1" sind Vergleiche.

+1! :)
 
berezhnuy:

Dies ist im Grunde der gesamte Code:

Wenn Center_errey entfernt wird, dauert der Test weniger als eine Minute. Wenn diese Bedingung noch im Code enthalten ist, dauert der Test etwa 2 Stunden.

Neuberechnungen und Überprüfungen sind also nicht bei jedem Tick erforderlich, sondern nur, wenn ein neuer Balken erscheint.

Deshalb ist es sinnvoll, eine entsprechende Funktion, wie diese, anzuwenden:

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

und führen Sie Center_errey nur aus, wenn es erscheint.

Sie können auch alle Arten von "Müll" wegwerfen. Die Geschwindigkeit wird dadurch aber nicht wesentlich beeinträchtigt.

Es gibt auch einen groben Fehler in Ihrem Code - wenn es keinen Spielraum gibt, heben Sie den gesamten Code auf. Was ist mit dem Schleppnetz? Obwohl... Vielleicht liegt es daran, dass es nur ein Teil des Codes ist, wie ich den Kommentaren entnehme.

 
simpleton:

Nein, denn weder "A=0" noch "A=1" ist ein Vergleich.

Aber "A == 0" und "A == 1" sind Vergleiche.


Ergebnis ))))


Nur habe ich es nicht in MQL geschrieben, sondern formal, das ist das Problem (:

 
evillive:

Ergebnis ))))


Nur habe ich nicht in MQL geschrieben, aber das ist formal das Problem (:

Technisch gesehen nicht, denn es kann NULL sein.