Errori, bug, domande - pagina 1935

 
Aleksey Vyazmikin:

Quindi non sono sicuro che si tratti di funzioni commerciali...

Il ramo lì è un esempio di dichiarazioni costruttive che chiunque può riprodurre.
 
fxsaber:
C'è un esempio di dichiarazione costruttiva che chiunque può riprodurre.

Capisco - posterei il codice, ma usa una classe per funzioni di trading che non ho ancora pagato...

Durante il rendering, osservo un graduale rallentamento - quasi un paio di secondi per barra alla massima velocità - qualche idea su cosa possa essere?

Nessun controllo antivirus, disco SSD, spazio su di esso...

 
Aleksey Vyazmikin:

Riscritto un EA da MT4 a MT5

La storia è la stessa, test per punti di controllo su minuti.

MT5

2017.07.20 20:01:38.059 Core 1 Si-9.17,M1: 107509 tick, 35385 barre generate. Ambiente sincronizzato alle 0:00:00.078. Test superato in 0:03:52.707 (incluso il preprocessing di ticks 0:00:00.031).

MT4

2017.07.20 20:02:32.696 RUBRUR,M1: 225314 eventi tick (35701 barre, 231783 stati delle barre) processati in 0:00:04.259 (tempo totale 0:00:11.310)

E dov'è la velocità decantata di MT5?
Mostrami il codice di entrambi gli Expert Advisors. Hai il pigro emulatore MQL4 invece del nativo MQL5, giusto?
 
Renat Fatkhullin:
Lei mostra il codice di entrambi gli EA. Avete il pigro emulatore MQL4 invece del nativo MQL5, giusto?

Non ancora pronto per mostrare il codice a causa di

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

Aleksey Vyazmikin, 2017.07.20 23:28


Capisco - posterei il codice, ma usa una classe per funzioni di trading che non ho ancora pagato...

Ma pronto a mostrare i risultati di profilazione da MT5 - come ho capito le funzioni di trading sono fuori questione.



Per l'ambiente OHLC uso le seguenti funzioni

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
Forse sto facendo qualcosa di sbagliato?
 
Aleksey Vyazmikin:

Non sono ancora pronto a mostrare il codice a causa di

Ma sono pronto a mostrare i risultati di profilazione da MT5 - come ho capito le funzioni di trading sono fuori questione.

Per l'ambiente OHLC uso le seguenti funzioni

Forse sto facendo qualcosa di sbagliato?
double iOpen(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyOpen(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iClose(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyClose(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iHigh(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyHigh(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }

double iLow(string symbol,ENUM_TIMEFRAMES tf,int index) {
  if(index < 0) return(-1);
   double Arr[];
   if(CopyLow(symbol,tf, index, 1, Arr)>0)
        return(Arr[0]);
   else return(-1);
 }
 

Copiate tutte le barre disponibili dalla storia, ma in realtà avete bisogno solo dell'indice che state cercando

CopyOpen(Symbol(),0,index,Bars(Symbol(),0)1,Open);
 
Vitaly Muzichenko:

Copiate tutte le barre disponibili dalla storia, ma in realtà avete bisogno solo dell'indice che state cercando

L'ho cambiato secondo la tua ricetta e la EA ha smesso di aprire gli ordini... Forse ho sbagliato di nuovo?


//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,index,1,Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyHigh(symbol,timeframe,index,1,CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }
 
Aleksey Vyazmikin:

Hai cambiato la tua ricetta e l'EA ha smesso di aprire gli ordini... Forse ho sbagliato di nuovo?


double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyHigh(Symbol(),0,index,1,Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }

Chiudere != Alto


PS. Si prega di scrivere qui, non è l'argomento

Chiedo ai moderatori di spostare i post nell'argomento giusto, non di cestinare questo

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2012.03.12
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Vitaly Muzichenko:

Chiudere != Alto

PS. Posta qui, questo non è l'argomento giusto.

Chiedo ai moderatori di spostare i post nel topic giusto, non di sporcare questo

Grazie - corretto.

Il codice è il seguente.

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

Il tempo nel tester è cresciuto - stanco di aspettare :)

 

Sto contando i lotti scambiati nella storia del mese corrente.

   double lots=0;
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
         if(TimeMonth(OrderCloseTime())==TimeMonth(TimeCurrent()))
            if(OrderType()<2)
               lots+=OrderLots();

Risulta che se mostro gli ordini per un determinato periodo di tempo nella storia del terminale, per esempio, per gli ultimi tre giorni, alloraOrdersHistoryTotal() vede solo gli ultimi tre giorni.

OrdersHistoryTotal() dovrebbe vedere tutti gli ordini dell'intera storia, ma il filtraggio per date e periodi dovrebbe essere eseguito da uno sviluppatore.

Altrimenti, l'errato occultamento della cronologia da parte dell'utente può portare a problemi ....