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

 
Vitaly Muzichenko:

Hier ist die überarbeitete Version, das Original ist einfach nur düster.

P.S. Dot.mq4 - vollständig im Original

Entschuldigung für die lange Zeit, ich war mit der Arbeit beschäftigt.

Hier ist es:

//+------------------------------------------------------------------+
//|                                                      VMTest1.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_plots   3
//--- plot ARR
#property indicator_label1  "MaOSC"
#property indicator_type1   DRAW_COLOR_ARROW
#property indicator_color1  clrLimeGreen,clrOrangeRed,clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot ArrUP
#property indicator_label2  "Up"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot ArrDN
#property indicator_label3  "Down"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrCrimson
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//---
#include <MovingAverages.mqh>

//--- input parameters
input uint     InpA=40;
//--- indicator buffers
double         BufferMAOSC[];
double         BufferColorsARR[];
double         BufferArrUP[];
double         BufferArrDN[];
double         BufferMAV[];
double         BufferMAA[];
double         BufferTMP[];
//--- gv
int a=0;
int per=0;
int val=0;
int handle_mav=INVALID_HANDLE;
int handle_maa=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAOSC,INDICATOR_DATA);
   SetIndexBuffer(1,BufferColorsARR,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,BufferArrUP,INDICATOR_DATA);
   SetIndexBuffer(3,BufferArrDN,INDICATOR_DATA);
   SetIndexBuffer(4,BufferMAV,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,BufferMAA,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,BufferTMP,INDICATOR_CALCULATIONS);
   
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,225);
   PlotIndexSetInteger(2,PLOT_ARROW,226);
//---
   ArraySetAsSeries(BufferMAOSC,true);
   ArraySetAsSeries(BufferColorsARR,true);
   ArraySetAsSeries(BufferArrUP,true);
   ArraySetAsSeries(BufferArrDN,true);
   ArraySetAsSeries(BufferMAV,true);
   ArraySetAsSeries(BufferMAA,true);
   ArraySetAsSeries(BufferTMP,true);
//---
   a=(InpA<4 ? 4 : InpA);
   per=(int)floor(sqrt(a));
   val=(int)floor(a/1.9);
//---
   handle_mav=iMA(NULL,PERIOD_CURRENT,val,0,MODE_SMA,PRICE_LOW);
   if(handle_mav==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",val,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
   handle_maa=iMA(NULL,PERIOD_CURRENT,a,0,MODE_SMA,PRICE_LOW);
   if(handle_maa==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",a,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferMAOSC,EMPTY_VALUE);
      ArrayInitialize(BufferColorsARR,2);
      ArrayInitialize(BufferArrUP,EMPTY_VALUE);
      ArrayInitialize(BufferArrDN,EMPTY_VALUE);
      ArrayInitialize(BufferMAV,0);
      ArrayInitialize(BufferMAA,0);
      ArrayInitialize(BufferTMP,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_mav,0,0,count,BufferMAV);
   if(copied!=count) return 0;
   copied=CopyBuffer(handle_maa,0,0,count,BufferMAA);
   if(copied!=count) return 0;

//--- Предварительный расчёт
   for(int i=limit;i>WRONG_VALUE;i--)
      BufferTMP[i]=2.0*BufferMAV[i]-BufferMAA[i];
      
//--- Расчёт индикатора
   if(SimpleMAOnBuffer(rates_total,prev_calculated,a,per,BufferTMP,BufferMAOSC)==0)
      return 0;
   for(int i=limit;i>WRONG_VALUE;i--)
     {
      BufferArrUP[i]=EMPTY_VALUE;
      BufferArrDN[i]=EMPTY_VALUE;
      BufferColorsARR[i]=(BufferMAOSC[i]>BufferMAOSC[i+1] ? 0 : BufferMAOSC[i]<BufferMAOSC[i+1] ? 1 : 2);
      if((BufferColorsARR[i]==0 && BufferColorsARR[i+1]==1) || (BufferColorsARR[i]==0 && BufferColorsARR[i+1]==2))
         BufferArrUP[i]=BufferMAOSC[i];
      if((BufferColorsARR[i]==1 && BufferColorsARR[i+1]==0) || (BufferColorsARR[i]==1 && BufferColorsARR[i+1]==2))
         BufferArrDN[i]=BufferMAOSC[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

Ich verstehe diese Idee, sie ist nützlich, aber in diesem Fall funktioniert sie für mich nicht. Ich muss die Zeit des Testers messen : Stopptaste in der Anzeige gedrückt

es ist nicht sicher, dass nach dem Drücken der Taste die Ausdrucke in das Protokoll geschrieben werden

Versuchen Sie also, für jeden neuen Balken in der Datei alle Funktionen der Arbeit mit der Umgebung zu schreiben - Verbot des Handels, Testen, Beenden des Programms.....https://docs.mql4.com/ru/check

wenn keine Hilfe, können Sie nicht, dann suchen Sie etwas mit Hilfe von WinAPI

HH: eine Schaltfläche erstellen und anklicken - drücken, alle Aktionen ausführen und dann den Visualizer den Lauf im Leerlauf beenden lassen, imho schneller als die Suche

 
Igor Makanu:

es ist nicht sicher, dass nach dem Drücken der Taste Ausdrucke in das Protokoll geschrieben werden

Versuchen Sie also, in die Datei für jeden neuen Balken alle Funktionen für die Arbeit mit der Umgebung zu schreiben - Verbot des Handels, Testen, Beenden des Programms.....

Wenn es nicht hilft, dann können Sie nicht, dann suchen Sie etwas mit Hilfe von WinAPI

HH: Machen Sie einen Knopf und drücken Sie ihn - drücken Sie ihn, führen Sie alle Aktionen aus, und lassen Sie den Visualizer den Lauf im Leerlauf beenden, imho schneller als die Suche nach

Druckstopptaste im Testermagazin: Stopptaste gedrückt

Aber ich habe es nicht in den Unterlagen gefunden. Für den Expert Advisor wird der Stop durch OnDynit aufgerufen, für den Indikator nur der Druck im Journal. Der Indikator hört auf zu testen und das war's. Es gibt tatsächlich eine Pause. Sie wird jedoch nicht in der Zeitschrift abgedruckt.

Hinweis

Im Allgemeinen ist es nicht schwer, den Indikator zu löschen oder das Fenster manuell zu schließen. Aber die Frage ist interessant. Es ist wie der Zugriff auf Echtzeit durch eine Anfrage an ein Symbol eines Drittanbieters) Es soll irgendwie das Ende des Tests mit der Stopptaste verfolgen).

 
Valeriy Yastremskiy:

Druck der Stopptaste im Testermagazin: Stopptaste gedrückt

Aber ich habe es nicht in den Unterlagen gefunden. Für den Expert Advisor wird der Stop durch OnDeinit aufgerufen, für den Indikator nur der Druck im Journal. Der Indikator hat den Test beendet und das war's. Es gibt tatsächlich eine Pause. Sie wird jedoch nicht in der Zeitschrift abgedruckt.

Hinweis

Im Allgemeinen ist es nicht schwer, den Indikator zu löschen oder das Fenster manuell zu schließen. Aber die Frage ist interessant. Es ist wie der Zugang zur Echtzeit durch eine Anfrage an ein Symbol eines Drittanbieters) Es scheint, dass es irgendwie das Ende der Testtaste stop) verfolgen sollte.

Ich weiß es nicht

Suche im Forum IsTesting() - fand ähnliche Diskussionen

ZZY: Ich denke, das Protokoll druckt das Terminal aus, aber ich brauche den MQL-Code, um es zu tun

ZZZY: EA schreiben, imho ist die Visualisierung des Indikators mühsam ))))

 
Artyom Trishkin:

Es tut mir leid, dass es so lange gedauert hat - ich war mit der Arbeit beschäftigt.

Hier ist es:

Die Veränderungen sind drastisch, aber das ist nicht der Punkt.

Ich werde mich mit iMAOnArray befassen, das war das Ziel

Ich danke Ihnen!

 
Vitaly Muzichenko:

Die Veränderungen sind dramatisch, aber das ist nicht der Punkt.

Ich werde mich mit iMAOnArray beschäftigen, das war das Ziel

Ich danke Ihnen!

Es ist nur so, dass hier alles genau dasselbe ist wie dort. Aber in MQL5 ist es so einfach.

 

Hallo. Warum beim Löschen einer Konstante, die nicht inObjectCreate() beschrieben ist;

Zum Beispiel, z_order oder hidden? Wird es nach der Kompilierung einen Fehler verursachen? Sie beteiligen sich nicht an der Festlegung der Grenzen.

bool VLineCreate(const long            chart_ID=0,        // ID графика 
                 const string          name="VLine",      // имя линии 
                 const int             sub_window=0,      // номер подокна 
                 datetime              time=0,            // время линии 
                 const color           clr=clrRed,        // цвет линии 
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии 
                 const int             width=1,           // толщина линии 
                 const bool            back=false,        // на заднем плане 
                 const bool            selection=true,    // выделить для перемещений 
                 const bool            ray=true,          // продолжение линии вниз 
                 const bool            hidden=true,       // скрыт в списке объектов 
                 const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- если время линии не задано, то проводим ее через последний бар 
   if(!time) 
      time=TimeCurrent(); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим вертикальную линию 
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать вертикальную линию! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
 
Дмитрий:

Hallo. Warum beim Löschen einer Konstante, die nicht inObjectCreate() beschrieben ist;

Zum Beispiel, z_order oder hidden? Wird es nach der Kompilierung einen Fehler verursachen? Sie beteiligen sich nicht an der Festlegung der Grenzen.

Wenn Sie einen der Parameter der Eingabefunktion löschen, achten Sie auf Kommas und schließende Klammern.

 
Alexey Viktorov:

Wenn Sie einen der Eingabeparameter einer Funktion löschen, achten Sie auf die Kommas und schließenden Klammern.

Alexey, ich danke dir. Ich habe vor allem auf die Zeichensetzung geachtet. Das Skript hat auf ein Minimum reduziert, links notwendig für ObjectCreate()(Ankerpunkt, symv, AND TD). Und es stellt sich heraus, dass nur im Header diese Konstanten im Code nirgends vorkommen) darauf und es stellte sich die Frage, warum beim Löschen mindestens ein Fehler auftritt. Und es stellt sich die Frage, ob es obligatorische Bedingungen mit einer Liste von Konstanten in der Kopfzeile geben kann. function header)))?
 
Dzmitry Zaitsau:
Alexey, ich danke dir. Ich habe vor allem auf die Zeichensetzung geachtet. Das Skript wurde auf ein Minimum reduziert, ich ließ das Notwendige für ObjectCreate()(Ankerpunkt, symv, AND TD). Und es stellt sich heraus, dass nur im Header diese Konstanten im Code nirgends vorkommen) und es stellte sich die Frage, warum beim Löschen mindestens ein Fehler auftritt. Und es stellt sich die Frage, ob es obligatorische Bedingungen mit einer Liste von Konstanten in der Kopfzeile geben kann. function header)))?

Wenn Sie aufschreiben könnten, welcher Fehler auftritt, wäre es leichter zu verstehen, sonst kommt es wie Telepathie raten, welchen Fehler ich habe)