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

 

Hallo zusammen!

Ich habe einen Monat lang MQL4 Expert Advisor studiert und beschlossen, einen Expert Advisor zu schreiben. Ich wollte keinen neuen schreiben, weil mir die Erfahrung fehlt, und beschloss, die Vorlage tradingexpert.mq4 aus dem Buch zu verwenden.

Der Kern der Strategie ist folgender: ein Drei-Balken-System von "Larry Williams"-Hochs und -Tiefs, zwei Drei-Tages-EMAs für Hochs und Tiefs einzeichnen, verkaufen

zu den Höchstständen und kauft zu den Tiefstständen.

In der Vorlage habe ich im Abschnitt der globalen Variablen die Zeile extern double Rastvor =28.0; entfernt (eigentlich wird sie nicht benötigt) und sie auch aus den Handelskriterien entfernt.

Die MA-Werte in den globalen Variablen wurden auf 3 geändert:

extern int Zeitraum_MA_1= 3; // Zeitraum MA 1
extern int Zeitraum_MA_2= 3; // Zeitraum MA 2

Im Abschnitt über die Handelskriterien hieß es:

//--------------------------------------------------------------- 5 --
   // Торговые критерии
   MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_1
   MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_2
 
   if (MA_1_t > MA_2_t + Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1_t < MA_2_t - Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 
geworden ist:

//--------------------------------------------------------------- 5 --
// Handelskriterien
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,0); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,0); // MA_2

if (PRICE_HIGH * Point >= MA_1_t * Point)
{
Opn_S=true;
Cls_B=true;
}

if (PRICE_LOW * Point <= MA_2_t * Point)
{
Opn_B=true; //Öffnungskriterium. Kaufen
Cls_S=true; // Kriterium für den Abschluss. Sell
}
//---------------------------------------------------------------

Nun zum Kern des Problems: Das System öffnet nur Verkaufsaufträge, will aber nicht kaufen. Worin kann der Fehler liegen?

Es ist gut möglich, dass es irgendwo anders Fehler gibt, bitte urteilen Sie nicht zu hart, sondern helfen Sie mit Ratschlägen)

 
Forexman77:


//--------------------------------------------------------------- 5 --
// Handelskriterien
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,0); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,0); // MA_2

if (PRICE_HIGH * Point >= MA_1_t * Point)
{
Opn_S=true;
Cls_B=true;
}

if (PRICE_LOW * Point <= MA_2_t * Point)
{
Opn_B=true; //Öffnungskriterium. Kaufen
Cls_S=true; // Kriterium für den Abschluss. Sell
}
//---------------------------------------------------------------

Nun zum Kern des Problems: Das System öffnet nur Verkaufsaufträge, will aber nicht kaufen. Worin kann der Fehler liegen?

Es ist durchaus möglich, dass ich an anderer Stelle Fehler habe; bitte urteilen Sie nicht, sondern helfen Sie mir mit Ratschlägen).



Was ist das? PRICE_LOW und PRICE_HIGH. Es handelt sich um ganzzahlige Konstanten mit den Werten 0 oder 1 bis 6.

Sie müssen iHigh(Symbol(),Periode(),i) verwenden, um den maximalen BID-Wert von Bar i zu erhalten, und iLow(Symbol(),Periode(),i), um den minimalen BID-Wert von Bar i zu erhalten.

Wenn der aktuelle Balken fällt, dann: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) Und es ist nicht nötig, MA mit Point zu multiplizieren.

 

Guten Tag an alle!

Bitte sagen Sie mir, wo das Problem liegt.

Ich habe einen Volumenindikator (Volume) an den Awesome-Standardindikator angehängt.

Ich möchte die Berechnung des Gesamtwellenvolumens organisieren (gezählt vom Tiefst- bis zum Höchstkurs und entspricht dem Min- und Max-Wert von Awesome). Siehe Abb. 1.

Abbildung 1

Was ist der Fehler, die Werte werden nicht gezählt.

Nachstehend finden Sie den Code selbst.

#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  SteelBlue
#property  indicator_width1  2

//---- basic fan indicator parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=2;
extern bool Show_Volume=true;
extern double coaf=1.5;
extern bool Show_Vol_line=true;
//---- indicator buffers
double AOBuffer3[];
double ExtMapBuffer1[];


double VLUP;
   double prhgh_e=0, prhgh_s, prlw_e=0, prlw_s;
    datetime tmhgh, tmlw;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
  string name_ind = "Awesome_super_volumes";
   IndicatorShortName("Awesome_super_volumes");
   
   
//---- AO_fan line 2 (basic)
   if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
   else 
    {Show_AOLine_2=DRAW_NONE; }
   SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexLabel(1,"Volume");
   
  //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

//---- AO_fan line 2 (basic) buffer
   for(int i=0; i<limit; i++)
   {
     
 //---- AO_fan basic line + Volumes
     
      AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
if (Show_Vol_line==true)
{
double Vol_Arr[];


  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;}
//---- dispatch values between 2 buffers
   }
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0)
  {
  prhgh_s = High[i];
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0)
  {
  prlw_s = Low[i];
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);     
  
  int shift=iBarShift(NULL,0,tmlw);
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));}
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
//-- Эти значения должны отображаться в окне Awesome
  SetText2("Волна1",DoubleToStr(VLUP,0),980,10,Gray,10); 
  SetText2("Волна2",TimeToStr(tmlw,0),980,25,Gray,10); 
  SetText2("Волна3",TimeToStr(tmhgh,0),980,40,Gray,10);
  SetText2("Волна4",DoubleToStr(colbr,0),980,55,Gray,10);  
  
  
      
//---- done
   return(0);
  }
//+------------------------------------------------------------------+
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
 // if (ObjectFind(name)!=-1) ObjectDelete(name);
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 10, "Times New Roman", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }
  
//--Ввeл дополнительную процедуру для отображения значений на чарте. Ее не должно быть.
  void SetText2(string name, string text, int xdist, int ydist, color c, int size) 
 {                                                                                    
  ObjectCreate(name,OBJ_LABEL,0,0,0,0,0);     
  ObjectSet(name, OBJPROP_XDISTANCE, xdist);
  ObjectSet(name, OBJPROP_YDISTANCE, ydist);    
  ObjectSetText(name,text,7,"Arial Black",c);
 }
 
Sepulca:


Was ist das? PRICE_LOW und PRICE_HIGH. Es handelt sich um ganzzahlige Konstanten mit dem Wert 0 oder 1 bis zu 6.

Sie sollten iHigh(Symbol(),Period(),i) verwenden, um den maximalen BID-Wert für den Balken i zu erhalten, und iLow(Symbol(),Period(),i), um den minimalen BID-Wert für den Balken i zu erhalten.

Wenn der aktuelle Balken stürzt, dann: if ( iHigh(Symbol(),Periode(),0) >= MA_1_t) Und es ist nicht nötig, MA mit Point zu multiplizieren.

Herzlichen Dank!!! Es funktioniert!!!
 

Leute, kann mir jemand sagen, was mit dem Code falsch ist?

 
Fox_RM:

Leute, kann mir jemand sagen, was mit dem Code nicht in Ordnung ist, bitte!


if (Show_Vol_line==true)
{
double Vol_Arr[]; // ошибки: 1. Размещение  2. Область видимости


  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;}
//---- dispatch values between 2 buffers
   }
   
 
VladislavVG:


Ich verstehe das nicht ganz. Es gibt aber keine Probleme mit der Lautstärkeanzeige. Es gibt Probleme bei der Berechnung von Volumina. Irgendwo hier drin.

 //-- Поиск High & Time  
  if (AOBuffer3[i]>=0)
  {
  prhgh_s = High[i];
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];} // -- tmhgh - выводил это значение оно = 0;

  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0)
  {
  prlw_s = Low[i];
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);    tmlw - тоже = 0; Почему?
  
  int shift=iBarShift(NULL,0,tmlw);
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));}
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
asdfgh001:

Guten Tag!

Meine Frage wird ein wenig vom Thema abweichen.

Können Sie mir bitte sagen, ob es möglich ist, irgendwo die Aufteilung von TA-Formen als CSV-Dateien zu finden? Ich kann txt, xls oder jedes andere Format verwenden, das sich programmatisch verarbeiten lässt.

Es gibt Beispiele von TA-Figuren in verschiedenen TA-Artikeln, Lehrbüchern, aber natürlich als gewöhnliche Bilder. Hat jemand mehr oder weniger große Sätze von TA-Symbolen als ein Stück der Geschichte eines Währungspaares in den Zeiträumen H1-H4 gespeichert, sagen wir?

Ich habe gegoogelt und nichts gefunden. Natürlich können wir den Verlauf manuell durchgehen, die Formen markieren, diesen Teil des Verlaufs als .csv exportieren, die erforderliche Anzahl von Malen wiederholen und am Ende die Formenbasis sammeln. Aber wenn das schon jemand gemacht hat, würde ich gerne Zeit sparen.

Vielen Dank im Voraus :)


Warum brauchen Sie die Formen als CSV-Dateien? Eine Form-Bibliothek schreiben... Schreiben Sie sie selbst, damit Sie sie verstehen können, und leihen Sie sie nicht von jemand anderem aus. Viel ist nicht gleichbedeutend mit besser!
 
Fox_RM:


Ich verstehe das nicht ganz. Aber es gibt kein Problem mit der Anzeige von Volumen. Es gibt ein Problem mit der Mengenzählung. Irgendwo hier drin.


1. Das Array muss platziert werden, d. h. es muss Speicher zugewiesen werden. Andernfalls können die Werte einfach nirgendwo gespeichert werden ;).

2. Wenn Sie ein neues Häkchen erhalten, wird Ihr gerade platziertes Feld neu positioniert/neu initialisiert. Das hat mit dem Anwendungsbereich zu tun. Um dies zu verhindern, muss das Array vom Typ "static" sein.

Lesen Sie etwas über die Grundlagen der Programmierung.

HZ Das Problem mit der Zählung liegt darin, dass ich Sie auf die Fehler bei der Array-Nutzung hingewiesen habe.

 
VladislavVG:


1. Ein Array muss lokalisiert werden, d.h. es muss Speicher zugewiesen werden. Andernfalls gibt es einfach keinen Platz zum Speichern von Werten ;).

2. Wenn Sie ein neues Häkchen erhalten, wird Ihr gerade platziertes Feld neu positioniert/neu initialisiert. Das hat mit dem Anwendungsbereich zu tun. Um dies zu verhindern, muss das Array vom Typ "static" sein.

Lesen Sie etwas über die Grundlagen der Programmierung.

HZ Das Problem mit dem Zählen liegt darin, dass ich Sie auf Fehler bei der Verwendung der Felder hingewiesen habe.

D.h.Vol_Arr[] sollte als ein globales Array initialisiert werden, wie ich es verstehe.


Die Frage ist natürlich eine Nullfrage, ABER.

1. Deshalb werden die Volumina im Indikator auch korrekt angezeigt.

2. Beim Berechnen greife ich aufAOBuffer3[] und nicht aufVol_Arr[] zu.

Ich danke Ihnen!