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

 
Vladymyr Glushko:
Aber wie macht man das Schritt für Schritt? ..... grafische Objekte (was sind sie und wie setzt man sie ein), Datenbeschriftungen in das Diagramm einfügen (wo und mit welchen Daten) ...... Entschuldigung für die dummen Fragen.

Software.

Sie müssen einen Informationsindikator mit den von Ihnen gewünschten Daten schreiben.

 
strongflex:
Wenn der RSI das Niveau vor 20 Minuten überschritten hat, überprüfen wir den Preis, d.h. für einen Short sollte der Preis niedriger sein als vor 20 Minuten. Ich danke Ihnen vielmals. Wenn es funktioniert, schulde ich Ihnen ein Versprechen))

Da wir es so nah wie möglich an MQL5 erstellen, werden wir die MQL4-Funktionen zum Abrufen von Bar-Shift nach Zeit und Schlusskurs (iBarShift() bzw. iClose()) nicht verwenden.

Wir verwenden dafür unsere eigenen Funktionen: GetBarShift() und GetPriceClose(). Außerdem müssen wir die Taktzeit mit der Funktion GetTime() anstelle von iTime() ermitteln, da wir Standard-MQL4-Funktionen ablehnen.

Hier ist ein Test Expert Advisor:

//+------------------------------------------------------------------+
//|                                               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                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore;    // Количество минут назад
int      periodRSI;        // Период расчёта 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);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int shift_0;
   int shift_1;
   //---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   string tf=EnumToString(TimeframeRSI);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      //--- время 1x и 2x минут назад
      timeBefore=TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1);
      timePrevBefore=TimeCurrent()-2*minutesBefore*PeriodSeconds(PERIOD_M1);
      //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
      shift_0=GetBarShift(Symbol(),TimeframeRSI,timeBefore);
      shift_1=GetBarShift(Symbol(),TimeframeRSI,timePrevBefore);
      //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
      prevRSIvalue0=GetLastDataRSI(Symbol(),TimeframeRSI,shift_0);
      prevRSIvalue1=GetLastDataRSI(Symbol(),TimeframeRSI,shift_1);
      //--- значения цен закрытия баров 1х и 2х минут назад
      prevClose_0=GetPriceClose(Symbol(),TimeframeRSI,shift_0);
      prevClose_1=GetPriceClose(Symbol(),TimeframeRSI,shift_1);
      }
   Comment("\nТекущее время: ",TimeCurrent(),
          "\nВремя ",minutesBefore," минут назад: ",TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1),
          "\nБар ",tf,"_0=",shift_0,", бар ",tf,"_1=",shift_1,
          "\nМинуты текущего времени: ",server_time.min,
          "\nЗначение RSI ",minutesBefore," минут назад на ",tf," : ",DoubleToString(prevRSIvalue0,4),
          "\nЗначение RSI ",minutesBefore*2," минут назад на ",tf," : ",DoubleToString(prevRSIvalue1,4),
          //---
          "\nЗначение Close ",minutesBefore," минут назад > ",tf," : ",DoubleToString(prevClose_0,Digits()),
          "\nЗначение Close ",minutesBefore*2," минут назад > ",tf," : ",DoubleToString(prevClose_1,Digits())
          );
  }
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+

Jetzt müssen wir eine separate Funktion erstellen, die die RSI-Daten für den gewünschten Zeitraum empfängt und die Preise und RSI-Werte vergleicht

 
Artyom Trishkin:

Da wir es so nah wie möglich an MQL5 erstellen, werden wir die MQL4-Funktionen zum Abrufen von Bar-Shift nach Zeit und Schlusskurs (iBarShift() bzw. iClose()) nicht verwenden.

Wir verwenden dafür unsere eigenen Funktionen: GetBarShift() und GetPriceClose(). Außerdem müssen wir die Taktzeit mit der Funktion GetTime() anstelle von iTime() ermitteln, da wir die Standard-MQL4-Funktionen ablehnen.

Hier ist ein Test Expert Advisor:

//+------------------------------------------------------------------+
//|                                               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                  MinutesBefore  =20;           // Количество минут назад
//--- global variables
int      minutesBefore;    // Количество минут назад
int      periodRSI;        // Период расчёта 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);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int shift_0;
   int shift_1;
   //---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   string tf=EnumToString(TimeframeRSI);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      //--- время 1x и 2x минут назад
      timeBefore=TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1);
      timePrevBefore=TimeCurrent()-2*minutesBefore*PeriodSeconds(PERIOD_M1);
      //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
      shift_0=GetBarShift(Symbol(),TimeframeRSI,timeBefore);
      shift_1=GetBarShift(Symbol(),TimeframeRSI,timePrevBefore);
      //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
      prevRSIvalue0=GetLastDataRSI(Symbol(),TimeframeRSI,shift_0);
      prevRSIvalue1=GetLastDataRSI(Symbol(),TimeframeRSI,shift_1);
      //--- значения цен закрытия баров 1х и 2х минут назад
      prevClose_0=GetPriceClose(Symbol(),TimeframeRSI,shift_0);
      prevClose_1=GetPriceClose(Symbol(),TimeframeRSI,shift_1);
      }
   Comment("\nТекущее время: ",TimeCurrent(),
          "\nВремя ",minutesBefore," минут назад: ",TimeCurrent()-minutesBefore*PeriodSeconds(PERIOD_M1),
          "\nБар ",tf,"_0=",shift_0,", бар ",tf,"_1=",shift_1,
          "\nМинуты текущего времени: ",server_time.min,
          "\nЗначение RSI ",minutesBefore," минут назад на ",tf," : ",DoubleToString(prevRSIvalue0,4),
          "\nЗначение RSI ",minutesBefore*2," минут назад на ",tf," : ",DoubleToString(prevRSIvalue1,4),
          //---
          "\nЗначение Close ",minutesBefore," минут назад > ",tf," : ",DoubleToString(prevClose_0,Digits()),
          "\nЗначение Close ",minutesBefore*2," минут назад > ",tf," : ",DoubleToString(prevClose_1,Digits())
          );
  }
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+

Jetzt müssen wir eine separate Funktion erstellen, um Daten für den RSI aus der gewünschten Zeit zu erhalten und die Preise und RSI-Werte zu vergleichen

Und dann so?
if (prevRSIvalue1<70 && (prevRSIvalue0>70) && (prevClose_0>Bid))

    {
    ticket=OrderSend(Symbol(),OP_SELL, 0.1, Ask, Slippage,0, 0, NULL, Magic, 0, Blue);
    return(0);
    }
 
Am Ende des zu prüfenden Codes eingefügt:
int start()
{
int ticket;

  if (OrdersTotal() == 0)
         {
         ticket=OrderSend(Symbol(),OP_SELL, 1, Bid, 0, 0, 0, NULL, 1234, 0, Red);
      
        
         }
         return(0);

}
im Testgerät wird kein Handel eröffnet. Was könnte hier das Problem sein?)
 
strongflex:
Ich habe sie zur Kontrolle an das Ende des Codes gesetzt:
int start()
{
int ticket;

  if (OrdersTotal() == 0)
         {
         ticket=OrderSend(Symbol(),OP_SELL, 1, Bid, 0, 0, 0, NULL, 1234, 0, Red);
      
        
         }
         return(0);

}
im Testgerät wird kein Handel eröffnet. Was könnte hier das Problem sein?)

Wer hindert Sie daran, den Fehlercode anzuzeigen?

 
Vitalie Postolache:

Wer hindert Sie daran, den Fehlercode anzuzeigen?

Keine Fehler im Prüfgerät
 

Liebe Forumsnutzer, ich habe eine Frage:

Ist es möglich, in einem Tick-Block

int start() {}

Erstellen Sie ein Ereignis, das bei seiner Ausführung ein Pop-up-Fenster anzeigt, in dem Sie den Wert einer Variablen manuell einstellen können.

Dies ist vergleichbar mit dem Setzen einer Variablen über Extern, nur dass dies automatisch während der Ausführung des Programms geschieht und nicht einmalig beim Start.

Ich wäre Ihnen dankbar, wenn Sie mir wenigstens sagen könnten, in welche Richtung ich graben soll.

Ich danke Ihnen!

 
pro100lexx:

Liebe Forumsnutzer, ich habe eine Frage:

Ist es möglich, in einem Tick-Block

int start() {}

Erstellen Sie ein Ereignis, das bei seiner Ausführung ein Pop-up-Fenster anzeigt, in dem Sie den Wert einer Variablen manuell einstellen können.

Dies ist vergleichbar mit dem Setzen einer Variablen über Extern, nur dass dies automatisch während der Ausführung des Programms geschieht und nicht einmalig beim Start.

Ich wäre Ihnen dankbar, wenn Sie mir wenigstens sagen könnten, in welche Richtung ich graben soll.

Ich danke Ihnen!

In kodobase gibt es so etwas bereits, mit einem Panel auf der Karte. So sieht es zum Beispiel aus.
 
pro100lexx:

Liebe Forumsmitglieder, hier ist die Frage:

Ist es möglich, in einem Tick-Block

int start() {}

Erstellen Sie ein Ereignis, das bei seiner Ausführung ein Pop-up-Fenster anzeigt, in dem Sie den Wert einer Variablen manuell einstellen können.

Dies ist vergleichbar mit dem Setzen einer Variablen mit Extern, nur dass dies automatisch während der Ausführung des Programms geschieht und nicht einmalig beim Start.

Ich wäre Ihnen dankbar, wenn Sie mir zumindest sagen könnten, in welche Richtung ich graben soll.

Ich danke Ihnen!

Graben Sie nach grafischen Objekten. Das Eingabefeld ist insbesondere OBJ_EDIT.

Hier finden Sie eine Funktion, mit der Sie diese in einem Diagramm erstellen können:

//+------------------------------------------------------------------+
void SetEditField(const long             chart_id=0,               // ID графика
                  const string           name="Edit",              // имя объекта
                  const int              sub_window=0,             // номер подокна
                  const int              x=0,                      // координата по оси X
                  const int              y=0,                      // координата по оси Y
                  const int              width=50,                 // ширина поля ввода
                  const int              height=18,                // высота поля ввода
                  const string           text="Text",              // текст
                  const string           font="Calibri",           // шрифт
                  const int              font_size=8,              // размер шрифта
                  const ENUM_ALIGN_MODE  align=ALIGN_CENTER,       // способ выравнивания
                  const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
                  const long             z_order=0,                // приоритет на нажатие мышью
                  const color            clr=clrBlack,             // цвет текста
                  const color            back_clr=clrWhite,        // цвет фона
                  const color            border_clr=clrNONE,       // цвет границы
                  const bool             back=false,               // на заднем плане
                  const bool             read_only=false,          // возможность редактировать
                  const bool             selection=false,          // выделить для перемещений
                  const bool             hidden=true)              // скрыт в списке объектов
  {
   if(ObjectFind(chart_id,name)<0) ObjectCreate(chart_id,name,OBJ_EDIT,sub_window,0,0);
   ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,height);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
   ObjectSetString(chart_id,name,OBJPROP_FONT,font);
   ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,font_size);
   ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,align);
   ObjectSetInteger(chart_id,name,OBJPROP_READONLY,read_only);
   ObjectSetInteger(chart_id,name,OBJPROP_CORNER,corner);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,back_clr);
   ObjectSetInteger(chart_id,name,OBJPROP_BORDER_COLOR,border_clr);
   ObjectSetInteger(chart_id,name,OBJPROP_BACK,back);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_id,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);
  }
//+------------------------------------------------------------------+
 
Ich danke Ihnen! Ich werde es mir ansehen.
Grund der Beschwerde: