Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 219

 
Vitaly Muzichenko:
Vitaly Muzichenko:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return (0);
     ......остальной код, в частности для открытия....
  }


выдает ошибку: 'return' - 'void' function returns a value Vitaly Muzichenko:
 
Oventu:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return;
     ......остальной код, в частности для открытия....
  }
 
Vitaly Muzichenko:
Vitaly Muzichenko:
Ich danke Ihnen!
 
Hallo, was ist mit OrdersTotal()?
Ich wusste immer, dass es die Anzahl der Aufträge -1 enthält, d.h. OrdersTotal()-1 und alles funktionierte, aber ich begann ein Programm zu schreiben und plötzlich wird ein Auftrag nicht mehr gezählt, ich fragte nach OrdersTotal() und es gab mir die Gesamtzahl der Aufträge = 3, statt 3-1.
Was passiert?

Die übliche Form der Schleife in der Hilfe:

int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
}

Das heißt, die erste Ordnung ist gleich Null.

Aber nein, in Wirklichkeit ist die erste Ordnung 1, was bedeutet, dass wir die Suche bei 1 und nicht bei Null beginnen sollten?
Haben die Metaquotes etwas falsch gemacht oder bin ich dumm?

Документация по MQL5: Торговые функции / OrdersTotal
Документация по MQL5: Торговые функции / OrdersTotal
  • www.mql5.com
Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.
 
Maksim Mihajlov:
Hallo, was ist mit OrdersTotal() los?
Ich wusste immer, dass es die Anzahl der Aufträge -1 enthält, d.h. OrdersTotal()-1, und alles hat funktioniert, aber ich habe angefangen, ein Programm zu schreiben, und plötzlich wird ein Auftrag nicht gezählt. Ich habe nach OrdersTotal() gefragt, und es sagt, dass die Gesamtzahl der Aufträge = 3 ist, anstatt 3-1.
Was passiert?

Die übliche Form der Schleife in der Hilfe:

int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
}

Das heißt, die erste Ordnung ist gleich Null.

Aber nein, in Wirklichkeit ist die erste Ordnung 1, was bedeutet, dass wir die Suche bei 1 und nicht bei Null beginnen sollten?
Haben die Metaquotes etwas falsch gemacht, oder bin ich dumm?

Sie haben die Begriffe VERBINDLICHE ANORDNUNGEN und GIFT verwechselt. Lesen Sie die Referenz. Seien Sie genauer in Ihrer Frage: Was versuchen Sie zu zählen: ENTFERNTE AUFTRAGSSTELLUNGEN oder POSITIONEN? Und ja, es hat sich nichts geändert - der Index des ersten Elements beginnt mit "0".


Hinzugefügt: Beispiel

Beispiel: Berechnung von Positionen und schwebenden Aufträgen

How to start with MQL5
How to start with MQL5
  • 2020.03.12
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 
Vladimir Karputov:

Sie haben die RELATED ORDERS und die POSITIONS verwechselt. Lesen Sie die Referenz. Formulieren Sie Ihre Frage genauer: Was wollen Sie zählen: RETIRED ORDERS oder POSITIONS? Und ja, es hat sich nichts geändert - der Index des ersten Elements beginnt mit "0".


Hinzugefügt: Beispiel

Beispiel: Berechnung von Positionen und schwebenden Aufträgen

Ich meine MQL4, nicht MQL5, es gibt keinen Unterschied zwischen Pending und Market Orders!

 
Maksim Mihajlov:

Ich meine MQL4, nicht MQL5, da gibt es keine Unterteilung in Pending und Market Pending!

Sie schreiben im MQl5-Forum. Sie schreiben im Hauptteil. Sie posten im MQL5-Forum - und Sie erhalten Antworten zu MQL5.

Fragen zum alten Terminal sind an den speziellen Abschnitt gerichtet: MQL4 und MetaTrader 4. Schreiben Sie von nun an dort. Ich werde Ihre Fragen an sie weiterleiten.

 

Ich habe zwei Varianten verglichen, in der ersten habe ich OrdersTotal()-1 verwendet und die Suche bei Null begonnen - ich bekam den Fehler
. In der zweiten Variante habe ich bei Eins begonnen und die gesamte OrdersTotal() genommen - diesmal kein Fehler

In den Screenshots können Sie sehen, dass OrdersTotal() die tatsächliche Anzahl der Aufträge anzeigt, nicht OrdersTotal()-1 ...

Die Frage ist
, warum OrdersTotal() zeigt die tatsächliche Anzahl der Aufträge, anstatt -1, sollte es so sein, oder es ist etwas Neues?
Denn in diesem Fall sollten wir die Suche nicht bei Null, sondern bei Eins beginnen!

Dateien:
4.png  181 kb
2.png  186 kb
 
Maksim Mihajlov:

Ich habe zwei Varianten verglichen, in der ersten habe ich OrdersTotal()-1 verwendet und die Suche bei Null begonnen - ich bekam den Fehler
. In der zweiten Variante habe ich bei Eins begonnen und die gesamte OrdersTotal() genommen - diesmal kein Fehler

In den Screenshots können Sie sehen, dass OrdersTotal() die tatsächliche Anzahl der Aufträge anzeigt, nicht OrdersTotal()-1 ...

Die Frage ist
, warum OrdersTotal() zeigt die tatsächliche Anzahl der Aufträge, anstatt -1, sollte es so sein, oder es ist etwas Neues?
Denn in diesem Fall sollten wir die Suche nicht bei Null, sondern bei Eins beginnen!

Ich denke, ich habe meinen Fehler verstanden, sorry...
In dieser Bedingung gibt es einen Offset von -1:
if (OrderSelect(i-1,SELECT_BY_POS)==true){}
Entschuldigung, dass ich so unverblümt bin, ich habe den String aus einem anderen Programm übernommen und nicht auf den Offset geachtet!

 
Hallo. Ich brauche Ihre Hilfe, um den Indikator zu korrigieren. Das Wesen des Indikators ist wie folgt. Berechnen Sie das Ausmaß des Preisanstiegs im Vergleich zum vorherigen Balken. Für Null nimmt einen Stern bar. Das heißt, der Eröffnungskurs ist gleich dem Schlusskurs. Beim Kompilieren keine Fehler, aber beim Testen ein Fehler in der Zeile 80 20 Zeichen. Auch dieSignalleitung istfalsch gezeichnet. Aber ich denke, das ist der Grund für die falsche Berechnung des Hauptpuffers. Bitte helfen Sie mir, das Problem zu beheben.
//+------------------------------------------------------------------+
//|                                                         MSBB.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <MovingAverages.mqh>

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  clrGreen
#property indicator_color2  clrRed
#property  indicator_width1  1
input int            InpMSBBPeriod=3;        // Period
input ENUM_MA_METHOD InpMSBBMethod=MODE_SMA;  // Method
//--- indicator buffers
double         ExtMSBBBuffer[];
double         ExtTempBuffer[];
double         ExtPriceBuffer[];
double         ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
   IndicatorDigits(Digits-2);
//--- drawing settings
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMSBBBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(2,ExtTempBuffer);
   SetIndexBuffer(2,ExtPriceBuffer);
   SetIndexDrawBegin(1,InpMSBBPeriod);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MSBB("+IntegerToString(InpMSBBPeriod)+")");
   SetIndexLabel(0,"MSBB");
   SetIndexLabel(1,"Signal");
//---
   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;//limit;
//------
   if(rates_total<=InpMSBBPeriod || InpMSBBPeriod<=2)
      return(0);
   /*//--- counting from 0 to rates_total
      ArraySetAsSeries(ExtMSBBBuffer,false);
      ArraySetAsSeries(ExtSignalBuffer,false);
      ArraySetAsSeries(open,false);
      ArraySetAsSeries(high,false);
      ArraySetAsSeries(low,false);
      ArraySetAsSeries(close,false);*/
//---
  // limit=rates_total-prev_calculated;
   //if(prev_calculated>0)
     // limit++;
//--- typical price and its moving average
   for(i=0; i<rates_total; i++)
     {
      ExtTempBuffer[i] = NormalizeDouble((close[i]-open[i])/Point(),2);
      ExtPriceBuffer[i] = NormalizeDouble((close[i+1]-open[i+1])/Point(),2);
      //ExtMSBBBuffer[i]=price_open+ExtTempBuffer[i];
      //Print("ExtPriceBuffer[i] = ", ExtPriceBuffer[i]);
      if(ExtTempBuffer[i]==0)
         ExtMSBBBuffer[i]=0.0;
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open>0 && price_close<0)||(price_open<0 && price_close>0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      //--- signal line counted in the 2-nd buffer
      //ExtSignalBuffer[i]=iMAOnArray(ExtMSBBBuffer,0,InpMSBBPeriod,0,InpMSBBMethod,0);
      SimpleMAOnBuffer(rates_total,prev_calculated,1,InpMSBBPeriod+2,ExtMSBBBuffer,ExtSignalBuffer);
      Print ("ExtSignalBuffer = ", ExtSignalBuffer[i]);
      //--- done
     }
   /* if(ExtPriceBuffer[i]>0||ExtPriceBuffer[i]<0)
     {
      ExtMSBBBuffer[i] = ExtPriceBuffer[i]+ExtTempBuffer[i];
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   if(ExtPriceBuffer[i]==0)
     {
      ExtMSBBBuffer[i] = 0.0;
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   }*/
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Некоторые технические индикаторы имеют несколько отрисовываемых на графике буферов. Нумерация индикаторных буферов начинается с 0. При копировании значений индикатора функцией CopyBuffer() в массив типа double для некоторых индикаторов можно указывать не номер копируемого буфера, а идентификатор этого буфера.