[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 325

 

Können Sie mir sagen, wie ich bei einem Anstieg der Differenz zwischen zwei EMAs (Fünf-Tage-Minimum und -Maximum) bei der maximalen EMA long verkaufen und bei der minimalen EMA short kaufen soll?

Ich verwende"Rastvor" in der Kopfzeile der globalen Variable als die Differenz zweier EMAs .

Wie schreibe ich diesen Code in die Handelskriterien?

 
Fox_RM:

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


Die Frage ist natürlich eine Nullfrage, ABER.

1. Warum werden die Volumina im Indikator korrekt angezeigt?

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

Ich danke Ihnen!


Bei der Deklaration eines Arrays (nicht eines Puffers) sollten Sie dessen Größe explizit angeben.... Zumindest.
 
Fox_RM:

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


Die Frage ist natürlich eine Nullfrage, ABER.

1. Warum werden die Volumina im Indikator korrekt angezeigt?

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

Ich danke Ihnen!

1.
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
Beide Arrays, die Sie verwenden, sind mit Indikatorpuffern verbunden, d.h. ihnen wird (wenn auch implizit) Speicher zugewiesen
SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);

Für dieses Array(Vol_Arr[]) wird weder statisch noch dynamisch Speicher zugewiesen.

2. Soweit ich aus dem Code ersehen kann, wird die Differenz von MA und nicht Volumen im ArrayAOBuffer3[] berechnet

   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;
}

Die Bände werden inExtMapBuffer1 gezählt.

Vol_Arr[] kann als globales Array oder mit einem statischen Modifikator initialisiert werden - die Wahl liegt bei Ihnen, aber Speicher sollte auf jeden Fall zugewiesen oder mit dem Indikatorpuffer verknüpft werden, ebenso wie die beiden vorherigen Arrays - um nur einige Varianten zu nennen.

 
VladislavVG:
1) Beide Arrays, die Sie verwenden, sind mit Indikatorpuffern verbunden, d.h. der Speicher ist für sie reserviert (wenn auch implizit).

......

Vladislav, ich habe den Code noch einmal überprüft. Ein Teil des Codes mitVol_Arr[]war von der alten Version des Indikators übrig geblieben, ich habe ihn gelöscht.

Ich glaube, der Fehler ist immer noch in diesem Teil des Codes, aber ich verstehe nicht, wo! Ich habe diesen Teil des Codes ausführlicher auskommentiert.

 
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  --- Ищу самый высокий бар и определяю время этого бара // -- пока значение  tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}    --- Ищу самый низкий бар и определяю время этого бара // -- пока значение  tmlw = 0
  } 
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);  //-- Здесь считаю общее количество баров от наименьшего до наибольшего значения // -- пока значение  colbr = 0
  
  int shift=iBarShift(NULL,0,tmlw); // -- Это точка отсчета
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));} //-- Значению VLUP суммируем все объемы начиная от самого низкого бара до самого высокого бара // -- Значение  VLUP = 47

Abbildung 2

 
Fox_RM:

Vladislav, ich habe den Code noch einmal überprüft. Ein Teil des Codes mitVol_Arr[]war von der alten Version des Indikators übrig geblieben, ich habe ihn gelöscht.

Ich denke, dass der Fehler immer noch in diesem Teil des Codes liegt, aber ich weiß nicht, wo! Ich habe diesen Teil des Codes ausführlicher kommentiert.

OK, posten Sie den vollständigen Code erneut, der jetzt funktioniert - mal sehen.
 

Hier ist sie:

#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;
}
  }
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) //Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  //--- Ищу самый высокий бар и определяю время этого бара // -- пока значение tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) //Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}   // --- Ищу самый низкий бар и определяю время этого бара // -- пока значение tmlw = 0
  } 
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);  //-- Здесь считаю общее количество баров от наименьшего до наибольшего значения // -- пока значение colbr = 0
  
  int shift=iBarShift(NULL,0,tmlw); // -- Это точка отсчета
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));} //-- Значению VLUP суммируем все объемы начиная от самого низкого бара до самого высокого бара // -- Значение VLUP = 47
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
  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); 
  }
  
  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);
 }

Nochmals vielen Dank!

 
Fox_RM:

Hier ist sie:



Auf einen Blick:

   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;
}
  } // здесь цикл закончился
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) //Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  //--- Ищу самый высокий бар и определяю время этого бара // -- пока значение tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) //Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}   // --- Ищу самый низкий бар и определяю время этого бара // -- пока значение tmlw = 0
  } 

Das hervorgehobene Fragment befindet sich außerhalb der Schleife und verwendet den Schleifenzähler i - entweder stimmt etwas mit der Logik oder mit der Implementierung nicht

 
hoz:

Warum brauchen Sie die Zahlen als CSV-Dateien?

Wird zum Testen und Debuggen von Erkennungsalgorithmen benötigt.

hoz:

Schreiben Sie sie selbst, um sie zu verstehen, anstatt sie von jemand anderem zu übernehmen.

Was genau schreiben? Sie meinen, dass Sie die Formen auf dem Diagramm selbst markieren und die entsprechenden Abschnitte der Geschichte exportieren? Diese Lösung ist die erste in der Warteschlange, aber ich hoffe immer noch, dass jemand sie bereits umgesetzt hat. Schließlich ist es ja nur eine lästige Pflicht.

hoz:

Reichlich bedeutet nicht besser!

Dem möchte ich widersprechen. Je größer die Testreihe ist, desto zuverlässiger ist das Ergebnis des Programms.


p.s. Die Frage ist immer noch gültig.(Siehe Frage in diesem Beitrag)

 

Hallo zusammen!!!

Könnten Sie mir bitte sagen, welcher Code erforderlich ist, um einen Long-Close auf dem Maximum des aktuellen MA zu machen.

Nachstehend finden Sie die aktuellen Handelskriterien, wobei die unklaren Punkte rot hervorgehoben sind.

Es ist auch nicht klar, wie man das Programm anweist, eine Position zu verlassen,

nachdem die Differenz zwischen MA1 und MA2 vergrößert wurde?

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

if ( iHigh (Symbol(),Period(),0) >= MA_1_t) //
{
Opn_S=true;
}
if ( iLow (Symbol(),Periode(),0) <= MA_2_t) //
{
Opn_B=true; // Kaufkriterium öffnen
}
if(welcher Code ist erforderlich, um einen Long-Close beim heutigen iMA-Maximum zu machen?? )
{
Cls_B=true;
}
//--------------------------------------------------------------- 6 --

 
VladislavVG:


Nur ein kurzer Blick:

Das hervorgehobene Fragment befindet sich außerhalb der Schleife und verwendet den Zähler der i-Schleife - entweder stimmt etwas mit der Logik oder mit der Implementierung nicht


Vielen Dank, Vladislav! Es hat etwas zu funktionieren begonnen. Aber aus irgendeinem Grund nur so! :(

Abbildung 3

Eine weitere Frage: Warum werden die Textbeschriftungen nicht im Indikatorfenster angezeigt?

// -- Процедура
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); 
  }
// -- Обращение
SetText("Awesome_super_volumes", DoubleToStr(VLUP,0), tmhgh, dist, Black);