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)
-   -   Objekt bewegen - wie? Gar nicht so einfach.. (http://www.expert-advisor.com/forum/showthread.php?t=6421)

Angel 18.05.19 09:12

Objekt bewegen - wie? Gar nicht so einfach..
 
Mir fehlt irgendwie der "Aha"-Effekt, wie ich ein Rechteck zu den festgestellten Zeitpunkten (Ankerpunkten) bewegen kann. Vielleicht kann mir da jemand mal helfen?!
Code:


int TF=1; //Timeframe M1
datetime Anfang,Ende;

void OnTick()
{

  Anfang=iTime ( _Symbol, M1, 10 );// Ab der letzten 10.ten Kerze auf M1, Kerze ist jetzt mal willkürlich
  Ende=  iTime ( _Symbol, M1, 2 );// Bis zur letzten 2.ten Kerze auf M1, Kerze ist jetzt mal willkürlich

ObjectCreate ( "Rechteck" ,OBJ_RECTANGLE , 0 , Anfang, iLow(_Symbol,TF,6) , Ende, iHigh(_Symbol,TF,6)) ; // 6.te Kerze ist jetzt mal willkürlich
ObjectSetDouble ( 0, "Rechteck", OBJPROP_PRICE1, iLow(_Symbol,TF,6)); // 6.te Kerze ist jetzt mal willkürlich
ObjectSetDouble ( 0, "Rechteck", OBJPROP_PRICE2, iHigh(_Symbol,TF,6)); // 6.te Kerze ist jetzt mal willkürlich
ObjectSetInteger( 0, "Rechteck", OBJPROP_TIME1, Anfang);
ObjectSetInteger( 0, "Rechteck", OBJPROP_TIME2, Ende);
ObjectSetInteger( 0, "Rechteck", OBJPROP_COLOR,clrWhite);   
}

Eigentlich sollte das Rechteck "wandern", und zwar mit fortschreitenden Kerzen eben nach links.
Genauer: Mir schwebt vor, den Zeitraum eines Breakout-Fensters farbig mittels Rechteck zu markieren. Hier ist es mal auf Minutenbasis (Der Zeitraum ist mal gleich). Es könnte sich genauso ein Außenstab handeln. Das Prinzip ist ja gleich. Ich habe das Problem, dass die festgestellte Zeit (Der Anfang / Das Ende) eben immer wieder neu berechnet wird.
Und damit nicht genug, es könnten ja mehrere Rechtecke eingezeichnet werden müssen. Ich habe schon überall gesucht, nach Codeschnipseln usw, wurde aber nicht fündig.
Hat jemand eine Idee?

Leopold 22.05.19 15:00

Was genau passiert? Bekommst du Fehlermeldungen?

Hinweis: Ein Objekt erstellt man normalerweise nur einmal wenn es dann verschoben werden soll. In deinem Code wird versucht das objekt bei jedem Tick zu erstellen.

---Leopold---

AVT 22.05.19 21:39

Generelles Vorgehen bei mir wäre folgendermaßen:
1. Zeiten für Beginn und Ende der Messung festlegen
2. Wenn Zeitraum erreicht, Werte der Messung holen
3. Sobald Werte vorhanden, Objekt mit diesen Werten zeichnen

4. je nach Zeitfenster des Charts die xPosition der Objekte ändern
5. das passiert bei mir, wenn Bar Null/aktuell ist
Beispiel Code aus einem meiner Indikatoren:
Code:

extern int              LabelShift    = 2;  // right shift from current bar (2)

  for(i=5;i>=0;i--) // from oldest to current
  {  // 8<--- Snip ---
      if(i==0 && ShowLabels && !AllOff)
      { 
        CreateLabel("mark1opn","opn."+NameMarket1,Mark1StartCol);
        CreateLabel("mark1clo","clo."+NameMarket1,Mark1StopCol);
        if(ShowPrices)
        {
            ChangeLabelText("mark1opn","opn."+NameMarket1+" "+DoubleToString(Mark1open[i],2) );
            ChangeLabelText("mark1clo","clo."+NameMarket1+" "+DoubleToString(Mark1close[i],2) );
        }
                   
        int LShiftMult=_Period*MinInSec;    // move description by x bars
        datetime ShiftTime=Time[i]+(LabelShift*LShiftMult);
        MoveLabel("mark1opn",ShiftTime,Mark1open[i]);
        MoveLabel("mark1clo",ShiftTime,Mark1close[i]);

      } // ShowLabels
  }

So wie ich hier bei Bar Null die Labels verschiebe, so änderst Du von Deinem Rechteck den 2.Zeitpreis (also den Endpunkt-Preis) um ShiftTime.
Meiner Meinung nach wäre das in einem Timer besser aufgehoben als in der OnTick, die kleinste darstellbare Einheit auf dem Chart ist eine Minute und ich wüßte nicht, warum man da auf Tickebene runtergehen wollte - nur ne Anmerkung.
Ich hoffe, das hilft Dir schon mal weiter. AVT

Angel 26.05.19 10:08

@Leopold:
Stimmt, wird bei jedem Tick gezeichnet. Das könnte einiges an Objekten geben... Eigentlich "wandert" ja ein gezeichnetes Objekt automatisch mit den Kerzen. War , denke ich, ein Denkfehler....

@AVT:
Ja , Deine Lösung scheint recht einleuchtend.
Inzwischen versuchte ich auch, mit "for"-Schleifen zu arbeiten und die Werte der Kerzen im jeweilgen Zeitraum / Timeframe in einem Array zu speichern.
Dabei kam ich nie zu einem zufriedenstellenden Ergebnis, weil seltsame Werte entstanden.
Gerade beim Vergleich mit Kerze x und deren Vorgängerkerze entstehen irgendwann noch vor Erreichen der Zählvariablen "Sprünge".

Guckt mal hier bitte:

Code:

#property copyright "Angel"
#property link      "https://www.mql5.com"
#property version  "1.00"
#property strict

int i;
int z;
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
  for(i=50;i>1;i--)
    {
      for(z=i-1;z>0;z--)
        {
        Alert("  i= ",i,"    z= ",z);
        }
    }
  }

Ich checkte das mal im Strategietester auf H1. Die Ergebnisreihe der i- und z-Werte kann man im Journal sehen.
Wenn ich i=10 setze, dann ist noch alles ok. Aber sobald ich zB i= 50 setze, dann ergibt die Reihe ab ca. i=20 immer unterschiedliche und nicht kontinuierliche Werte. Kann mir das jemand erklären?? Ich meine , das bischen Code, da ist nix drin, was irgendwie querschlägt... es sollten bei i=50 rund 1250 Berechnungen stattfinden. Das ist eigentlich nix... Hat jemand Rat? Eine verschachtelte "for-Schleife" mit festgelegten Werten i=50 und z=i-1 kann doch kein Eigenleben haben?!?!?
Bitte macht Euch mal den Spaß , ladet den EA und seht selbst...!? Oder hat mein MT4 einen Hau weg?!:(:confused:
Ich werde dieses Teilthema als separaten Beitrag bringen.

Angel 26.05.19 11:13

Ich habe mal nur auf die i-Schleife und i=50 reduziert:
Ab dem 5.ten Durchlauf (Also 5 x die i-Schleife durchlaufen) fangen die unregelmäßigen Werte an.
Und der Beginn der Anomalie ist stets unterschiedlich!
Ich weiß echt keinen Rat mehr.

Code:

#property copyright "Angel"
#property link      "https://www.mql5.com"
#property version  "1.00"
#property strict

int i;
int z;
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
  for(i=50;i>1;i--)
    {
        Alert("  i= ",i,"    z= ",z);
    }
  }


Angel 26.05.19 23:24

Ich habe nun mal versucht, eine NewBar-Funktion einzubauen, die alle 60 Minuten eine neue Kerze anzeigt. Die oft zu sehende Time[]-Funktion seheich nicht als so toll an, da die Kerze sich immer nur auf den aktuellen Chart bezeiht und ich gerne alles einstellen können möchte, in Drop-Down-Menüs etc.
Hier habe ich zur Vereinfachung einfach 60 eingetragen - für 60 Minuten.
Also der Code soll alle 60 Minuten die beiden Schleifen 1 x durchlaufen.
Das tut er auch - aber nur 1 x und zwar das erste Mal, nur bei der ersten Stunde. Obwohl ich im Strategietester einen ganzen zu testenden Tag einstellte. Was mache ich denn nur falsch?!?!?!?

Code:



datetime dt;
bool NewBar;
int i;
int z;
int y;
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  { 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+


  static datetime dt;
  if(dt!=iTime(_Symbol,60,0)) //Alle 60 Minuten soll auf neue Kerze geprüft werden
    {
      dt=iTime(_Symbol,60,0);
      NewBar=true;
    }

  if(NewBar==true)
    {
      for(i=25;i>1;i--) // Erste Schleife; Soll alle 60 Minunten 1 x durchlaufen werden
        {
          for(z=i-1;z>0;z--) // Zweite Schleife; Anfang soll i-1 sein
          {
            y=y+1;//Einfache Zählvariable zur Kontrolle

            Alert("  i= ",i,"    z= ",z,"  y= ",y,"  dt= ",dt);//Ausgabe der benutzten Variablen zur Kontrolle

       
          }
        }
    }
  NewBar=false;
  }


Angel 27.05.19 08:48

Ok. Jetzt habe ich ab Montag, Handelsbeginn, im Strategietester weiter gestestet. Immer noch seltsame Ergebnisse und das eingebaute Zeitglied wurde nicht angebsprochen, d.h. der Zeitraum belief sich auf den ersten Tick nach einer Stunde.
Umstellung von 1 Stunde auf 1 Minute brachte nichts.
Jetzt, im real-Betrieb, wo "Alert" nicht im Journal des Strategietesters ausgegeben wird, sondern im "Live-Alamfenster" des MT4, wird jede Minute eine neue Berechnung durchgeführt, sprich : Brav die For-Schleife durchgerechnet. Und zwar richtig und exakt! Wenn auch nur ca. 1 - 4 Sekunden verzögert,obwohl nach jeder neuen Minute einige Ticks erschienen, die wohl - unglaublicherweise - einfach "verschluckt" wurden.
Warum die unterschiedlichen Ergebnisse im Strategietester vs. Realbetrieb existieren, erschließt sich mir nicht - ich kann nur die Konsequenz daraus schließen, dass
a) ein Testen eines EA im Strategietester im Allgemeinen und am Wochenende im Besonderen nur bedingte bis gar keine Aussagekraft besitzt
b) eine Handelsentscheidung (bzw. im EA) auf Tickbasis unnsinnig ist, da einige Ticks nicht berücksichtigt / verschluckt werden, obgleich sie im Chart auf M1 zu sehen sind. Ob dies brokerabhängig ist, kann ich nicht sagen. Dies hat jedoch Einfluss auf EAs auf Basis kleiner Timeframes.

Beinahe faszinierend (oder erschreckend, ich bin hin- und hergerissen) finde ich, dass mein Broker "Leverate" / Direktbroker-FX trotz Anmahnung den gesamten Montag (!) die Ticks zwar in Echtzeit liefert, aber 5 Minuten später beginnt, d.h. Forex sonntags um 23:05 Uhr, was für die Montage erheblichen Einfluss auf die Kerzengestaltung / Aussehen haben kann (Und dies auch oft so ist). Auf M5 kann man dann montags gar nichts entscheiden, da mein M15 oder H1 anders aussieht als in Australien oder US oder eben bei anderen Brokern, deren Handelsbeginn eben um 23:00 Uhr beginnt. Sehr unbefriedigend, aber ich habe ohnehin vor, zu wechseln. Der Spread im EURUSD von 2-3 Pipetten bei Kommission von 2,4 pro Lot wird wohl eben auf diese Art und Weise erkauft.


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:31 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