Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 661

 
berezhnuy:

Boa tarde, você poderia me dizer como resolver este problema?

Eu uso em coruja:

A coruja corre em cada carrapato, caso contrário, as condições básicas não serão atendidas. Eu uso apenas 20 barras para o iMAOnArray, mas no teste de coruja leva muito tempo para pensar. Eu o defino e o chamo no bloco de partida.

Como otimizar o uso desta ferramenta para que a condição principal seja verificada a cada tique e o testador não seja retardado. Estou testando coruja em um gráfico de 4 horas durante um ano e isso me leva 2 horas. Tenho medo de imaginar quanta otimização tem de ser feita))))


Ninguém pode ajudá-lo sem código
 

Este é basicamente todo o 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);
}
//==========================================================================================+

Se o Center_errey for removido, o teste leva menos de um minuto. Se esta condição ainda estiver incluída no código, o teste dura 2 horas.

 
berezhnuy:

Este é basicamente todo o código:

Se o Center_errey for removido, o teste leva menos de um minuto. Se esta condição ainda estiver incluída no código, o teste dura 2 horas.


Você não tentou fazer um indicador?
 

têm uma variável A, que pode assumir os valores 0,1,2.

Será que estas comparações serão equivalentes?

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

 
evillive:

têm uma variável A, que pode assumir os valores 0,1,2.

Será que estas comparações serão equivalentes?

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

Se a variável é do tipo enumerativa, as expressões são idênticas.
 
evillive:

têm uma variável A que pode assumir valores 0,1,2.

Será que estas comparações serão equivalentes?

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

Não, porque nem "A=0" nem "A=1" é uma comparação.

Mas a comparação é "A == 0" e "A == 1".

 
simpleton:

Não, porque nem "A=0" nem "A=1" é uma comparação.

Mas "A == 0" e "A == 1" são comparações.

+1! :)
 
berezhnuy:

Este é basicamente todo o código:

Se o Center_errey for removido, o teste leva menos de um minuto. Se esta condição ainda estiver incluída no código, o teste leva cerca de 2 horas.

Pelos termos, os recálculos e verificações não são relevantes em cada tick, mas somente quando uma nova barra aparece.

É por isso que faz sentido aplicar uma função correspondente, como esta:

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

e executar Center_errey somente quando ele aparece.

Você também pode jogar fora todo tipo de "lixo". Mas isso não afetará essencialmente a velocidade.

Há também um erro grosseiro em seu código - se não houver margem, você cancela o código inteiro. E a rede de arrasto? Embora... talvez seja porque é apenas uma parte do código, como eu entendo dos comentários.

 
simpleton:

Não, porque nem "A=0" nem "A=1" é uma comparação.

Mas "A == 0" e "A == 1" são comparações.


Pontuação ))))


Só que eu não o escrevi em MQL, mas formalmente, esse é o problema (:

 
evillive:

Pontuação ))))


Só que eu não escrevi em MQL, mas formalmente, esse é o problema (:

Não tecnicamente, porque pode haver NULL
Razão: