Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools  
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4444
Beiträge: 40490
Benutzer: 6.837
Aktive Benutzer: 266
Links: 80
Wir begrüßen unseren neuesten Benutzer: beacher
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 2 Tagen
- beacher
vor 3 Tagen
- Delemore
vor 4 Tagen
- zipperpetr...
vor 4 Tagen
- BlablaKar
vor 5 Tagen
- viewer

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 152
Gesamt: 152
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #11 (permalink)  
Alt vor 2 Wochen
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 341
AVT befindet sich auf einem aufstrebenden Ast
Smile erster Erfolg: die Listen bleiben im Chart

Ich hänge mal ein Bild an, damit man sich vorstellen kann, wie das ganze aussieht. Dieses Mal habe ich die Reihenfolge der beiden Indikatorlisten vertauscht, also erst die PairList und dann die StrengthList, um zu sehen, ob er jetzt zuerst versucht, alles über die PairList zu finden (tut er übrigens nicht).

Folgendes wurde geändert in PairList2, OnChartEvent (PairStrenth2 ist von Anfang an den Weg über die ObjectGetInteger gegangen):
Code:
   //if(   id==CHARTEVENT_OBJECT_CLICK            //ObjectWasClicked
   //   && StringFind(sparam,PFX+"pName",0)>= 0 ) //sparam=FullButtonName,SubstringFound
   if( id==CHARTEVENT_OBJECT_CLICK )              //ObjectWasClicked
   {
      if( ObjectGetInteger(0,sparam,OBJPROP_TYPE,OBJ_BUTTON) )
      { ... }
Als nächstes habe ich im Terminal unter Extras-Optionen-Objekte die Klickgenauigkeit auf 1 Pixel runtergesetzt (das kann zwar später Probleme geben, wenn ich mal ne Linie im Chart verschieben will - wer trifft schon so genau, wir sind hier ja nicht im Schützenverein - aber gut).

Trotzdem sucht er immer noch zuerst in der StrengthList.
Und es wird immer dasselbe Template benutzt, obwohl auch die unterschiedlich sind.
Nu brauche ich erst mal ne Pause. AVT
Angehängte Grafiken
Dateityp: jpg PairList-StrengthList.JPG (149,1 KB, 4x aufgerufen)
Mit Zitat antworten
  #12 (permalink)  
Alt vor 2 Wochen
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 341
AVT befindet sich auf einem aufstrebenden Ast
Talking Das Ende vom Lied

Alles mehr oder weniger ok jetzt.

Mehr weil die anfänglichen "leaked strings left" verschwunden sind.
Wie allerdings die Anzahl der leaked strings zustande kommt, wird wohl ewig im Closed Code des MT versteckt bleiben,
sie haben jedenfalls weder eine Verbindung zu irgendwelchen ArraySizes, noch zu den Namensstrings.

Mehr weil jetzt auch das richtige Template für die entsprechende Tabelle benutzt wird.

Weniger weil im Logfile immer noch Meldungen auftauchen, daß zuerst versucht wird, einen PairList Button in der StrengthList zu finden.

Ich bin das ganze folgendermaßen umgangen:
1. In OnChartEvent wird nur ein Chart geöffnet, wenn der gefundene Paarname durch den im Array stehenden Name bestätigt wird.
Code:
// ======================= PairStrength
void OnChartEvent(const int id,         const long &lparam,
                  const double &dparam, const string &sparam )
{
   if( id==CHARTEVENT_OBJECT_CLICK ) {
      if(ObjectGetInteger(0,sparam,OBJPROP_TYPE,OBJ_BUTTON)) {
         bool IsHeader=(StringSubstr(sparam,StringLen(PFX)+2,4)=="head");
         if(IsHeader) { ObjectSetInteger(0,sparam,OBJPROP_STATE,false); }
         else {
            string ToOpen=FindpsButtonPair(sparam);
            if( ToOpen =="") ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
            else             OpenChart( ToOpen ); //HaveVerifiedName,Open
            ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
         }
      }
   }
}
// ======================= PairList
void OnChartEvent(const int id,         const long &lparam,
                  const double &dparam, const string &sparam )
{
   if( id==CHARTEVENT_OBJECT_CLICK ) {
      if(ObjectGetInteger(0,sparam,OBJPROP_TYPE,OBJ_BUTTON)) {
         string ToOpen=FindplButtonPair(sparam);
         if( ToOpen =="") ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
         else             OpenChart( ToOpen ); //HaveVerifiedName,Open
         ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
      }
   }
}
Ich habe übrigens in anderen Codes im ChartEvent mal einen "return;" gesehen, der hat aber m.M. nach dort nichts zu suchen: wenn ein Event auftaucht, wird eine Aktion gestartet, da gibt es nix zu returnen, die Aktion bestimmt wann was wo returned wird - oder

Die Namensfindung und Verifizierung passiert nun so (ja, ich weiß, daß KeepEmpty nicht erforderlich ist, aber sicher ist sicher):
Code:
// ======================= PairStrength
// Buttons for a pair are named: FXpsL_11_/12_/13_/14_/21_/22_/23_/24_PairName
// the extracted name is already a string and can (theoretically) be used directly
string FindpsButtonPair(string ButtonName="FullButtonName")
{
   string Result="";
   int Startposition=StringLen(PFX)+3; //FXpsL_+xx_
   string PairName=StringSubstr(ButtonName,Startposition); //StartTillEnd
   /* dirty workaorund if PairList is loaded on the same chart:
      MT4 always calls this list for finding pair name to open chart,
      although buttons are named differently, so ==>
      check the found name against the name in the SSpsTable
   */
   for(int i=0; i<ApsLoopLimit; i++)
   {
      if(PairName==SSpsTable[i].SpsPairName) {
            Result=PairName; //VerifiedByListName
            break;
      }
      else { Result=""; }    //NotInList,KeepEmpty
   }
   return(Result);
}
// ======================= PairList
// Buttons for a pair are named: FXplist_pName0/1/2/3/.../27
// the number must be looked up in the SSplTable to find the fitting name for the no
string FindplButtonPair(string ButtonName="FullButtonName")
{
   string Result="";
   int Startposition=StringLen(PFX+"pName"); //FXplist_pName +No
   string PairNumber=StringSubstr(ButtonName,Startposition); //"PFX_pName"ToEnd
   int    PairInteger=(int)StringToInteger(PairNumber);
   string PairName="";
      if(SSplTable[PairInteger].SplPairName!="") 
           { PairName=SSplTable[PairInteger].SplPairName; } //VerifiedByListName
      else { PairName=""; }                                 //NotInList,KeepEmpty   
   Result=PairName;
   return(Result);
}
Zum Schluß werden alle Printzeilen auskommentiert, damit ist Ruhe im Logfile - so nach dem Motto "was der User nicht sieht, beunruhigt ihn nicht". Ist zwar eigentlich nicht nicht meine Art, aber man muß auch mal Fünfe grade sein lassen.
Ich hoffe, irgendwann hilft es mal jemandem. AVT
Mit Zitat antworten
Antwort

Lesezeichen


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 01:32 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2020 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------