Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 442

 

Boa noite a todos,

1.

Estratégia - apareceu o bar, estabelecido ordem pendente com stoploss e takeprofit (sl, tp), nada mais.

Vamos assumir que no bar actual, após algum tempo, aparecerá um preço para que a ordem seja accionada, mais tarde virá o preço sl, e depois o preço tp .

Por favor, tente explicar - vamos assumir que o preço de abertura do novo bar estará algures entre os limites de preço sl e tp. Como é efectuado este cálculo?

Logicamente, não pode, porque o provador só tem o próximo bar aberto? E não é igual ao preço especificado na condição de accionamento da ordem pendente, o que significa que a ordem não deve ser accionada.

Mas: durante a corrida do testador, as transacções são de alguma forma executadas e as paragens são desencadeadas. De que forma?

2.

o testador cria o fxt a cada início. e este é o momento. Não consegui encontrar nenhum cenário que sugerisse evitar isto... Na ideia: crie-o uma vez e se eu não mudar nada, use este ficheiro, mas não, o terminal reescreve-o

 
Pode dizer-me se a EA precisa de um tick para executar o init()?
 
-Aleks-:
Pode dizer-me se a EA precisa de um tick para executar o init()?

Não. Não tem. Aqui está o código para o ajudar a ver isto:

//+------------------------------------------------------------------+
//|                                                  test_expert.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright  "Copyright 2015, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 
   Print(__FUNCTION__);
   return(INIT_FAILED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print(__FUNCTION__);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Print(__FUNCTION__);
  }
//+------------------------------------------------------------------+
Anexá-lo ao gráfico e ver que funções estão a funcionar no fim-de-semana.
 
-Aleks-:
Pode dizer-me se a EA precisa de um tick para executar o init()?
Não me parece.
 
Karputov Vladimir:

Não. Não tem. Aqui está o código para o ajudar a vê-lo:

Anexá-lo ao gráfico e ver quais as funções que estão a funcionar no fim-de-semana.
Tapochun:
Não me parece.
Obrigado pela resposta rápida. Então não percebo porque não funciona - não há nenhuma impressão...
 
-Aleks-:
Obrigado pela sua resposta imediata. Então não percebo porque não está a funcionar - não há nenhuma impressão...
Onde está a sua impressora? Posso ter o código para o reproduzir?
 
Karputov Vladimir:
E qual é a posição da sua impressora? Posso ter o código, para reprodução?

Acontece que a inicialização não acontece quando o terminal é carregado, mas acontece quando o período de tempo é alterado.

Preciso de verificar se a leitura de um ficheiro por uma dúzia de EAs durante a inicialização não seria um problema...

Estou a utilizar uma aula.

int init()
  {
//Автоматическая настройка
   if(Use_SetupLoad==true)
     {
      CSVReader FileLoads(FileLoadSetup);
      FileLoads.SetDelimiter(';');
      FileLoads.SetCommon(true);
      int StrokaSetup=0;
      if(FileLoads.Load(1))
        {
         PrintFormat("File %s loaded. Total rows=%d, Total columns=%d",FileLoads.FileName(),FileLoads.TotalRows(),FileLoads.TotalColumns());
         
         for (int i=1;i<30; i++)
         //for (int i=1; i<100 || StrokaSetup!=0; i++)
         {
           if (Magic==FileLoads.GetIntValue(i,13))
           {
            StrokaSetup=i ;
            Print ("StrokaSetup=",StrokaSetup);
            break;
            }
         //   if (i==100) i=1;
         //  Print (FileLoads.GetIntValue(i,13));
         }
         /*
         for (int i=1; i<30; i++)
         {
         Print (FileLoads.GetIntValue(i,13));         
         }
         */
         if(StrokaSetup!=0)
           {
            pipsXH=FileLoads.GetIntValue(StrokaSetup,4)/10;
            if (pipsXH>0)
            {
            pMAH=FileLoads.GetIntValue(StrokaSetup,3);
   //         typeMAH=FileLoads.GetIntValue(StrokaSetup,3);
   //         priceMAH=FileLoads.GetIntValue(StrokaSetup,2);
            
  //          if (pipsXH<0)
  //          PrintFormat("pMAH=%d",pMAH,"typeMAH=%d",typeMAH,"priceMAH=%d",priceMAH,"pipsXH=%d",pipsXH);
            }
            else pipsXH=(-1);
            
            pipsXL=FileLoads.GetIntValue(StrokaSetup,7)/10*(-1);
            if (pipsXL>0)
            {
            pMAL=FileLoads.GetIntValue(StrokaSetup,6);
     //       typeMAL=FileLoads.GetIntValue(StrokaSetup,3);
     //       priceMAL=FileLoads.GetIntValue(StrokaSetup,2);
            
      //      PrintFormat("pMAL=%d",pMAL,"typeMAL=%d",typeMAL,"priceMAL=%d",priceMAL,"pipsXL=%d",pipsXL);
            }
            else pipsXL=(-1);
                        
            pMAT=FileLoads.GetIntValue(StrokaSetup,9);
      //      typeMAT=FileLoads.GetIntValue(StrokaSetup,3);
      //      priceMAT=FileLoads.GetIntValue(StrokaSetup,2);
      //      PrintFormat("pMAT=%d",pMAT,"typeMAT=%d",typeMAT,"priceMAT=%d",priceMAT);
            
            lot=FileLoads.GetDoubleValue(StrokaSetup,11);
      //    PrintFormat("pMAH=%d",pMAH,"pipsXH=%d",pipsXH,"pMAL=%d",pMAL,"pipsXL=%d",pipsXL,"lot=%d",lot);            
            Print("Magic=",Magic," pMAH=",pMAH," pipsXH=",pipsXH," pMAL=",pMAL," pipsXL=",pipsXL," lot=",lot);            
            
           }

        }
      else PrintFormat("Error in loading data from %s",FileLoads.FileName());
     }
///Конец автоматической настройки///  
   return(INIT_SUCCEEDED);
  } 

Uma peça de classe responsável pela leitura de um ficheiro

//+------------------------------------------------------------------+
//| Load                                                             |
//+------------------------------------------------------------------+
bool CSVReader::Load(int start_line)
  {
   int filehandle=FileOpen(m_filename,FILE_CSV|FILE_READ|FILE_ANSI|FILE_SHARE_READ,'\n');
   if(filehandle==INVALID_HANDLE)
     {
      Alert("Error in open of file ",m_filename,", error",GetLastError());
      return(false);
     }
//---
   int line_index=0;
   while(!FileIsEnding(filehandle))
     {
      string str=FileReadString(filehandle);
      //--- skip 0th row
      if(line_index>=start_line)
         if(str!="")
           {
            if(line_index==1) AddData(str,true);
            else AddData(str,false);
           }
      line_index++;
     }
//---
   FileClose(filehandle);
   return(true);
  } 
 
-Aleks-:

Acontece que a inicialização não acontece quando o terminal é carregado, mas acontece quando o período de tempo é alterado.

Preciso de verificar se a leitura de um ficheiro por uma dúzia de EAs durante a inicialização não seria um problema...

Estou a utilizar uma aula.

Peça de classe responsável pela leitura de ficheiros

Portanto, há muitos cheques e condições no seu código antes da impressão. Passar por ele em modo de depuração e verificar o que não está a funcionar.
 
Karputov Vladimir:
Portanto, há muitos cheques e condições no seu código antes da impressão. Ir para o modo de depuração e verificar o que não está a funcionar.
No testador tudo funciona - mas não há impressões quando o terminal é carregado - isso é o que me confundiu.
 
-Aleks-:
No testador, tudo funciona - mas não há impressoras quando o terminal é carregado - isso é o que me confundiu.
Por isso, vale a pena adicionar mais impressoras e ver para onde vai o algoritmo.
Razão: