|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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) ) { ... } 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 |
|
|||
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); } } } 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); } Ich hoffe, irgendwann hilft es mal jemandem. AVT |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|