Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 442

 

Buona sera a tutti,

1.

Strategia - barra apparsa, ordine pendente impostato con stoploss e takeprofit (sl, tp), nient'altro.

Supponiamo che nella barra corrente, dopo un po' di tempo, apparirà un prezzo per far scattare l'ordine, più tardi arriverà il prezzo sl, e poi il prezzo tp.

Per favore provate a spiegare - assumiamo che il prezzo di apertura della nuova barra sarà da qualche parte tra i limiti di prezzo sl e tp. Come si esegue questo calcolo?

Logicamente, non può, perché il tester ha solo il prezzo di apertura della prossima barra? E non è uguale al prezzo specificato nella condizione per l'attivazione dell'ordine pendente, il che significa che l'ordine non dovrebbe essere attivato.

Ma: durante l'esecuzione del tester, i trade vengono in qualche modo eseguiti e gli stop vengono attivati. In che modo?

2.

il tester crea fxt ad ogni avvio. e questo è il tempo. Non ho trovato nessuna impostazione che suggerisca di evitare questo... Nell'idea: crearlo una volta e se non cambio nulla, usare questo file, ma no, il terminale lo riscrive

 
Potete dirmi se l'EA ha bisogno di un tick per eseguire init()?
 
-Aleks-:
Puoi dirmi se l'EA ha bisogno di un tick per eseguire init()?

No, non è così. Ecco il codice per aiutarvi a vedere questo:

//+------------------------------------------------------------------+
//|                                                  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__);
  }
//+------------------------------------------------------------------+
Attaccalo al grafico e vedi quali funzioni funzionano nel fine settimana.
 
-Aleks-:
Puoi dirmi se l'EA ha bisogno di un tick per eseguire init()?
Non credo.
 
Karputov Vladimir:

No, non è così. Ecco il codice per aiutarvi a vederlo:

Attaccalo al grafico e vedi quali funzioni funzionano nel fine settimana.
Tapochun:
Non credo.
Grazie per la pronta risposta. Allora non capisco perché non funziona - non c'è nessuna stampa...
 
-Aleks-:
Grazie per la sua pronta risposta. Allora non capisco perché non funziona - non c'è nessuna stampa...
Dov'è la tua stampante? Posso avere il codice per riprodurlo?
 
Karputov Vladimir:
E dove si trova la vostra stampante? Posso avere il codice per la riproduzione?

Si scopre che l'inizializzazione non avviene quando il terminale viene caricato, ma avviene quando viene cambiato il timeframe.

Devo verificare se la lettura di un file da parte di una dozzina di EA durante l'inizializzazione non sarebbe un problema...

Sto usando una classe.

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);
  } 

Un pezzo di classe responsabile della lettura di un file

//+------------------------------------------------------------------+
//| 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-:

Si scopre che l'inizializzazione non avviene quando il terminale viene caricato, ma avviene quando viene cambiato il timeframe.

Devo verificare se la lettura di un file da parte di una dozzina di EA durante l'inizializzazione non sarebbe un problema...

Sto usando una classe.

Pezzo di classe responsabile della lettura dei file

Quindi ci sono molti controlli e condizioni nel vostro codice prima della stampa. Passate in modalità debug e controllate cosa non funziona.
 
Karputov Vladimir:
Quindi ci sono molti controlli e condizioni nel vostro codice prima della stampa. Andate in modalità debug e controllate cosa non funziona.
Nel tester tutto funziona - ma non ci sono stampe quando viene caricato il terminale - è questo che mi ha confuso.
 
-Aleks-:
Nel tester, tutto funziona - ma non ci sono stampanti quando il terminale è caricato - è questo che mi ha confuso.
Quindi vale la pena aggiungere altre stampanti e vedere dove va l'algoritmo.
Motivazione: