Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 6

 

Kameraden, ich habe noch nie eine Anpassung der Geschichte vorgenommen, daher kenne ich die Feinheiten des Lesens der Grafik nach der Optimierung nicht.

Es gibt eine solche Grafik nach dem Jahrespass 2014-2015, wo ist sie zu finden und was bedeutet sie? Interessieren Sie sich für die Farbe und die Lage der Würfel, warum sind einige in der Mitte, andere unten/oben und zwei/drei im selben Quadrat?

Danke für die Klarstellung!

 
strongflex:
Im Testgerät wird der Handel nicht geöffnet. Was könnte hier das Problem sein?)

Na ja... Zunächst versuchen Sie, einen Verkauf zum Ask-Kurs zu eröffnen. Sie eröffnen einen Verkauf bei Bid und einen Kauf bei Ask.

Ich habe die RSI-Datensuche und ihren Pegelübergang in eine Funktion eingebaut. Es gibt auch eine Preiskontrolle. Es gibt Signale zurück: zu kaufen, zu verkaufen oder nichts (-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:

Kameraden, ich habe noch nie eine Anpassung der Geschichte vorgenommen, daher kenne ich die Feinheiten des Lesens der Grafik nach der Optimierung nicht.

Es gibt eine solche Grafik nach dem Jahrespass 2014-2015, wo ist sie zu finden und was bedeutet sie? Interessieren Sie sich für die Farbe und die Lage der Würfel, warum sind einige in der Mitte, andere unten/oben und zwei/drei im selben Quadrat?

Danke für die Klarstellung!

Ich habe in so vielen Jahren auch noch nie Optimierern vertraut - ich denke, es passt. Aber je kräftiger die Farbe, desto besser. Und außerdem: Je mehr Blöcke mit gesättigten Farben, desto besser. Aber wie es mit diesem Schlamassel weitergehen soll - ich kann nicht denken. Ich habe immer versucht, adaptive Systeme zu bauen, und nicht mit einer stupiden Auswahl von Werten für die Geschichte eines Testers.

Vielleicht gibt es jemanden, der uns das alles erklären kann

 
Artyom Trishkin:

Ich habe in all den Jahren auch nie den Optimierern vertraut - ich halte sie für Pfuscher. Aber je gesättigter die Farbe, desto besser. Und außerdem: Je mehr Blöcke mit gesättigten Farben, desto besser. Aber wie es mit diesem Schlamassel weitergehen soll - ich kann nicht denken. Ich habe immer versucht, adaptive Systeme zu bauen, und nicht mit einer stupiden Auswahl von Werten für die Geschichte eines Testers.

Vielleicht gibt es jemanden, der uns das alles erklären kann

Höchstwahrscheinlich wird das niemand tun. Es gibt noch 10-12 Leute im Forum, einige von ihnen wurden verbannt und viele von ihnen werden nicht mehr zurückkommen. Wenn man sich jetzt das Forum ansieht, erscheinen etwa 5-7 Personen, von denen die Hälfte keine Fragen beantwortet. Meine Frage nach dem Zeitplan bleibt unbeantwortet.
 
Vitaly Muzichenko:
Ja, es ist wahrscheinlich, dass niemand das erklären wird. Es gibt noch 10-12 Leute im Forum, einige von ihnen wurden verbannt und viele von ihnen werden nicht mehr zurückkommen. Wenn man sich das Forum ansieht, gibt es etwa 5-7 Leute, von denen die Hälfte keine Fragen beantwortet. Meine Frage nach dem Zeitplan ist nicht beantwortet worden.
Sie müssen im vierten Forum nachsehen - ich habe dort vor langer Zeit einmal eine Erklärung des Optimierers gesehen, aber ich weiß nicht mehr, worum es ging oder wo sie stand...
 
Artyom Trishkin:
Sie müssen im vierten Forum nachsehen - ich habe dort vor einiger Zeit eine Erklärung des Optimierers gesehen, aber ich weiß nicht mehr genau, worum es geht und wo sie steht...
Hier ist es, nur stimmt es nicht mit dem überein, was ich beim Testen bekommen habe, deshalb habe ich eine Frage an die Kenner gestellt.
 

Hallo.

Können Sie mir bitte sagen, warum es nicht möglich ist, ein Datum aus dem Dropdown-Kalender auszuwählen, wenn ich dies in den externen Einstellungen tue?
extern datetime CloseTime        = D'2016.09.11 15:50';  //

Kann man das ändern, so dass man ein Datum auswählen kann, anstatt es über die Tastatur einzugeben?

 
Vitaly Muzichenko:

Kameraden, ich habe noch nie eine Anpassung der Geschichte vorgenommen, daher kenne ich die Feinheiten des Lesens der Grafik nach der Optimierung nicht.

Es gibt eine solche Grafik nach dem Jahrespass 2014-2015, wo ist sie zu finden und was bedeutet sie? Interessieren Sie sich für die Farbe und die Lage der Würfel, warum sind einige in der Mitte, andere unten/oben und zwei/drei im selben Quadrat?

Danke für die Klarstellung!

Vitaly Muzichenko:
Ja, höchstwahrscheinlich wird es niemand erklären. Es gibt nur noch 10-12 Leute im Forum, einige von ihnen wurden gesperrt, und viele sind nie wieder zurückgekommen. Wenn man sich das Forum anschaut, erscheinen etwa 5-7 Personen, von denen die Hälfte keine Fragen beantwortet. Meine Frage nach dem Zeitplan blieb unbeantwortet.

Es gibt nicht viel zu erklären und niemand antwortet. Das von Ihnen gezeigte Schaubild ist nichtssagend, und wie es zustande gekommen ist, ist ein Rätsel.

Und die Option "Zweidimensionale Oberfläche" in der Registerkarte "Optimierungsgrafik" des Testers macht (imho) Sinn, wenn wir 2 Eingangsparameter eines EAs optimieren wollen oder klar sehen wollen, bei welchen Werten von 2 Parametern die Ergebnisse in der Historie gut waren und ob diese Parameter voneinander abhängig sind und ob sie überhaupt Sinn machen.

Hier ist ein Beispiel für die Optimierung von 2 Eingabeparametern (vielleicht nicht das beste, aber ich kann im Moment kein besseres Beispiel finden):


Die horizontale Achse ist der Wert des ersten Parameters in 16er-Schritten, die vertikale Achse ist der Wert des zweiten Parameters, ebenfalls in 16er-Schritten. Je dunkler das grüne Quadrat, desto größer war der Gewinn (bei Optimierung nach Gewinn) bei den entsprechenden Werten der Parameter, je blasser, desto geringer. Das beste Ergebnis (nach historischem Gewinn) wurde in der Mitte erzielt. Der dunkelgrüne "Haufen" um ihn herum deutet auf eine gewisse Abhängigkeit und Regelmäßigkeit zwischen diesen beiden Parametern hin, und die Parameter sind nicht bedeutungslos, während das Optimierungsergebnis nicht zufällig ist. Es lohnt sich also, die Werte dieser beiden Parameter vom besten Ergebnis (in der Mitte) abzuziehen.

Im Allgemeinen ist alles sehr einfach. Wie man sie einsetzt, ist eine Frage der Fantasie. Ich sehe mir diese grünen Quadrate schon lange nicht mehr an ))

Ihr Diagramm hat aus irgendeinem Grund nur 0 auf beiden Achsen, und vertikal sind diese 0's auch in 3 Zwischenschritte unterteilt, daher die "Würfel eins in der Mitte, zwei darunter/oben, und zwei/drei im selben Quadrat". Und die Ergebnisse sehen zufällig aus - weiße und grüne "Würfel" sind zufällig verstreut. Das Diagramm ist also bedeutungslos und scheint nichts zu bedeuten.

 
Hallo.
Ich schreibe meine eigene DLL, um mit sqlite3-Datenbank von Indikator zu arbeiten. Die Codeblockes-Entwicklungsumgebung funktioniert, aber nicht korrekt und stürzt gelegentlich mit einer Zugriffsverletzung ab.
Erste Fragen:
1. Ist es möglich, DLLs in Codeblöcken überhaupt korrekt zu erstellen oder nur in Visual Studio? Einfache Beispiele (Arbeit mit Int, double) sind aufgebaut und funktionieren. Stapeln und Arbeiten mit Dateien funktioniert nicht - das Programm stürzt ab.
2. ich konnte nicht mit __stdcall starten und arbeiten, nur mit __cdecl. Verzerrte Funktionsnamen, und def-Datei in Codeblöcken funktioniert nicht normal.
Ich bitte um Hilfe von sachkundigen Benutzern.
Wenn es bereits ein Thema gibt, bitten Sie den Administrator, es im entsprechenden Zweig zu veröffentlichen.
 
mila.com:

Hallo.

Können Sie mir bitte sagen, warum es nicht möglich ist, ein Datum aus dem Dropdown-Kalender auszuwählen, wenn ich dies in den externen Einstellungen tue?
extern datetime CloseTime        = D'2016.09.11 15:50';  //

Gibt es eine Möglichkeit, das Datum so zu ändern, dass es ausgewählt werden kann, anstatt es über die Tastatur einzugeben?

input datetime CloseTime        = D'2016.09.11 15:50';
Grund der Beschwerde: