Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   mehrere Horizontale Linien (http://www.expert-advisor.com/forum/showthread.php?t=5718)

Traderole 09.06.17 19:54

mehrere Horizontale Linien
 
Hallo,

weiss jemand, wie man mehrere Linien, für z.B. Suppe/Res, erzeugen kann? Man kann ja nur einmal einen Namen verwenden bei ObjectCreate() und ich weiss nicht so recht wie ich das umgehen kann bzw. ich bekomme das nicht programmiert. Ich habe Ansätze gefunden, die den Objektnamen zweiteilen und dann per StringConcetenate wieder zusammen setzen. Der erste teil bleibt praktisch immer unverändert und der zweite teil wird ständig geändert durch z.B. inkrementieren von Zahlen...

traderdoc 09.06.17 21:24

Code:

string Name = "Irgendwas";
for (int i = 0; i <= 10; i++) {
  ObjectCreate(Name + (string)i, ...);
}

Somit werden 11 Objecte gebildet, mit den Namen Irgendwas0 bis Irgendwas10.

traderdoc

Traderole 11.06.17 14:48

Danke für die Hilfe.

Ich habe das so eingebunden in meinen Code. Nun ist aber das Problem, das mir direkt beim ersten Tick 10 Linien anstatt 1 eingezeichnet zur gleichen Zeit und Preis werden und dann ist Schluss..

Wie kann ich das verhindern?

traderdoc 11.06.17 15:30

Code:

//beide Variablen global deklarieren
string Name = "Irgendwas";
int ObjectCounter = 0;

if (falls_eine_linie_gesetzt_werden_soll == true) {
  ObjectCounter++;
  ObjectCreate(Name + (string)ObjectCounter, ...);
  falls_eine_linie_gesetzt_werden_soll = false;
}

Nun fangen die Linien zwar mit dem Index 1 an. Wenn der Indesx mit 0 beginnen sollen, dann muß ObjectCounter++; unter ObjectCreate geschrieben werden.
falls_eine_linie_gesetzt_werden_soll muss nun an der entsprechenden Stelle auf true gesetzt werden, wenn eben eine neue Linie gezeichnet werden soll.

traderdoc

Raul0 12.06.17 10:36

Das einfachste Du postest den Teil Deines Code mit der Objekterstellung, evt. kann Dir per kleiner Eingriff der gesuchte Lichtblick gegeben werden.

Traderole 12.06.17 22:40

Vielen Danke erstmal für die Idee mit dem object counter. das hat funktioniert. Nun bin ich auf ein anderes Problem gestossen. Und zwar rechnet der Indikator alle im Chart vorhandenen Bars. D.h. man bekommt hunderte linen. Wie könnte man das abändern, das er vielleicht nur die letzen 500 bars einbezieht um Highs and Lows zu bestimmen?

PHP-Code:

#property version   "1.00"
#property strict
#property indicator_chart_window

extern int periode_to_next_extremum 20;
int bars_to_check 40;
double ResLevel[], SupLevel[];
datetime ResTime[],SupTime[];
int objectcounter 1;
string NameRES "line";
string TextRES "RES";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   
ArrayResize(ResLevel,1);
   
ArrayResize(ResTime,2);
//--- indicator buffers mapping

//---
   
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 limit;
   
int counted_bars IndicatorCounted();
//---- check for possible errors 
   
if(counted_bars<0) return(-1);
   
limit=Bars counted_bars;

   
//---- main loop 
   
for(int i 1limiti++)
      {
      
//Resistance

      
if(iHighest(NULL,0,MODE_HIGH,bars_to_check,i) == +  periode_to_next_extremum)
         {
         
ResLevel[0] = High[periode_to_next_extremum];
         
ResTime[0] = Time[periode_to_next_extremum];
         
ResTime[1] = Time[periode_to_next_extremum] + 9999999;
         
objectcounter++;
         if(!
ObjectCreate(NameRES + (string)objectcounter,OBJ_TREND,0,ResTime[0],ResLevel[0],ResTime[1],ResLevel[0]))
            {
            Print(
"There must be sth wrong Trend: "GetLastError());      
            }
            else Print(
"Trend has been drawn: ",NameRES + (string)objectcounter);
         if(!
ObjectCreate(TextRES + (string)objectcounter,OBJ_TEXT,0,ResTime[0],ResLevel[0]))
            {
            Print(
"There must be sth wrong Text: "GetLastError());
            }
         if(!
ObjectSetText(TextRES + (string)objectcounter,TextRES + (string)objectcounter,10,"Times New Roman"Red))
            {
            Print(
"There must be sth wrong Change Text: "GetLastError());
            }            
         }
      
//Support

      
}
      
//--- return value of prev_calculated for next call
   
return(rates_total);
  }
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
   {
   
int number_of_objects_deleted ObjectsDeleteAll(0,"",0,-1);
   Print(
"number_of_objects-deleted = "number_of_objects_deleted);
   } 


Raul0 13.06.17 06:16

Über den Main Loop, oder?


PHP-Code:

//500 Bars

if( limit 500 limit 500


//---- main loop 
   
for(int i 1limiti++) 


Traderole 13.06.17 18:38

ok das funktioniert super. danke


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:05 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum