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

 
Alexey Viktorov:

In mql5 ist es dasselbe. Sie ist sogar leicht verlängert. Ist es nicht das, was wir brauchen?

SYMBOL_TRADE_TICK_VALUE

SYMBOL_TRADE_TICK_VALUE_PROFITWert

doppelt

SYMBOL_TRADE_TICK_VALUE_PROFIT

Berechneter Tickwert für profitable Position

doppelt

SYMBOL_TRADE_TICK_VALUE_LOSS

Berechneter Wert eines Ticks für eine Verlustposition

doppelt

SYMBOL_TRADE_TICK_SIZE

Mindestpreisänderung

doppelt

Verdammt, ich bin so dumm, ich habe TICK_SIZE statt TICK_VALUE eingegeben... Ich sollte ins Bett gehen.
 
Leute, was ist hier los, helft mir!?
 
Alexey Viktorov:

Das erste, was mir auffiel, war die Reihenfolge der Puffer.

Die Build-Puffer müssen IMMER nacheinander ablaufen. D.h. wenn die Datenpuffer Nummer 2 und 3 sind, dann MUSS der Farbpuffer Nummer 4 sein.

Wenn dies nicht der einzige Fehler ist, werden wir weiter suchen.

OK, ich habe eine solche Funktion in der Anleitung gefunden, hier:

MQL5 Referenzhandbuch / Benutzerdefinierte Indikatoren / SetIndexBuffer
".....

boolSetIndexBuffer(
intindex,// Index des Puffers
doublebuffer[],// Array
ENUM_INDEXBUFFER_TYPEdata_type//was gespeichert werden soll
);

Parameter

Index

[in] Nummer des Indikatorpuffers. Die Nummerierung beginnt bei 0. Die Zahl muss kleiner sein als der in #property indicator_buffers angegebene Wert.

Puffer[]

[in] Im benutzerdefinierten Indikatorprogramm deklariertes Array.

daten_type

[in] Art der im Indikator-Array gespeicherten Daten. Der Standardwert ist INDICATOR_DATA (Werte des berechneten Indikators). Kann auch den Wert INDICATOR_COLOR_INDEX annehmen, dann ist dieser Puffer für die Speicherung der Indizes der Farben für den vorherigen Indikatorpuffer bestimmt. In der Zeile #property indicator_colorN können bis zu 64 Farben angegeben werden. Der Wert INDICATOR_CALCULATIONS bedeutet, dass dieser Puffer an den Zwischenberechnungen des Indikators teilnimmt und nicht zum Zeichnen bestimmt ist.

 

Ich habe versucht, es noch einmal zu machen, und bekam noch mehr Mist. Das Histogramm war ganz verschwunden und die Linienanzeige wurde gelinde gesagt seltsam. Das Signal wurde oberhalb von 50 abgeschaltet, während das Hauptsignal darunter lag. Der Kodex enthält keine solchen Grenzwerte.

 
Artyom Trishkin:

Ich habe Ihnen einen Link gegeben, um nicht das Histogramm zu studieren, sondern die Arbeit mit dem Farbpuffer. Lassen Sie das Histogramm beiseite und konzentrieren Sie sich darauf, wie Sie mit Farben arbeiten müssen.

Ich habe es studiert, aber nichts Neues, offenbar ist es (neu für mich) natürlich, offensichtlich für alle Eingeweihten, selbsterklärend. Ich konnte nichts Neues finden, außer der oben beschriebenen Eigenschaft der gegenseitigen Anordnung von Puffern während der Indizierung. Diese Sequenz respektiert, bekam ein noch kitschigeres Bild.

Bilder unten, Datei im Anhang

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_COLOR_HISTOGRAM2
#property indicator_color1  clrGreen,clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1 

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width2  3 

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID
#property indicator_width3  2 

//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing

//--- indicator buffers
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
double    ColorHistogram_2Colors[];
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping

   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);  
   
   //ArraySetAsSeries(ExtMainBuffer,true);
   //ArraySetAsSeries(ExtSignalBuffer,true);
   //ArraySetAsSeries(ExtHighesBuffer,true);
   //ArraySetAsSeries(ExtLowesBuffer,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer1,true);
   //ArraySetAsSeries(ColorHistogram_2Buffer2,true);
   //ArraySetAsSeries(ColorHistogram_2Colors,true);
   
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   PlotIndexSetString(3,PLOT_LABEL,"Main");
   PlotIndexSetString(4,PLOT_LABEL,"Signal");
   //PlotIndexSetString(2,PLOT_LABEL,"UP");
   //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(5,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(6,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+ 
Dateien:
 

Hallo.

Können Sie mir bitte sagen, wo ich den Algorithmus für eine "zuverlässige" Auftragseröffnung finden kann (bisher bin ich nur an Marktaufträgen interessiert), denn ich bin ratlos.

Das Problem ist, dass in meinem Konto (Alpari) die StopLevel- und FreezeLevel-Ebenen Null sind, und wenn ich nur diesehttps://book.mql4.com/ru/appendix/limits Beschränkungen verwende, bedeutet das, dass ein StopLoss beim Kauf auf Bid-Ebene und beim Verkauf auf Ask-Ebene gesetzt werden kann, aber das ist nicht wahr. In diesem Fall gibt OrderSend einen "Kein Preis"-Fehler zurück (ERR_OFF_QUOTES, Code 136).

Gleichzeitig werden Geschäfte ohne Stopps oder mit Stopps von 50 oder mehr Punkten problemlos eröffnet.

Ich habe die Erfahrung gemacht, dass der minimale SlopLoss 19 Pips beträgt. Ich weiß nicht, wie ich diese Spanne programmatisch festlegen kann.

 
Diese Niveaus sollten ausgehend vom Schlusskurs des Auftrags und nicht vom Eröffnungskurs festgelegt werden. Und der Schlusskurs bei der Festlegung dieser Niveaus darf nicht gleich dem festgelegten Wert sein
 
klok79:

Hallo.

Können Sie mir bitte sagen, wo ich den Algorithmus für eine "zuverlässige" Auftragseröffnung finden kann (bisher bin ich nur an Marktaufträgen interessiert), denn ich bin ratlos.

Das Problem ist, dass in meinem Konto (Alpari) die StopLevel- und FreezeLevel-Ebenen Null sind, und wenn ich nur diesehttps://book.mql4.com/ru/appendix/limits Beschränkungen verwende, bedeutet das, dass ein StopLoss beim Kauf auf Bid-Ebene und beim Verkauf auf Ask-Ebene gesetzt werden kann, aber das ist nicht wahr. In diesem Fall gibt OrderSend einen "Kein Preis"-Fehler zurück (ERR_OFF_QUOTES, Code 136).

Gleichzeitig werden Geschäfte ohne Stopps oder mit Stopps von 50 oder mehr Punkten problemlos eröffnet.

Ich habe die Erfahrung gemacht, dass der minimale SlopLoss 19 Pips beträgt. Ich weiß nicht, wie ich diese Spanne programmatisch festlegen kann.

Versuchen Sie minStopLoss = Aktueller Kurs +/- (MaxValue(2*Spread, StopLoss));

 
Warum werden Objekte nicht zerstört, wenn das Debugging beendet wird? Soweit ich weiß, wird OnDeinit() überhaupt nicht aufgerufen. Nach dem Debug-Stopp muss ich jedes Mal das Terminal beenden.
 

Guten Tag der Code unten Problem ist oft aktualisiert Array adx_sig[9] . Ich wollte eine Abhängigkeit von der rechtzeitigen Aktualisierung der Daten erreichen. Aber irgendetwas ging schief.

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int                  ADX_adx_period          = 14;                                                 // adx period ADX 
input int                  ADX_lower_level         = 20;                                                 // Lower level ADX 
int h_adx[9];
double adx1_buffer[3];
double adx2_buffer[3];
double adx3_buffer[3];
ENUM_TIMEFRAMES handle_period[9]={PERIOD_CURRENT,PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1};
int adx_sig[9];
int OnInit()
  {
//---
   for(int i=0; i<ArraySize(handle_period); i++)
     {
      //--- Установим хэндлы для индикаторов
      h_adx[i]=iADX(_Symbol,handle_period[i],ADX_adx_period);
        if(h_adx[i]<0) 
        {
         Alert("Ошибка при создании индикаторов - : ",GetLastError(),"!!");
        }
     }   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    for(int i=0; i<ArraySize(handle_period); i++)
     {
      //--- Удаляем хэндлы для индикаторов
      IndicatorRelease(h_adx[i]);
     }
     //---
       
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int i_sig=0; i_sig<ArraySize(handle_period); i_sig++)
     {
      if(CopyBuffer(h_adx[i_sig],0,0,3,adx1_buffer)<3)Print("CopyBuffer adx1_buffer ",GetLastError());
      if(CopyBuffer(h_adx[i_sig],1,0,3,adx2_buffer)<3)Print("CopyBuffer adx2_buffer ",GetLastError());
      if(CopyBuffer(h_adx[i_sig],2,0,3,adx3_buffer)<3)Print("CopyBuffer adx3_buffer ",GetLastError());
      if(adx3_buffer[1]<adx2_buffer[1] && adx3_buffer[1]>=ADX_lower_level && adx3_buffer[1]>adx3_buffer[2])adx_sig[i_sig]=1;
      else if(adx3_buffer[1]>adx2_buffer[1] && adx3_buffer[1]>=ADX_lower_level && adx3_buffer[1]<adx3_buffer[2])adx_sig[i_sig]=-1;
      else adx_sig[i_sig]=0;
      }
      PrintFormat("ADX sig0=%i sig1=%i sig2=%i sig3=%i sig4=%i sig5=%i sig6=%i sig7=%i sig8=%i",adx_sig[0],adx_sig[1],adx_sig[2],adx_sig[3],adx_sig[4],adx_sig[5],adx_sig[6],adx_sig[7],adx_sig[8]); 
  }