Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 501

 

Hallo zusammen.

Bitte kommentieren Sie den Beginn des Indikators im neuen Gebäude. Ich interessiere mich für den Zyklusstart (wie man ihn richtig durchführt). Hier ist der Code von BolingerBands. Kommentieren Sie die Stellen mit der Frage //Was bedeutet es und wofür ist es?

In der Anleitung ist bisher alles das Gleiche: https: //book.mql4.com/ru/samples/icustom

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,pos;
//---
   if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)    //что это значит ?
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMovingBuffer,false);                //что это значит ?
   ArraySetAsSeries(ExtUpperBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtLowerBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtStdDevBuffer,false);                //что это значит ?
   ArraySetAsSeries(close,false);
//--- initial zero
   if(prev_calculated<1)                                  //что это значит ?
     {
      for(i=0; i<InpBandsPeriod; i++)                      //что это значит ?
        {
         ExtMovingBuffer[i]=EMPTY_VALUE;                   //что это значит ?
         ExtUpperBuffer[i]=EMPTY_VALUE;                    //что это значит ?
         ExtLowerBuffer[i]=EMPTY_VALUE;                    //что это значит ?
        }
     }
//--- starting calculation
   if(prev_calculated>1)                                   //что это значит ?
      pos=prev_calculated-1;                               //что это значит ?
   else                                                    //что это значит ?
      pos=0;//что это значит ?
//--- main cycle
   for(i=pos; i<rates_total && !IsStopped(); i++)          //что это значит ?
     {
      //--- 
      
      //код индикатора в цикле
      
      //---
     }
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
 

Und die Dokumentation lesen? Treten Sie auf einen unverständlichen Ausdruck und drücken Sie die magische F1-Taste oder lesen Sie auf der Website.

https://docs.mql4.com/ru/array/arraysetasseries

https://docs.mql4.com/ru/basis/function/events#oncalculate

 

Hallo zusammen. Bitte helfen Sie mir, ich werde aus der Situation nicht schlau.

In meinem Code brauche ich buf0 auf dem Bildschirm gezeichnet werden, und buf1 ist nicht gezeichnet, aber für weitere Array-Verarbeitung und Ausgabe in einen anderen Puffer (zum Beispiel in buf2) gezählt. Ich verstecke buf1 in einer Zeichenkette:

SetIndexPuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexPuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //Ich möchte diese Linie ausblenden

Aber wenn ich den Indikator setze, erhalte ich einen Versatz aufgrund der unterschiedlichen Berechnung...

QUESTION: gibt es eine Möglichkeit, diesen Unterschied zu entfernen, so dass buf0 normal gezeichnet wird?
Dateien:
testbuf.mq4  2 kb
 
clubsmi:

Hallo zusammen. Bitte helfen Sie mir, ich werde aus der Situation nicht schlau.

In meinem Code brauche ich buf0 auf dem Bildschirm gezeichnet werden, und buf1 ist nicht gezeichnet, aber für weitere Array-Verarbeitung und Ausgabe in einen anderen Puffer (zum Beispiel inbuf2) gezählt. Ich verstecke buf1 in einer Zeichenkette:

SetIndexPuffer(0,Buf0);

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);

SetIndexPuffer(1,Buf1);

SetIndexStyle (1,DRAW_NONE); //Ich möchte diese Linie ausblenden

Aber wenn ich den Indikator setze, erhalte ich einen Versatz aufgrund der unterschiedlichen Berechnung...

QUESTION: gibt es eine Möglichkeit, diesen Unterschied zu entfernen, so dass buf0 normal gezeichnet wird?

Lesen Sie mehr über INDICATOR_DATA und INDICATOR_CALCULATIONS

Und davor lesen Sie #property indicator_buffers und IndicatorBuffers(10); 10 ist von meinem Indikator, ich habe es nicht gelöscht, um nicht begrenzte Anzahl von Puffern wie in ME 509 Build zu zeigen.

 
Ich drücke oft F1, aber für einen schwachen Programmierer sind die Dinge nicht immer klar. Beispiel - ArraySetAsSeries -> Setzt das AS_SERIES-Flag auf das angegebene dynamische Array-Objekt, die Array-Elemente werden wie in Timeseries indiziert.

Parameter

array[]

[in][out] Zu setzendes numerisches Feld.

Flagge

[in] Die Indizierungsrichtung des Arrays.

Zurückgegebener Wert

Gibt bei Erfolg true zurück, sonst false.

Aber was gibt und wie es sein wird for(i=0; i<InpBandsPeriod; i++) und for(i=InpBandsPeriod; i<0; i--) . Werden true und false in den Schleifen wiedergegeben. Dies war in Build 5xx nicht der Fall. Vielleicht ist es möglich, ohne ArraySetAsSeries zu tun, aber was wäre dann der Standard sein.Vielleicht aber auch nicht.

 

dank AlexeyVik habe ich es hinbekommen...

Wer kann mir sagen, wie lange die alte mql4-Sprache aus dem 509-Build noch funktioniert?

 
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

Die Funktion von Kim funktioniert nicht...

if(IsNewBar()==true)
{
if(ExistPositions(NULL,-1,44444,-1)==false)
           {
       
                  trade=true;
                         
            if(trade!=false)
              {
                    
                        OpenPosition(Symbol(),OP_BUY,0.1,Ask-sl*Point,Ask+tp*Point,44444);

                        trade=false;
                       }
                   
      }
  }            
       }   

die Position sollte sich öffnen, wenn es keine weiteren Positionen mit dem Assistenten..... gibt, aber sie öffnen sich bei jedem neuen Takt mit me......

 
Zver4991:


Die Funktion von Kim funktioniert nicht...

die Position sollte sich öffnen, wenn es keine weiteren Positionen mit dem Assistenten..... gibt, aber sie öffnen sich bei jedem neuen Takt mit me......


Schauen Sie sich diese ot - offene Zeit an ( 0 - jede offene Zeit), was ist mit Ihnen?

 
gince:


Schauen Sie sich diese ot - offene Zeit an ( 0 - jede offene Zeit), was ist mit Ihnen?

Und warum

trade=true;if(trade!=false) .......
                          

wenn nicht geöffnet, öffnen

 
gince:


schauen Sie sich diese ot - Öffnungszeit an ( 0 - beliebige Öffnungszeit), und Sie?


Es sollte also geprüft werden, ob bei einer solchen Magie überhaupt keine offenen Positionen vorhanden sind, unabhängig von der Öffnungszeit..... einfache Einschränkung der Magie....toast

if(ExistPositions(NULL,-1,44444,-1)==false)//wenn es keine offenen Positionen mit dieser magischen Zahl gibt, dann check......

.... oder vielleicht verstehe ich nicht.... Ich habe -1, weil es mir egal ist, wann eine Position eröffnet wird ..... jedenfalls wird sie nur bei einem neuen Balken eröffnet und wenn der alte geschlossen wird, weil die Bedingungen festlegen, dass die Position nur eröffnet werden kann, wenn es keine offenen Positionen mit dieser magischen Zahl gibt

um es noch einfacher zu machen: Position öffnen und warten, bis sie geschlossen wird.... wenn er schließt, dann öffnet er wieder und sicherlich sollte nicht auf jedem Balken eine Position mit einem solchen Magier geöffnet werden.... es wird wieder geprüft, ob es keine offenen Positionen mit einem solchen Magier gibt