|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
DeInit mit reason funktioniert nicht
Ich versuche in DeInit mit Hilfe der reason die erforderlichen Aktionen einzuteilen, leider klappt das nicht.
Die Situation: ich habe im EA 2 unterschiedliche Objektarten, das eine ist die Steuereinheit (besteht aus Button, RectangleLabel und Label) und das andere ist die Aktionseinheit (besteht aus Linien und Buffern, die hier aber unwichtig sind). Code:
// === delete all created objects // === ONLY if we failed to init or if we are deleted from chart if( reason==REASON_PROGRAM || reason==REASON_REMOVE || reason==REASON_CHARTCLOSE || reason==REASON_INITFAILED || reason==REASON_CLOSE ) { for(int i=ObjectsTotal()-1; i>=0; i--) { string obj_name=ObjectName(i); if(StringSubstr(obj_name,0,StringLen(PFX))==PFX) //ExactPFXmatch { ObjectDelete(0,obj_name); } } } // === in other cases keep action objects, only delete the panel // === this will be recreated in OnInit else if( reason==REASON_CHARTCHANGE //ForTimeframeChange || reason==REASON_RECOMPILE //ForWorkingInEditor || reason==REASON_TEMPLATE //ForChangeOfIndicatorCombination || reason==REASON_PARAMETERS //ForChangeOfValues || reason==REASON_ACCOUNT ) //ForLoosingServerConnection { DriveRemoveAll(); } Code:
void DriveRemoveAll() { for(int i=ObjectsTotal()-1; i>=0; i--) { string obj_name=ObjectName(i); if(StringSubstr(obj_name,0,StringLen(PFX))==PFX) //ExactPFXmatch { if(ObjectGetInteger(0,obj_name,OBJPROP_TYPE)==OBJ_BUTTON ) ObjectDelete(0,obj_name); else if(ObjectGetInteger(0,obj_name,OBJPROP_TYPE)==OBJ_RECTANGLE_LABEL ) ObjectDelete(0,obj_name); else if(ObjectGetInteger(0,obj_name,OBJPROP_TYPE)==OBJ_LABEL ) ObjectDelete(0,obj_name); } } } Ich bin momentan komplett ratlos, wieso das nicht funktioniert. Hat jemand eine Idee? Danke. AVT |
|
|||
Bei mir funktioniert das immer.
Wo kommt denn die Variable reason her? Sollte die, warum auch immer, auf Standard 0 stehen, was für REASON_PROGRAMM stehen würde, dann würde auch immer alles gelöscht werden. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Danke traderdoc.
Zitat:
Man kann sie aber auch noch extra printen lassen (wobei es völlig egal ist, ob das am Anfang oder am Ende von OnDeinit steht, das habe ich alles gestestet) mit Print(__FUNCTION__," reason for deinit=",(int)reason); Und die Zahlen, die dann kommen, sind auch der jeweiligen Situation angepaßt, es sind also die korrekten Zahlen für z.B. Timeframe change kommt =3. Sie stehen also nicht permanent auf Null. Das ist ja, was mich so komplett ratlos macht. AVT |
|
|||
vorläufige Lösung
Die erste Lösung war, den EA auf einem leeren Chart laufen zu lassen und gar nichts löschen zu lassen, wird der EA entfernt bleiben halt alle Objekte da - aber da der Chart sonst keine anderen Sachen hat, kann man ihn einfach schließen.
Zweite Lösung ist nun eine Wiederherstellungsfunktion, die aus der sowieso schon vorhandenen Sicherungsdatei sämtliche Aktionslinien neu zeichnet. Das erklärt zwar immer noch nicht, wieso der erste Weg nicht klappt, aber umschifft ihn wenigstens. AVT |
|
|||
Nachtrag Lösung
Endlich dazu gekommen, mich mal daran zu setzen.
Wenn man den Grund für DeInit benutzen will, um unterschiedliche Aktionen zu starten, holt man den Wert über UninitializeReason(). Also so was wie: Code:
switch( UninitializeReason() ) { //ExpertRemove() was called case 0: { CloseMode=0; _CloseOrder(); EventKillTimer(); ObjectsDeleteAll(0,PFX); break; } //Program Deleted From Chart case 1: { CloseMode=0; _CloseOrder(); EventKillTimer(); ObjectsDeleteAll(0,PFX); break; } //Program Recompiled case 2: { break; } // ... und so weiter } aber so geht es auf jeden Fall. Falls jemand mal danach sucht. AVT |
Lesezeichen |
|
|