Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 661

 
berezhnuy:

Buenas tardes, ¿podrían decirme cómo solucionar este problema?

Uso en búho:

El búho se ejecuta en cada tic, de lo contrario no se cumplen las condiciones básicas. Yo uso sólo 20 barras para iMAOnArray, pero en el probador búho toma mucho tiempo para pensar. Lo pongo y lo llamo en el bloque de inicio.

Cómo optimizar el uso de esta herramienta para que la condición principal se compruebe en cada tic y no se ralentice el probador. Porque mi prueba de un búho en una carta de 4 horas durante un año sólo dura 2 horas. Me da miedo imaginar la cantidad de optimización que hay que hacer))))


Nadie puede ayudarte sin código
 

Esto es básicamente todo el código:

//------- Внешние параметры советника -----------------------------------------+
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 se elimina Center_errey, la prueba dura menos de un minuto. Si esta condición se sigue incluyendo en el código, la prueba se ejecuta durante 2 horas

 
berezhnuy:

Esto es básicamente todo el código:

Si se elimina Center_errey, la prueba dura menos de un minuto. Si esta condición se sigue incluyendo en el código, la prueba se ejecuta durante 2 horas


¿No intentaste hacer un indicador?
 

tienen una variable A, que puede tomar los valores 0,1,2.

¿Serán equivalentes estas comparaciones?

if(A=0 || A=1){hacer} y if(A != 2){hacer}

 
evillive:

tienen una variable A, que puede tomar los valores 0,1,2.

¿Serán equivalentes estas comparaciones?

if(A=0 || A=1){hacer} y if(A != 2){hacer}

Si la variable es de tipo enum, las expresiones son idénticas.
 
evillive:

tienen una variable A que puede tomar los valores 0,1,2.

¿Serán equivalentes estas comparaciones?

if(A=0 || A=1){hacer} y if(A != 2){hacer}

No, porque ni "A=0" ni "A=1" es una comparación.

Pero la comparación es "A == 0" y "A == 1".

 
simpleton:

No, porque ni "A=0" ni "A=1" es una comparación.

Pero "A == 0" y "A == 1" son comparaciones.

¡+1! :)
 
berezhnuy:

Esto es básicamente todo el código:

Si se elimina Center_errey, la prueba dura menos de un minuto. Si se incluye esta condición en el código, la prueba dura unas 2 horas.

Por los términos, los recálculos y las comprobaciones no son relevantes en cada tick, sino sólo cuando aparece una nueva barra.

Por eso tiene sentido aplicar una función correspondiente, como ésta:

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

y ejecutar Center_errey sólo cuando aparezca.

También puedes tirar todo tipo de "basura". Pero no afectará esencialmente a la velocidad.

También hay un grave error en su código: si no hay margen, se anula todo el código. ¿Qué pasa con la pesca de arrastre? Aunque... quizás sea porque es sólo una parte del código, según entiendo por los comentarios.

 
simpleton:

No, porque ni "A=0" ni "A=1" es una comparación.

Pero "A == 0" y "A == 1" son comparaciones.


Crédito ))))


Sólo que lo escribí no en MQL, pero formalmente, ese es el problema (:

 
evillive:

Puntuación ))))


Sólo que no escribí en MQL, pero formalmente, ese es el problema (:

No técnicamente, porque puede haber NULL
Razón de la queja: