[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 268

 
drknn:


1. Um zu entscheiden, was genau eine normale Funktion zurückgeben soll, muss ich wissen, warum der Hauptcode einen solchen Wert benötigt. Wenn ich zum Beispiel eine Entscheidung treffen möchte, einen Kaufauftrag zu eröffnen, wenn ein Signal vorliegt, werde ich eine Funktion schreiben, die die Anzahl der bereits eröffneten Kaufaufträge zurückgibt. Je nachdem, wie viele es sind, trifft der Code eine Entscheidung, die der im Code enthaltenen Logik folgt. Ich weiß nicht, welche Logik in den Rückgabecode eingebettet ist. Heute habe ich mir einen Artikel über die Erstellung einer Semaphore angesehen und bin auf einen Returncode (-2) gestoßen. Überrascht, hier eine Frage zu stellen. Das ist alles. ( https://www.mql5.com/ru/articles/1412 - Artikel hier).

2. Das Terminal ignoriert die Rückgabewerte. Ist das richtig? Wenn ja, dann stellt sich wieder die berechtigte Frage, warum der Entwickler bei der Erstellung eines EA/Indikators/Skripts in einer Vorlage genau int einträgt, denn es wäre logischer, dort void einzutragen - dann müsste das Terminal nichts ignorieren - wir würden dann 1 Takt an Prozessorzeit gewinnen? Vielleicht gibt es eine Logik in WHAT, um von int init(), int deinit() und int start() Funktionen zurückzukehren? Ich glaube, Roche hat das schon einmal irgendwo erklärt - er erinnerte sich an eine Beschreibung, wann man Null und wann man (-1) zurückgeben muss. Genau nach dieser Erklärung habe ich gesucht. Schade, dass ich es nicht finden konnte...

P.S.

Der Autor des Artikels verwendet return(-2) für seine eigenen Zwecke. Tatsache ist jedoch, dass die Funktion start() manchmal mit einem Code endet, der einen anderen Wert als Null zurückgibt. Und es ist nicht nur eine Person, die das tut. Das ist genau die Logik, die ich verstehen möchte.

1. Ich kann dem nichts hinzufügen. Was immer Sie wollen, geben Sie es zurück.

2. das Terminal ignoriert es und Ihr Code ignoriert es nicht, wenn er so aufgebaut ist. Der Systemaufruf ignoriert sowohl die Parameter als auch den Rückgabewert. Das ist ziemlich offensichtlich. Wohin führt sie in diesem Fall zurück?

Über die Entstehung des Musters können wir nur Vermutungen anstellen. Die Entwickler müssen von der Standard-INT ausgegangen sein.

 
okvseok:

wie Sie diese Zeilen verstehen können:

Schreiben Sie so und schauen Sie in das Tagebuch:

//---- return orders volume

if(buys>0){
 Print("buys = ",buys);
 return(buys);
}
else{
 Print("-sells = ",-sells);
 return(-sells);// это эквивалентно команде return(sells*(-1));
}
 

Können Sie mir einen Rat geben?

Ich verwende mehrere Indikatoren, die das Datum in globalen Variablen verwenden

extern bool   shiftdata           = false;
extern string ShiftHistory        = "02.06.2012 00:00";

Wenn Sie das Datum in der Historie ändern, müssen Sie es auch in allen Indikatoren ändern.

Ichhabe einen Indikator erstellt, der den Verschiebungswert über iCustom an int bars sendet.

Aber das Problem ist, dass das unveränderte Datum, das kompiliert wurde (02.07.2012), übergeben wird, aber wenn Sie es manuell ändern (02.06.2012), wird es nicht übergeben!

WARUM und WAS ZU TUN????

//+------------------------------------------------------------------+
//|                                                        iTime.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1
extern string BLOK_______1        = "Работа с историей";
extern string ShiftHistory        = "02.07.2012 00:00";
extern string PERIOD              = "D1";
//---
double buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexBuffer(0,buffer);
   SetIndexStyle(0,DRAW_ARROW,0,0);
   SetIndexEmptyValue(0,0.0);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
int  counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
int i,period,limit,bs,barn;

if(PERIOD=="MN1") period=PERIOD_MN1;
else
if(PERIOD=="W1")  period=PERIOD_W1;
else
if(PERIOD=="D1")  period=PERIOD_D1;
else 
if(PERIOD=="H4")  period=PERIOD_H4;
else
if(PERIOD=="H1")  period=PERIOD_H1;
else
if(PERIOD=="M30") period=PERIOD_M30;
else
if(PERIOD=="M15") period=PERIOD_M15;
else
if(PERIOD=="M5")  period=PERIOD_M5;
else
if(PERIOD=="M1")  period=PERIOD_M1;
else
period=PERIOD_D1;

bs=iBarShift(Symbol(),period,StrToTime(ShiftHistory));
barn=iBars(Symbol(),period);
limit=barn-100;

if(limit>bs)
for(i=barn-1; i>=0; i--)
{
if (i==bs) buffer[i]=bs;
} RefreshRates();
return(0);
}

Hier ist der Empfänger

for(int y=barn-100; y>=0; y--)
{
int bbb,st=iCustom(Symbol(),PERIOD,"iTime",0,y);
if(st>0) bbb=st;
}
 Comment(bbb);

Kommentar schreibt Schicht 16. Und am 02.06.2012 sollten es 48 sein.

Bitte um Rat!

 

Helfen Sie mir, das letzte Hoch und Tief eines Zickzacks in einem EA zu bestimmen

doppelt zz1;
int start()
{
zz1=iCustom(NULL,0, "ZigZag", 12, 5, 3, 0, 1);
MessageBox("zz1="+zz1,"zz1");
zurück(0);
}
"0.00000" kommt heraus

 
spek:

Helfen Sie mir, das letzte Hoch und Tief eines Zickzacks in einem EA zu bestimmen

doppelt zz1;
int start()
{
zz1=iCustom(NULL,0, "ZigZag", 12, 5, 3, 0, 1);
MessageBox("zz1="+zz1,"zz1");
zurück(0);
}
"0.00000" kommt heraus

double ZZ[10000]={0.0};  //массив для значений ZigZag
double zz1[10000]={0.0};

//-----
int init()
{

}
return(0);
//---
int start()
{
int q=1;   //ПОПРАВИЛ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

for(int i=1; i<=1000; i++)
{
zz1[i]=iCustom(NULL,0,"ZigZag", 12, 5, 3, 0, i);
if(zzl[i]>0) { ZZ[q]=zzl[i];  q++; }
//MessageBox("zz1="+zz1,"zz1");
Comment(ZZ[1],"  ",ZZ[2]);

return(0);
}
 

Ich möchte "Alert()" einfügen, um mir mitzuteilen, wenn sich der Trend umgekehrt hat.

Ich möchte dort "Alert()" einfügen, um mir mitzuteilen, wenn sich der Trend umkehrt.

//+------------------------------------------------------------------+
//|                                                    mikahekin.mq4 |
//|                        Copyright 2004, MetaQuotes Software Corp. |
//|                                                http://www.sasara |
//|                              Modified by: Ronald Verwer/ROVERCOM |
//+------------------------------------------------------------------+
#property copyright "Copyright 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property  indicator_chart_window
#property  indicator_buffers 4
#property  indicator_color1  Silver
#property  indicator_color2  Yellow
#property  indicator_color3  Red
#property  indicator_color4  Blue
#property  indicator_width1 3
#property  indicator_width2 3

//---- input parameters
extern int KPeriod=3;
extern int DPeriod=3;
extern int JPeriod=7;

double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
double ind_buffer4[];
double HighesBuffer[];
double LowesBuffer[];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
        IndicatorBuffers(6);
   SetIndexStyle(0,DRAW_HISTOGRAM, 0, 3);
   SetIndexStyle(1,DRAW_HISTOGRAM, 0, 3);
   SetIndexStyle(2,DRAW_ARROW, 0, 1);
   SetIndexStyle(3,DRAW_ARROW, 0, 1);
//----
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
   SetIndexDrawBegin(4,10);
   SetIndexDrawBegin(5,10);
//---- indicator buffers mapping
   SetIndexBuffer(0,ind_buffer1);
   SetIndexBuffer(1,ind_buffer2);
   SetIndexBuffer(2,ind_buffer3);
   SetIndexBuffer(3,ind_buffer4);
   SetIndexBuffer(4, HighesBuffer);
   SetIndexBuffer(5, LowesBuffer);
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("mikahekin");
   SetIndexLabel(0,"Open");
   SetIndexLabel(1,"Close");
   SetIndexLabel(2,"High");
   SetIndexLabel(3,"Low");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int start()
  {
   int    i,k,j;
   int    counted_bars=IndicatorCounted();
   double price;
   
//----
   if(Bars<=10) return(0);
//---- initial zero
   if(counted_bars<0) return (-1);
//---- minimums  counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double min=1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=Low[k];
         if(min>price) min=price;
         k--;
        }
      LowesBuffer[i]=min;
      i--;
     }
//---- maximums counting
   i=Bars-DPeriod;
   if(counted_bars>DPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double max=-100000;
      j=i+DPeriod-1;
      while(j>=i)
        {
         price=High[j];
         if(price>max) max=price;
         j--;
        }
      HighesBuffer[i]=max;
      i--;
     }
//---- mikahekin calcaulation
   i=Bars-JPeriod;
   if(counted_bars>JPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      double sumopen=0.0;
      double sumclose=0.0;
      double close=0.0;
      double open=0.0;
      double high=0.0;
      double low=0.0;

      for(k=(i+JPeriod-1);k>=i;k--)
         {
         sumclose+=Close[k];
         close=sumclose/JPeriod;
         sumlow+= LowesBuffer[k];
         low= sumlow/JPeriod;
         sumopen+=Open[k];
         open=sumopen/JPeriod;
         sumhigh+=HighesBuffer[k];
         high=sumhigh/JPeriod;
         }
         
      ind_buffer1[i]=open;
      ind_buffer2[i]=close;
      ind_buffer3[i]=high;
      ind_buffer4[i]=low;

      i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Z.I. Ich bin ein bisschen besser in mql4 als im Ballett, aber...
 
Zhunko:

1. Ich kann dem nichts hinzufügen. Was immer Sie wollen, geben Sie es zurück.

2. Terminal ignoriert und Ihr Code ignoriert nicht, wenn er so aufgebaut ist. Der Systemaufruf ignoriert sowohl die Parameter als auch den Rückgabewert. Das ist ziemlich offensichtlich. Wohin führt sie in diesem Fall zurück?

Über die Entstehung des Musters können wir nur Vermutungen anstellen. Die Entwickler müssen von der Standard-INT ausgegangen sein.


Ein Tick ist gekommen, das Terminal ruft die Funktion start() des EA auf. Sie geben an, dass der von dieser Funktion zurückgegebene Wert für das Terminal gleichgültig ist. Ist dies irgendwo dokumentiert?
 
KoKoS:

Ich möchte "Alert()" einfügen, um mir mitzuteilen, wenn sich der Trend umgekehrt hat.

Ich möchte "Alert()" verwenden, um mir mitzuteilen, wenn sich der Trend umkehrt.

Z.U. Ich bin ein bisschen besser in mql4 als im Ballett, aber...


Zeilen

#property  indicator_color1  Silver
#property  indicator_color2  Yellow

Ich denke, dass die ersten beiden Puffer der Indikator für einen Trendwechsel sind. Sie haben rote Schilder oben auf den Kerzenhaltern und blaue unten. Nur die gelb-graue Kombination funktioniert als Indikator für eine Trendumkehr. Für sie wird es entsprechend sein:

//---- indicator buffers mapping
   SetIndexBuffer(0,ind_buffer1);// для серого цвета
   SetIndexBuffer(1,ind_buffer2);// для жёлтого цвета
Dort, in den Werten dieser Puffer, graben.
 
Leute, beratet über die Übertragung von Daten durch iCustom. Übergibt den aktuellen kompilierten Wert, wie kann der auf globaler Ebene geänderte Puffer weitergegeben werden? Wenn ich das Datum ändere, wird immer noch derselbe Wert übergeben.
extern bool   shiftdata           = false;
extern string ShiftHistory        = "02.06.2012 00:00";

Indikator gepostet gerade über.....

Oder es ändert sich gar nichts?????

Könnt ihr mir etwas über die Datumsübertragung via iCustom sagen?

 

Bitte helfen Sie, wenn jemand von Ihnen den Code für die folgende Bedingung schreiben kann:

"Wenn eine Order durch TakeProfit geschlossen wurde, nachdem sie einen gleitenden Durchschnitt durchquert hat, dann werden keine weiteren Trades in dieser Richtung eröffnet, bis der Preis den gleitenden Durchschnitt in die entgegengesetzte Richtung durchquert".

Vielen Dank im Voraus für Ihre Hilfe!