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

 
inter78:

Ja, das habe ich, aber ich mag die lange Antwortzeit nicht.

Es ist keine lange Zeit, es ist ein Tick... aber im Allgemeinen müssen Sie die Hilfe lesen. Sie können MQL nicht durch "Bauchgefühl" lernen. MQL basiert auf C++, aber es ist an die MT-Plattform gebunden, also können Sie es nicht lernen, ohne die Hilfe zu lesen.

Sie haben Dateibehandlung und Arbeit mit globalen Variablen und Grafiken in Ihrem Code ... Bei jedem Ticken gibt es eine Menge unnötiger Operationen

Wenn Sie eine schnelle Antwort wollen, verwenden Sie OnChartEvent(), es ist nicht in der Tester generiert, aber zuerst beginnen Sie das Studium der MQL4 Hilfe.

 
Igor Makanu:

Die Operation ist nicht lang, es ist Tick für Tick ... aber im Allgemeinen, beginnen Sie die Hilfe zu lesen, können Sie nicht lernen, MQL durch "Bauchgefühl", MQL basiert auf C + +, aber es ist an die MT-Plattform gebunden, können Sie es nicht tun, ohne die Hilfe zu lesen.

Sie haben Dateibehandlung und Arbeit mit globalen Variablen und Grafiken in Ihrem Code ... Bei jedem Ticken gibt es eine Menge unnötiger Operationen

Wenn Sie eine schnelle Antwort wollen, verwenden Sie OnChartEvent(), es ist nicht in der Tester generiert, aber zuerst beginnen Sie das Studium der MQL4 Hilfe.

Ich werde wahrscheinlich Techniker bitten müssen, ihn zur Vernunft zu bringen. Ich werde dazu nicht in der Lage sein. Dieser Indikator ist sehr praktisch für die Arbeit mit einer unbegrenzten Anzahl von offenen Charts. Die Schaltflächen zeigen den aktuellen Gewinn des Symbols und die Anzahl der Kauf- und Verkaufsaufträge an.
 

Hallo zusammen.

Ich habe einen nützlichen Ind-Fractals-Indikator in der Code-Bibliothek gefunden. Allerdings zeichnet es Fraktale auf jeden Balken, anstatt sie richtig zu berechnen. Ich möchte diesen Indikator zu verwenden, aber es ist "broken" (( Helfen Sie mir, einen Fehler zu finden, habe ich versucht, den Autor zu kontaktieren, aber er reagiert nicht auf Nachrichten. Der Einfachheit halber ist der Code hier dupliziert.

#property copyright "Copyright © 2005, MetaQuotes Software Corp.

#property link "http://www.metaquotes.net"

//----

#property indicator_chart_window

#Eigenschaft indicator_buffers 8

#property indicator_color1 Rot

#Eigenschaft indicator_color2 Rot

#Eigenschaft indicator_color3 Blau

#Eigenschaft indicator_color4 Blau

#Eigenschaft indicator_color5 Kalk

#Eigenschaft indicator_color6 Kalk

#property indicator_color7 Sienna

#property indicator_color8 Sienna

//---- Eingabeparameter

extern bool Comm=true;

//---- Puffer

double ExtMapBuffer1[];

double ExtMapBuffer2[];

double ExtMapBuffer3[];

double ExtMapBuffer4[];

double ExtMapBuffer5[];

double ExtMapBuffer6[];

double ExtMapBuffer7[];

double ExtMapBuffer8[];

//+------------------------------------------------------------------+

//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |

//+------------------------------------------------------------------+

int init()

{

//---- Indikatoren

SetIndexStyle(0,DRAW_ARROW);//Der Linienstil des Indikators

SetIndexArrow(0,217); //gibt den Pfeiltyp vor

SetIndexBuffer(0,ExtMapBuffer1);//bindet denIndikatorpuffer mit einem eindimensionalen dynamischen Array vom Typ Double. Es gibt 2 Versionen der Funktion.

SetIndexEmptyValue(0,0.0);//Setzt den Leerwert für die Indikatorzeile.

SetIndexStyle(1,DRAW_ARROW);

SetIndexPfeil(1,218);

SetIndexPuffer(1,ExtMapPuffer2);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexPfeil(2,217);

SetIndexPuffer(2,ExtMapPuffer3);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexPfeil(3,218);

SetIndexBuffer(3,ExtMapBuffer4);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexPfeil(4,217);

SetIndexPuffer(4,ExtMapPuffer5);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexPfeil(5,218);

SetIndexPuffer(5,ExtMapPuffer6);

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexPfeil(6,217);

SetIndexBuffer(6,ExtMapBuffer7);

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexPfeil(7,218);

SetIndexBuffer(7,ExtMapBuffer8);

SetIndexEmptyValue(7,0.0);

return(0); }

//+------------------------------------------------------------------+

//| Funktion zur Deinitialisierung des Custor-Indikators |

//+------------------------------------------------------------------+

int deinit() {return(0); }

//------------------------------------------------------------------

bool Fractal(string F,int Per,int shift) {

if(Zeitraum()>Per) return(-1);

Per=Per/Period()*2+MathCeil(Per/Period()/2);

if(shift<Per)return(-1);

if(shift>Bars-Per)return(-1);

for(int i=1;i<=Per;i++) {

if(shift+i>=Bars || shift-i<0) return(-1);

if(F=="U") {

if(High[shift+i]>High[shift])return(-1);

if(High[shift-i]>=High[shift])return(-1); }

if(F=="L") {

if(Low[shift+i]<Low[shift])return(-1);

if(Low[shift-i]<=Low[shift])return(-1); } }

return(1); }

//------------------------------------------------------------------

int start()

{

int D1=1440,H4=240,H1=60,M15=15,B;

Doppel-P;

int counted_bars=IndicatorCounted();// Anzahl der seit dem letzten Indikatoraufruf unveränderten Balken

B=Balken-gezählt_Balken;

if(gezählte_Balken==0) B--;

if(Zeitraum()==D1)P=150*Punkt;// Zeitraum gibt die aktuelle Diagrammperiode zurück

if(Zeitraum()==H4)P=70*Punkt;

if(Zeitraum()==H1)P=40*Punkt;

if(Period()==30)P=30*Point;

if(Zeitraum()==M15)P=20*Punkt;

if(Zeitraum()==5)P=10*Punkt;

if(Zeitraum()==1)P=5*Punkt;

for(int shift=B;shift>0;shift--)

{

if(Fractal("U",M15,shift)==1) ExtMapBuffer1[shift]=High[shift]+P;

sonst ExtMapBuffer1[shift]=0;

if(Fractal("L",M15,shift)==1) ExtMapBuffer2[shift]=Low[shift]-P;

sonst ExtMapBuffer2[shift]=0;

if(Fractal("U",H1,shift)==1) ExtMapBuffer3[shift]=High[shift]+P;

sonst ExtMapBuffer3[shift]=0;

if(Fractal("L",H1,shift)==1) ExtMapBuffer4[shift]=Low[shift]-P;

sonst ExtMapBuffer4[shift]=0;

if(Fractal("U",H4,shift)==1) ExtMapBuffer5[shift]=High[shift]+P;

sonst ExtMapBuffer5[shift]=0;

if(Fractal("L",H4,shift)==1) ExtMapBuffer6[shift]=Low[shift]-P;

sonst ExtMapBuffer6[shift]=0;

if(Fractal("U",D1,shift)==1) ExtMapBuffer7[shift]=High[shift]+P;

sonst ExtMapBuffer7[shift]=0;

if(Fractal("L",D1,shift)==1) ExtMapBuffer8[shift]=Low[shift]-P;

sonst ExtMapBuffer8[shift]=0;

}

if(Comm) Comment("D1 - braun\n H4 - grün\n H1 - blau\nM15 - rot");


zurück(0);

}

MetaQuotes Software Corp.
MetaQuotes Software Corp.
  • www.metaquotes.net
Миллионы трейдеров и сотни брокеров не могут ошибаться — они выбрали MetaTrader 5 для торговли на Форексе и финансовых рынках! Узнать больше
 

Ich bin hier für diese Art von Code gescholten worden, es ist das erste Mal, dass ich ihn habe :-)

Der Code sollte in ein Formular eingefügt werden, das mit Alt+S geöffnet wird.

 
psyman:

Ich bin hier für diese Art von Code gescholten worden, es ist das erste Mal, dass ich ihn habe :-)

Sie müssen den Code in ein Formular einfügen, das sich bei Alt+S öffnet.

Werden Sie gescholten? Nein, in keiner Weise. Schreiben Sie den Code, wie Sie wollen. Aber... wenn Sie eine Antwort auf Ihre Frage wollen, versuchen Sie, denjenigen, den Sie um Hilfe bitten, zu respektieren. So einfach ist das.

 

Forum für Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen für Neulinge auf MQL4, Hilfe und Diskussion über Algorithmen und Codes

Artyom Trishkin, 2018.10.18 08:07

Sagen wir es mal so: Erstellen Sie eine Indikatorvorlage im Editor, fügen Sie die richtige Anzahl von Eingabevariablen und Zeichenpuffern hinzu, wenn Sie sie erstellen.

Als Nächstes wollen wir analysieren, was bei der konkreten Aufgabe zu tun ist.

Das habe ich beim letzten Mal gemacht, nur den Namen der Variablen und des Arrays geändert.

Wenn Sie iMA verwenden, funktioniert es nur auf Wochen und Tage, wo die Kerze mehr als 100 Punkte enthält, es tut nichts auf niedrigeren Zeitrahmen. Der Grund dafür scheint die Rundung zu sein.




Wenn iMAOnArray verwendet wird, ist das i-ras-Fenster bei allen TFs leer. Das Protokoll enthält keine Fehler.




//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "O-C"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrSteelBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         ip1Buf[];

input int ip1=100;
double tmp1[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  
IndicatorBuffers(2);
string s_name1;

s_name1="O-C (" + IntegerToString(ip1) + ")";

IndicatorShortName(s_name1);
SetIndexLabel(0, s_name1);
SetIndexBuffer(1, tmp1);


//--- indicator buffers mapping
   SetIndexBuffer(0,ip1Buf);
   
//---
   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 i;

      Print("rates_total = ",rates_total);
      for(i=1; i<rates_total-1; i++)
      {
      //Print("i = ",i);
      tmp1[i]=MathMax(open[i],close[i])-MathMin(open[i],close[i]);      
     // tmp1[i]=close[i];      
      //ip1Buf[i]=iMA(NULL,0,1,0,0,tmp1[i],0);
      ip1Buf[i]=iMAOnArray(tmp1,1,1,0,0,0);
      
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
psyman:

Wenn iMAOnArray verwendet wird, ist das i-ra-Fenster bei allen TFs leer. Das Protokoll enthält keine Fehler.

Sie verwenden iMAOnArray() mit der Periode 1, d.h. der Wert von iMAOnArray() ist im Wesentlichen der Wert des Arrays tmp1

Wenn Sie sehen wollen, was Sie berechnen, machen Sie die Schleife kürzerfor(i=1; i<10; i++)

und alle Daten, die Sie berechnen wollen, ausdrucken, obwohl es vielleicht einfacher ist, keine komplexe Formel zu berechnen, sondern iMAOnArray() zu verwenden, um iMA und iMAOnArray() zu erstellen - sowohl iMA als auch iMAOnArray() sind dieselbe Berechnung.... Wenn Sie in diesem Forum eine Antwort auf eine technische Frage erhalten, sollten Sie allein lernen, mit den Informationen zu rechnen und umzugehen.

 
psyman:

Das letzte Mal, als ich dies tat, änderte ich nur den Namen der Variablen und des Arrays.

Wenn iMA i-r nur an Wochen und Tagen arbeitet, an denen mehr als 100 Punkte in einer Kerze sind, zeichnet es nichts auf niedrigeren TFs. Der Grund dafür scheint die Rundung zu sein.




Wenn iMAOnArray verwendet wird, ist das i-ras-Fenster bei allen TFs leer. Das Protokoll enthält keine Fehler.





Im ersten Zyklus werden die Werte des ersten Puffers berechnet;

Der zweite Zyklus berechnet die MA anhand der im ersten Zyklus berechneten Werte.

Überlegen Sie, was iMAOnArray() bedeutet. MA auf Array schreiben. Wie kann man das übersetzen? Jeder hat einen Google-Übersetzer zur Hand. Setzen-übersetzen-empfangen: MA auf Array.

Das bedeutet, dass es sich um einen gleitenden Durchschnitt handelt, der auf einem vorab berechneten und gefüllten Feld basiert.

Dementsprechend: der erste Zyklus - Vorbereitung des erforderlichen Arrays, und der zweite Zyklus - Konstruktion eines gleitenden Durchschnitts auf der Grundlage des im ersten Zyklus vorbereiteten Arrays.

Und was tun Sie? Sie geben einen Wert in das erste Feld ein (die anderen Werte sind noch nicht vorbereitet) und versuchen, die MA auf diesem Wert aufzubauen.

Ich habe Ihnen eine Vorlage gegeben:

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Alle MQL4 Anfänger Fragen, Hilfe und Diskussion über Algorithmen und Codes

Artyom Trishkin, 2018.10.18 09:39

Indikator:

//+------------------------------------------------------------------+
//|                                                       TestMA.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_chart_window
#ifdef __MQL4__
#property strict
#property indicator_buffers 2
#else 
#property indicator_buffers 3
#property indicator_plots   2
#endif 
//--- plot MAstd
#property indicator_label1  "Calculation MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
//--- plot MAcalc
#property indicator_label2  "Standart MA"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkOrange
#property indicator_style2  STYLE_DOT
#property indicator_width2  2
//--- input parameters
input int      InpPeriod                     =  10;            // Period
input ENUM_MA_METHOD       InpMethod         =  MODE_EMA;      // Method
input ENUM_APPLIED_PRICE   InpAppliedPrice   =  PRICE_CLOSE;   // Applied price  
//--- indicator buffers
double         BufferMAcalc[];
double         BufferMAstd[];
double         BufferPrice[];
//---
int            digits;
int            period_ma;
int            handle_ma;
CAvg           avg();
//--- includes

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
#ifdef __MQL4__
   IndicatorBuffers(3);
#endif 
    period_ma=(InpPeriod<1? 1 : InpPeriod);
   digits=Digits()+1;
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
   ArraySetAsSeries(BufferMAcalc,true);
   ArraySetAsSeries(BufferMAstd,true);
   ArraySetAsSeries(BufferPrice,true);
//---
#ifdef __MQL5__
   ResetLastError();
   handle_ma=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("Error creation iMA(",(string)period_ma,"): ",GetLastError());
      return INIT_FAILED;
     }
#endif 
//---
   Comment("\nMA type: ",avg.MethodToString(InpMethod),", price: ",avg.PriceToString(InpAppliedPrice),", period: ",(string)period_ma);
//---
   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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferMAcalc,EMPTY_VALUE);
      ArrayInitialize(BufferMAstd,EMPTY_VALUE);
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
#ifdef __MQL5__
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferMAstd);
   if(copied!=count) return 0;
#endif 
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      #ifdef __MQL4__ BufferMAstd[i]=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice,i); #endif 
       BufferPrice[i]=avg.AppliedPrice(InpAppliedPrice,NULL,PERIOD_CURRENT,i);
      BufferMAcalc[i]=avg.GetMA(rates_total,InpMethod,period_ma,i,BufferPrice);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Sie können alles, was mit Fünfen zu tun hat, wegwerfen und eine Vorlage für Vieren erhalten. Obwohl diese Vorlage plattformübergreifend ist - Sie können sie für beide Terminals verwenden - legen Sie einfach Ihre Puffer und deren Anzahl fest. In dieser Vorlage gibt es zwei Zeichnungen und eine Berechnung, die hier zu sehen sind:

//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
 

=Außerdemverwenden Sie iMAOnArray() mit der Periode 1, d.h. der Wert von iMAOnArray() wird im Wesentlichen der Wert des Arrays tmp1 sein.


Ich habe versucht, verschiedene Werte zu verwenden, 1 bleibt als letzte Variante dieser Experimente.

Aus irgendeinem Grund schreibt z. B. ip1Buf[4] = 2147483647.0 bei allen TFs die gleiche Zahl in den i-r-Puffer, während die Array-Werte alle unterschiedlich sind tmp1[4] = 0,1300000000000097 usw.

Aber selbst dann sollte eine gerade Linie gezeichnet werden, und auf dem i-r-Diagramm gibt es absolut nichts, die Skala ist von 0 bis 0 markiert.



 
psyman:

=Außerdemverwenden Sie iMAOnArray() mit der Periode 1, d.h. der Wert von iMAOnArray() ist im Wesentlichen der Wert des Arrays tmp1


Ich habe versucht, verschiedene Werte zu verwenden, 1 bleibt als letzte Variante dieser Experimente.

Aus irgendeinem Grund wird bei allen TFs die gleiche Zahl in den i-ras-Puffer geschrieben, z. B. ip1Buf[4] = 2147483647.0, obwohl die Array-Werte alle unterschiedlich sind tmp1[4] = 0.1300000000000097 usw.

Aber auch in diesem Fall sollte eine gerade Linie gezeichnet werden, und auf dem i-r-Diagramm gibt es absolut nichts, die Skala ist von 0 bis 0 markiert.



2147483647.0 Fangen Sie an, die Suchmaschine zu benutzen!https://www.mql5.com/ru/forum/224831

Noch einmal, ich habe gerade Artem geschrieben, Sie müssen es selbst lesen, beginnen Sie mit einem einfachen... Zeichnen Sie einen Schlusskurs auf einem Diagramm mit einem Indikator, dann versuchen Sie, es komplizierter zu machen, machen Sie dasselbe in einem Zyklus und im zweiten Zyklus machen Sie eine МА-Berechnung auf der Grundlage des bereits berechneten Puffers, wo der Schlusskurs liegt

2147483647 в буфере
2147483647 в буфере
  • 2018.01.15
  • www.mql5.com
День Добрый! Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь...