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

 
mwwm:

wie man es richtig macht?

Wie machen Sie das?
 
Artyom Trishkin:
Wie machen Sie das?
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &Op[], 
                const double &Hi[], 
                const double &Lo[], 
                const double &Cl[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
  { 
   ArraySetAsSeries(time,true); 
   ArraySetAsSeries(Op,true); 
   ArraySetAsSeries(Hi,true); 
   ArraySetAsSeries(Lo,true); 
   ArraySetAsSeries(Cl,true); 
//--- 
double mas[];
   if(prev_calculated==0) 
     { 
      int prices1=CopyOpen(Symbol(),0,0,Bars(_Symbol,_Period),Op);
      int prices2=CopyHigh(Symbol(),0,0,Bars(_Symbol,_Period),Hi); 
      int prices3=CopyLow(Symbol(),0,0,Bars(_Symbol,_Period),Lo); 
      int prices4=CopyClose(Symbol(),0,0,Bars(_Symbol,_Period),Cl); 
      int prices5=CopyTime(Symbol(),0,0,Bars(_Symbol,_Period),time); 

     } 
   else 
     { 

      int prices1=CopyOpen(Symbol(),0,0,1,Op);
      int prices2=CopyHigh(Symbol(),0,0,1,Hi); 
      int prices3=CopyLow(Symbol(),0,0,1,Lo); 
      int prices4=CopyClose(Symbol(),0,0,1,Cl);     
      int prices5=CopyTime(Symbol(),0,0,1,time);     
       }   
      for(int i=rates_total-1;i>=0 && !IsStopped();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------

Vereinfacht so, CopyOpen ich verstehe ist überflüssig für OnCalculate, aber so sieht es nur die Geschichte aus dem Terminal-Fenster?

 
mwwm:

Vereinfacht gesagt, ist CopyOpen für OnCalculate unnötig, aber so sieht es nur die Geschichte aus dem Terminalfenster?

Array mas wird bei jedem Tick mit der Größe Null erstellt und ändert seine Größe auch sonst nicht. Jeder Zugriff darauf führt also zu einem Array Overrun.

Um das Problem zu lösen, müssen wir entweder die Größe des Indikators an die Größe anpassen, die die Messwerte aller Verlaufsbalken enthält, oder ihn an den Indikatorpuffer binden (der als globale Variable des Programms deklariert ist). Wenn ich es richtig verstehe, sollten diese Werte mit Hilfe des Indikators angezeigt werden.

 
mwwm:

Vereinfacht, CopyOpen ich verstehe ist überflüssig für OnCalculate, aber so sieht es nur die Geschichte aus dem Terminal-Fenster?

Beispiel:

//+------------------------------------------------------------------+
//|                                                         Test.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_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "Open/Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries(BufferOC,true);
//---
   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[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<1) return 0;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total-1;                   // установим начало цикла на начало исторических данных
      ArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(close[i]==0) continue;
      BufferOC[i]=open[i]/close[i];
     }

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

Das Array mas wird bei jedem Tick mit einer Größe von Null erstellt und ändert seine Größe auch sonst nicht. Daher führt jeder Verweis darauf zum Verlassen des Arrays.

Um das Problem zu lösen, sollten Sie entweder die Größe des Indikators so anpassen, dass er die Messwerte aller historischen Balken enthält, oder ihn an den Indikatorpuffer binden (der als globale Variable des Programms deklariert ist). Wenn ich es richtig verstanden habe, sind es diese Werte, die mit dem Indikator angezeigt werden müssen.

Mein Fehler, mas[] sollte wirklich ein globales Array sein, aber der Indikatorpuffer ist auch nicht geeignet, es wird eher ein mehrdimensionales Zwischenarray sein. Wie lässt sich die optimale Array-Größe für M5 am besten ermitteln, nicht über den Indikatorpuffer?

 
mwwm:

Meine Ungenauigkeit, mas[] ist wirklich ein globales Array, aber Indikatorpuffer ist auch nicht geeignet, eher wäre es ein dazwischen liegendes mehrdimensionales Array. Wie lässt sich die optimale Array-Größe für M5 am besten bestimmen, ohne dass ein Indikatorpuffer verwendet wird?

Ich verstehe nicht, was ich mit multidimensional meine. Wir sprechen hier von einem eindimensionalen Array. Darüber hinaus ist in MQL4 die maximale Dimension eines Arrays 4.

Um das Array auf die gleiche Größe wie die Zeitreihe zu bringen, sollten wir es entsprechend der Anzahl der verfügbaren Balken im Diagramm des gewünschten Symbols und der Periode anpassen:

double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return;
}

ArraySetAsSeries(fArray, true);
 
mwwm:

Meine Ungenauigkeit, mas[] ist wirklich ein globales Array, aber Indikatorpuffer ist auch nicht geeignet, eher wäre es ein dazwischen liegendes mehrdimensionales Array. Wie lässt sich die optimale Array-Größe für M5 am besten bestimmen, wenn nicht durch einen Indikatorpuffer?

Warum wollen Sie keine Arrays als Indikatorpuffer verwenden? Sie werden vom Subsystem überwacht, was Ihnen die Arbeit erleichtert.

Und das Zwischenindikator-Pufferfeld ist einfach zu erstellen:

SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
 

Hallo.

Die Volumina auf der Plattform sind Tickvolumina, wird es auch echte Volumina geben?

 
Олег Литинский:

Hallo.

Auf der Plattform ticken die Bänder, wird es auch echte Bänder geben?

Das wird es nicht. Verwenden Sie MT5, einige Broker bieten dort echte Volumina an.

 

Guten Tag!

Bitte helfen Sie mir bei dem folgenden Problem:

1) Nachdem einige Bedingungen erfüllt sind, wird ein schwebender Auftrag eröffnet:

{
price=High[1]+OrderPoint*Point;
stoploss=Low[1]-Point;
takeprofit=price+price-stoploss;
OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit);
}

Bitte sagen Sie mir, was ich hinzufügen und wo ich eine schwebende Order löschen kann, wenn der Preis bereits den Stop Loss (dieser schwebenden Order) überschritten hat.

Entschuldigung für die dumme Frage, ich habe mich bei der Suche nach einer Antwort im Forum verirrt.

Vielen Dank im Voraus!