Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 6

 

Compagni, non ho mai fatto un montaggio della storia, quindi non conosco le complessità della lettura del grafico dopo l'ottimizzazione.

C'è un tale grafico dopo il pass annuale 2014-2015, dove guardare e cosa significa? Interessato al colore e alla posizione dei cubi, perché alcuni sono al centro, altri sotto/sopra, e due/tre nello stesso quadrato?

Grazie per il chiarimento!

 
strongflex:
Non apre il commercio nel tester. Quale potrebbe essere il problema qui?)

Bene... In primo luogo, state cercando di aprire una vendita al prezzo di Ask. Mentre tu stai aprendo una vendita a Bid e un acquisto a Ask.

Ho messo la ricerca dei dati RSI e il suo passaggio di livello in una funzione. Ha anche un controllo dei prezzi. Restituisce segnali: comprare, vendere o niente (-1)

//+------------------------------------------------------------------+
//|                                               exTestValueRSI.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES      TimeframeRSI   = PERIOD_M15;  // Таймфрейм RSI
input int                  PeriodRSI      = 14;          // Период расчёта RSI
input ENUM_APPLIED_PRICE   PriceRSI       = PRICE_CLOSE; // Цена расчёта RSI
input int                  UpperRSIlevel  = 70;          // Верхний уровень RSI
input int                  LowerRSIlevel  = 30;          // Нижний уровень RSI
input int                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore;    // Количество минут назад
int      periodRSI;        // Период расчёта RSI
int upperRSIlevel;         // Верхний уровень RSI
int lowerRSIlevel;         // Нижний уровень RSI
//---
double   prevRSIvalue0;    // Значение RSI для заданного тф xxx минут назад
double   prevRSIvalue1;    // Значение RSI для заданного тф xxx минут назад-x минут
//---
double   prevClose_0;      // Значение Close для заданного тф xxx минут назад
double   prevClose_1;      // Значение Close для заданного тф xxx минут назад-x минут
//---
datetime timeBefore;       // Время ххх минут назад
datetime timePrevBefore;   // Время ххх минут назад-x минут
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   minutesBefore=(MinutesBefore<1?1:MinutesBefore);  // Количество минут назад
   periodRSI=(PeriodRSI<1?1:PeriodRSI);
   upperRSIlevel=(UpperRSIlevel<1?1:UpperRSIlevel>100?100:UpperRSIlevel);
   lowerRSIlevel=(LowerRSIlevel<0?0:lowerRSIlevel>99?99:LowerRSIlevel);
   if(upperRSIlevel<=lowerRSIlevel) upperRSIlevel=lowerRSIlevel+1;
   if(lowerRSIlevel>=upperRSIlevel) lowerRSIlevel=upperRSIlevel-1;
   /*

   */
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
         //--- получили сигнал на покупку
         Print("Сигнал на покупку ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на покупку
         //--- вызов функции открытия позиции на покупку
         }
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
         //--- получили сигнал на продажу
         Print("Сигнал на продажу ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на продажу
         //--- вызов функции открытия позиции на продажу
         }
      }
  }
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE) {
   return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
}
//+------------------------------------------------------------------+
double GetPriceClose(string symbol_name,ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyClose(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+
int GetBarShift(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime time) {
   if(time<0) return(-1);
   //---
   datetime array[], time0;
   if(CopyTime(symbol_name,timeframe,0,1,array)<0) return(-1);
   time0=array[0];
   if(CopyTime(symbol_name,timeframe,time0,time,array)<0) return(-1);
   datetime temptime=GetTime(symbol_name,timeframe,ArraySize(array)-1);
   if(array[0]==temptime && temptime<=time) return(ArraySize(array)-1);
   else return(ArraySize(array));
}
//+------------------------------------------------------------------+
datetime GetTime(string symbol_name,ENUM_TIMEFRAMES timeframe,int bar) {
   if(bar<0) return(-1);
   datetime array[];
   if(CopyTime(symbol_name,timeframe,bar,1,array)>0) return(array[0]);
   return(-1);
}
//+------------------------------------------------------------------+
int SignalByRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int minutes_before, int upper_lev_rsi=70, int lower_lev_rsi=30) {
   //--- время 1x и 2x минут назад
   datetime time_before_0=TimeCurrent()-minutes_before*PeriodSeconds(PERIOD_M1);
   datetime time_before_1=TimeCurrent()-2*minutes_before*PeriodSeconds(PERIOD_M1);
   //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
   int shift_0=GetBarShift(symbol_name,timeframe,time_before_0);
   int shift_1=GetBarShift(symbol_name,timeframe,time_before_1);
   //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
   double prev_rsi_value_0=GetLastDataRSI(symbol_name,timeframe,shift_0);
   double prev_rsi_value_1=GetLastDataRSI(symbol_name,timeframe,shift_1);
   //--- значения цен закрытия баров 1х и 2х минут назад
   double prev_close_0=GetPriceClose(symbol_name,timeframe,shift_0);
   double prev_close_1=GetPriceClose(symbol_name,timeframe,shift_1);
   //--- отладочные сообщения
   string tf=EnumToString(TimeframeRSI);
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   Comment(
          "\nВремя проверки RSI: ",TimeCurrent(),", минуты времени проверки: ",server_time.min,
          "\nВремя ",minutes_before," минут назад: ",time_before_0,", бар ",tf," : ",shift_0,
          "\nВремя ",minutes_before*2," минут назад: ",time_before_1,", бар ",tf," : ",shift_1,
          "\nЗначение RSI ",minutes_before," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_0,4),
          "\nЗначение RSI ",minutes_before*2," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_1,4),
          //---
          "\nЗначение Close ",minutes_before," минут назад > ",tf," : ",DoubleToString(prev_close_0,Digits()),
          "\nЗначение Close ",minutes_before*2," минут назад > ",tf," : ",DoubleToString(prev_close_1,Digits())
          );
   //--- проверка наличия данных RSI
   if(prev_rsi_value_1>0 && prev_rsi_value_0>0) {
      //--- проверка условия на продажу
      if(prev_rsi_value_1<upper_lev_rsi && prev_rsi_value_0>upper_lev_rsi) {
         if(prev_close_0>SymbolInfoDouble(symbol_name,SYMBOL_BID)) return(OP_SELL);
         }
      //--- проверка условия на покупку
      if(prev_rsi_value_1>lower_lev_rsi && prev_rsi_value_0<lower_lev_rsi) {
         if(prev_close_0<SymbolInfoDouble(symbol_name,SYMBOL_ASK)) return(OP_BUY);
         }
      }
   return(-1);
}
//+------------------------------------------------------------------+
 
Vitaly Muzichenko:

Compagni, non ho mai fatto un montaggio della storia, quindi non conosco le complessità della lettura del grafico dopo l'ottimizzazione.

C'è un tale grafico dopo il pass annuale 2014-2015, dove guardare e cosa significa? Interessato al colore e alla posizione dei cubi, perché alcuni sono al centro, altri sotto/sopra, e due/tre nello stesso quadrato?

Grazie per il chiarimento!

Nemmeno io mi sono mai fidato degli ottimizzatori in tanti anni - penso che sia una misura. Ma è un po' come se più ricco è il colore, meglio è. E anche - più blocchi con colori saturi, meglio è. Ma cosa fare dopo con questo casino - non riesco a pensare. Ho sempre cercato di costruire sistemi adattivi, e non con una stupida selezione di valori per la storia di un tester.

Forse c'è qualcuno che può spiegarci tutto questo

 
Artyom Trishkin:

Nemmeno io mi sono mai fidato degli ottimizzatori in tanti anni - li considero degli armeggiatori. Ma più il colore è saturo, meglio è. E anche - più blocchi con colori saturi, meglio è. Ma cosa fare dopo con questo casino - non riesco a pensare. Ho sempre cercato di costruire sistemi adattivi, e non con una stupida selezione di valori per la storia di un tester.

Forse c'è qualcuno che può spiegarci tutto questo

Molto probabilmente nessuno lo farà. Ci sono 10-12 persone rimaste sul forum, alcune di loro sono state bannate e molte di loro non torneranno. Ora, se guardate il forum, appaiono circa 5-7 persone, la metà delle quali non risponde alle domande. La mia domanda sul programma rimane senza risposta.
 
Vitaly Muzichenko:
È probabile che nessuno lo spieghi. Ci sono 10-12 persone rimaste sul forum, alcune di loro sono state bandite e molte di loro non torneranno. Ora se guardate il forum, ci sono circa 5-7 persone, la metà delle quali non risponde alle domande. La mia domanda sul programma non ha avuto risposta.
Devi guardare sul quarto forum - ho visto una spiegazione dell'ottimizzatore lì una volta molto tempo fa, ma non ricordo di cosa si trattasse o dove fosse...
 
Artyom Trishkin:
Devi guardare sul quarto forum - ho visto una spiegazione dell'ottimizzatore lì qualche tempo fa, ma non ricordo bene di cosa si tratta e dove si trova...
Eccolo, solo che non corrisponde a quello che ho ottenuto durante i test, ecco perché ho fatto una domanda agli intenditori.
 

Salve.

Potete dirmi perché è impossibile selezionare una data dal calendario a discesa se lo faccio nelle impostazioni esterne:
extern datetime CloseTime        = D'2016.09.11 15:50';  //

C'è un modo per cambiare in modo da poter selezionare una data invece di digitarla dalla tastiera?

 
Vitaly Muzichenko:

Compagni, non ho mai fatto un montaggio della storia, quindi non conosco le complessità della lettura del grafico dopo l'ottimizzazione.

C'è un tale grafico dopo il pass annuale 2014-2015, dove guardare e cosa significa? Interessato al colore e alla posizione dei cubi, perché alcuni sono al centro, altri più in basso/alto, e due/tre nella stessa piazza?

Grazie per il chiarimento!

Vitaly Muzichenko:
Sì, molto probabilmente nessuno lo spiegherà. Ci sono solo 10-12 persone rimaste sul forum, alcune di loro sono state bandite, e molte non sono più tornate. Ora, se guardate il forum, appaiono circa 5-7 persone, la metà delle quali non risponde alle domande. La mia domanda sul programma è rimasta senza risposta.

Non c'è molto da spiegare e nessuno risponde. Il grafico che avete mostrato non ha senso e come sia stato ottenuto è un mistero.

E l'opzione "Superficie bidimensionale" nella scheda "Grafico di ottimizzazione" del tester ha senso (imho) quando vogliamo ottimizzare 2 parametri di input di un EA o per vedere chiaramente, a quali valori di 2 parametri i risultati erano buoni sulla storia e se questi parametri sono interdipendenti, e se hanno senso a tutti.

Ecco un esempio di ottimizzazione di 2 parametri di input (forse non il migliore, ma non riesco a trovare un esempio migliore al momento):


L'asse orizzontale è il valore del 1° parametro in 16 incrementi, e l'asse verticale è il valore del 2° parametro, anch'esso in 16 incrementi. Più scuro è il quadrato verde, maggiore è stato il profitto (se l'ottimizzazione per profitto) ai valori corrispondenti dei parametri, più pallido è meno. Il miglior risultato (per il profitto della storia) è stato al centro. Il "mucchio" verde scuro sembra essere intorno ad esso che suggerisce una certa dipendenza e regolarità tra questi 2 parametri e i parametri non sono senza senso, mentre il risultato di ottimizzazione non è casuale. Quindi vale la pena prestare attenzione ai valori di questi 2x parametri dal miglior risultato (al centro).

In generale, tutto è molto semplice. Per quanto riguarda l'uso, beh, è una questione di immaginazione. Non guardo questi quadrati verdi per molto tempo ))

Il tuo grafico ha solo 0 su entrambi gli assi per qualche motivo, e verticalmente questi 0 sono anche divisi in 3 passi intermedi, da cui i "cubi uno al centro, due sotto/sopra, e due/tre nello stesso quadrato". E i risultati sembrano casuali - i "cubi" bianchi e verdi sono sparsi a caso. Quindi il grafico non ha senso e non sembra significare nulla.

 
Salve.
Sto scrivendo la mia dll per lavorare con il database sqlite3 da indicatore. L'ambiente di sviluppo codeblockes funziona, ma non correttamente e occasionalmente si blocca con una violazione di accesso.
Domande iniziali:
1. È possibile costruire correttamente le DLL nei codeblock o solo in Visual Studio? Esempi semplici (lavorare con Int, double) sono costruiti e funzionano. Le pile e il lavoro con i file non lo fanno - il programma si blocca.
2. Non ho potuto avviare e lavorare con __stdcall, solo con __cdecl. Nomi di funzione distorti, e il file def nei codeblock non funziona normalmente.
Cerco aiuto da utenti esperti.
Se c'è già un argomento, si prega di chiedere all'Admin di postarlo nel ramo appropriato.
 
mila.com:

Salve.

Potete dirmi perché è impossibile selezionare una data dal calendario a discesa se lo faccio nelle impostazioni esterne:
extern datetime CloseTime        = D'2016.09.11 15:50';  //

C'è un modo per cambiare in modo che la data possa essere selezionata invece di inserirla dalla tastiera?

input datetime CloseTime        = D'2016.09.11 15:50';
Motivazione: