Kleinerbroker Posted December 19, 2010 Report Posted December 19, 2010 Nachdem der Software-Programmierer seinen Sourcecode geschrieben hat und der Compiler freundliche "0 error(s), 0 warning(s)" zur Antwort gegeben hat , da kann es los gehen .........mit dem debuggen . Denn wie oft macht der SRC trotz fehlerfreiem Compilieren nicht das, was man eigentlich erwartet ? Dabei ist es recht egal , ob man MT4 oder AFL, Basic, Assembler oder F77 programmiert .... Meine SRC machen jedenfalls zu Beginn ihrer Entwicklung sehr häufig geheimnisvolle und unbeabsichtigete Dinge und hüllen sich ansonsten erstmal in nebulöses Schweigen . Der Entwickler braucht also nun Information über den Wert und die Veränderung seiner Variablen die über den Verlauf des Programmes entscheiden .... IF WHEN ELSE usw usw... und zwar ... ,und darauf kommt es an , WÄHREND das Programm/Backtest/Optimierer seine Arbeit verrichtet .... danach ist zu spät . Die Funktion Comment hilft etwas, ist aber im Standard spartanisch : klein, einfarbig , einzeilig . Das Journal ist enorm unübersichtlich , hin-und-zurück-Klicken und zusätzliches Scrollen erforderlich und zeitraubend, gerade wenn mansich mitten im Backtest befindet . Ausserdem räumlich weit vom Chart entfernt ..."im Chart" wäre die Lösung ...ich sehe Preis und Variable zusammen . MT4 erlaubt ja nun beim Backtesten, die Geschwindigkeit von 0 (Pause) bis zum CPU-Maximum zu variieren und da bietet es sich besonderes an , dass man wesentliche Größen in Klartext parallel zum Geschehen im Chart sehen kann/könnte . Bislang habe ich zwei Möglichkeiten gesehen, wie sich das gestalten läßt , leider aber habe ich nicht erlebt, wie alles zusammen auf meinem PC funktionierte : Der SRC-Code eines EA (nicht Indi!) , auf meinem PC compiliert und dannauch dort durch einen BT gelaufen .1.) Mit Comment mehrzeilige Ausgaben in das Preischart hinein, meiner Meinung nach die zweitbeste Alternative .2.) Mit der Function Inform aus dem MQl4 Buch : http://book.mql4.com/build/info . Diese Funktion soll über #include in das Programm "usualexpert.mq4" importiert (include) gezogen werden . Bei mir klappt das aber nicht, NULL . Konzept jedenfalls ist es hier, und das sehe ich als das Optimum an, dass man ein Indifenster zusätzlich öffnet (automatisch via EA wäre toll, scheint aber auch nicht zu gehen) und dann in diese Fenster Text via "ObjectCreate/-set" einspielen kann . Wie gesagt, ich bekomme davon garnichts ans Laufen obwohl ich einfach nur das Handbuch nachgemacht habe ..... und natürlich freundliche "0 error(s), 0 warning(s)" zur Antwort bekam . Dieser Thread beabsichtigt nun , dem kleinenBroker aus der Patsche zu helfen (selbstlos wie der so ist ) aber auch ganz allgemein aufzuzeigen, welche Mittel dem MT4-Programmierer zur Verfügung stehen um durch temporäre Ausgabe von Inhalten ihm sein Tätigkeit des Debuggens zu erleichtern . Also ... an die erfahrenen MT4-Programmierer... bitte helft uns . Wäre schon arg nett . Kleinerbroker Quote
Kleinerbroker Posted December 19, 2010 Author Report Posted December 19, 2010 Print() führt zu einer Ausgabe von Inhalten nach Wunsch mit jeder Candle , zumindest wenn es sich um den BT handelt . Siehe bitte das Bild . Auch die Aussage mit Comment()in der mir bekannten Forum führt zu kaum lesbaren Textausgaben , ebenfalls im Chart dargestellt . Mir schwebt im Idealfall eher etwas vor, wie ich es bei kreslik.com (TRO_Dashboard_SupResPct) gefunden habe . Siehe andere Bild KBTraum() . KB Quote
Kleinerbroker Posted December 19, 2010 Author Report Posted December 19, 2010 Bleiben wir doch bei dem Beispiel und versuchen einen Code zu erarbeiten : Das Ergebniss sollte vielleicht erst einmal wie folgt aussehen damit es nicht so schwierig undgeschmackvoll wird wie das Beispiel oben . Also so wie angehangen . Da hat der KB manuell ein Indifenster ohne Inhalt eingefügt und genauso manuell mit der Option "T"(Text also) die 4 Wörter eingefügt . Dies an Posi´s imFenster die in beliebig sein können (Geschmack) oder einen Sinn haben (wann ist es NICHT gut zu traden, wann ist es gut?) wie im Beispiel . Der SRC OHNE das Fenster lautet wie folgt : //+------------------------------------------------------------------+ //| Funktionstest.mq4 | //| XX | //| kleinerbroker@XXXXXXXX | //+------------------------------------------------------------------+ #property copyright "XX" #property link "kleinerbroker@XXXXXXX" extern int Tradinghour1 = 9; extern int Tradinghour2 = 12; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if((Tradinghour1 < Hour()) && (Tradinghour2 > Hour())) { Comment("paßt gut"); Print("On time"); } else { Comment("zu Spät"); Print("too late"); } // //---- return(0); } //+------------------------------------------------------------------+ Hier müßte nun ein Befehl hinein, der erstmal das Fenster öffnet (#property indicator_separate_window // Separate indicator window), definiert und dannabhängig von den Variablen Hour, Tradinghour1 & 2 dann eben den Text hineinschreibt .Schreibt sich leicht, ich habe keine Ahnung wie ich das in einen EA oder sonst wie integriert bekomme . Bin ich überhaupt auf dem richtigen Weg ?? KB Quote
WOGO Posted December 19, 2010 Report Posted December 19, 2010 Bin ich überhaupt auf dem richtigen Weg ??Debuggen in MQL4 ist ein interessantes Thema. Ohne die richtigen Methoden kann das ziemlich schnell sehr frustrierend sein und ich rede da aus eigener, schmerzhafter Erfahrung.Vorallem auch deshalb, weil man in der Regel den grössten Teil seiner Entwicklungszeit mit Testen und Debuggen verbringt, zumindest geht's mir so. Ich zeig dir mal drei Ansätzte, die ich verwende und mit denen ich bisher alle meine Probleme gelöst habe.Methode 1 Wie von Philipp beschrieben per Print(). Das ist mit Sicherheit die einfachste, flexibelste, aber auch schwer auszuwertendste Variante. Du fügst im Source-Code an der Stelle, wo du eine Berechnung machst, wo du eine Variable abfrägst, oder wo auch immer du den Variablenwert wissen willst ein Print ein und läßt dir den Wert ausgeben. Idealerweise mit Datum/Uhrzeit vorangestellt und zusätzlich mit Filter der Zeit, wann du den Wert wissen willst, also z.B. , wenn du denkst das Verhalten des EA am 02.03.2010 um 00:23:30 kann nicht stimmen, dann aktivierst du die Print-Ausgabe halt nur ein paar Minuten vor bis ein paar Minuten nach dieser Zeit...etwa so: ... if(TimeCurrent()>=StrToTime("2010.03.2 00:10:00") && TimeCurrent()<=StrToTime("2010.03.2 00:30:00")) TestEnabled=true; else TestEnabled=false; ... //Berechung... if(TestEnabled) Print(" Time=",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),"VarName: ",VarName); Dann kannst du dir im Log-File (nicht im Journal, da passt fast nichts rein!!!) bequem den Verlauf deines Variblenwertes anschaun.Nachteil: Wenn du zyklisch über längere Zeit was ausgibst, dann hat dein Log-File ganz schnell mal ein paar Hundert MB. Methode 2Du lässt dir direkt im Chart die Variablen-Werte anzeigen. Das machst du über Text-Objekte, die du einfach an die jeweilige Stelle im Chart schreibst. Ist sehr zielführend, weil übersichtlich, funktioniert aber nur, wenn sich der Wert selten ändert, so dass die Objekte von der Anzahl her in das Chart-Fenster passen.Aktuelles Beispiel, das ich gerade teste:An den Stellen, wo die Zahlen und Sterne erscheinen, wird jeweils ein Wert neu berechnet. Ob das passt seh ich mit dieser Methode sehr einfach, ohne lange durch ein Log-File scrollen zu müssen. Methode 3... und das geht in die Richtung, in die du denkst. Ich erzeuge mir in der oberen rechten Ecke des Charts eine Anzahl von Textlabel (z.B. 10 Stück) und lasse mir an diesen Textlabeln die aktuellen Werte von Variablen, die ich kontrollieren will ausgeben. Du kannst das sicher auch in einem separaten Fenster machen, direkt im Chart ist's halt einfacher.Wenn du dann deinen EA im Strategie-Tester laufen lässt, dann werden dir oben in Echtzeit die Werte ausgegeben.Über den Geschwindigkeitsregler des Backtests kannst du dann einstellen, wie schnell die Berechnung abläuft, so dass du auch bei häufiger Neuberechnung noch was sehen kannst. Zusammenfassend kann ich folgendes sagen:Am schnellsten zu einem Ergebnis kommt man per Print, wird das Problem aber komplexer, so ist Methode 3 am Besten. Methode 2 ist vor allem bei der Entwicklung von komplexen Indikatoren hilfreich, wenn man Zwischenschritte kontrollieren will. Hoffe das hilft dir ein bischen weiter. 3 Quote
Kleinerbroker Posted December 19, 2010 Author Report Posted December 19, 2010 WOGO Dein Post ist auf den Punkt, was ich benötigt habe . Dafür habe vielen Dank vom Kleinenbroker Und läßt mich nur noch eine Rückfrage stellen : Der "Log-File" ..... ist wo ? (ich google´e aber auch gleich bei MQL4.com und werde fündig wie folgt :) Der Log-File muss vom Programmierer selber geschaffen werden und soll wohl unbedingt im Format .csv sein . Ein Beispiel dazu findet sich hier : http://forum.mql4.com/12491 Dort findet sich u.a. der folgende Code der Teil des EA´s sein muss : while(OrderTicket() != 0) { OrderSelect(HistoryCount,SELECT_BY_POS,MODE_TRADES); if(OrderMagicNumber() == ChartID && OrderSymbol() == Symbol()) OpenOrders++; if(OpenOrders > LastOpenCount && OrderTicket() != 0) { string PrintPeriod = PeriodToStr(Period()); string PrintOrder = OrderTypeToStr(OrderType()); FileSeek(Log,0,SEEK_END); WriteLog = FileWrite(Log,TimeToStr(OrderOpenTime()),Symbol(),PrintPeriod,OrderTicket(),PrintOrder,OrderLots(),OrderOpenPrice()); } if(WriteLog < 0) { Err = GetLastError(); Alert("Account Log: Error "+Err+" - "+ErrorDescription(Err)); return(0); } HistoryCount++; } An die Profi´s : Ist das so richtig oder gibt es bessere Beschreibungen und/oder Lösungen ? Kleinerbroker PS.: „Sicher ist, dass nichts sicher ist. Selbst das nicht.“(Joachim Ringelnatz) Ein hübscher Slogan, den Du Dir da ausgewählt hast . Hat er nicht auch von den beiden Kühen gereimt ? "Ich bin ..... , und Du bist ..... , komm lass uns sterben gehen, kumm ?" War doch so, oder ? EDIT um 21:28 : Der Logfile ist im Format ".log" im Ordner "C:\Program Files\MetaTrader - ActivTrades\LOG\" nach Datum sortiert abgelegt . Er dokumentiert alle Handlungen auf dem Terminal . KB 1 Quote
Kleinerbroker Posted December 21, 2010 Author Report Posted December 21, 2010 EDIT um 21:28 : Der Logfile ist im Format ".log" im Ordner "C:\Program Files\MetaTrader - ActivTrades\LOG\" nach Datum sortiert abgelegt . Er dokumentiert alle Handlungen auf dem Terminal . KB Stimmt schon aber stimmt auch wieder nicht . Der PRINT() - Befehl führt beim Backtesten (Strategy Tester) wohl ausschließlich zur Ausgabe im Journal . Ich finde keine Log-Einträge im LOG des Tages . Folgender Code hatte keine Auswirkung auf den Log-File in : "C:\Program Files\MetaTrader - ActivTrades\logs\20101221" nach 21:00 . Aber ich habe um 21:09 eingeloggt und einen BTduchgeführt . { Long=true; Comment("Life um ",Hour()," : ",Minute()," // Signal = ",Long," // Spatz = ",t1," // Trade1 = ",t2," // Trade2 = ",t3); Print("Life um ",Hour()," : ",Minute()," // Signal = ",Long," // Spatz = ",t1," // Trade1 = ",t2," // Trade2 = ",t3); } } else { Comment("Life um ",Hour()," : ",Minute()," // Signal = ",Long," // Spatz = ",t1," // Trade1 = ",t2," // Trade2 = ",t3); Print("Life um ",Hour()," : ",Minute()," // Signal = ",Long," // Spatz = ",t1," // Trade1 = ",t2," // Trade2 = ",t3); return; } Im Bild sieht man, dass ich Einträge sowohl in der CommentZeile als auch im Journal erhalte, das LOG wird nicht geändert . Book.MQL4.com habe ich durchgeguckt wie auch das Forumund muss nun Euch wieder bemühen und hoffe auf Hilfe .Bei der Lektüre im MQL4 habe ich einen Hinweis auf .CSV-Files erhalten ..... ? Mal wieder vielen Dank im voraus ! Kleinerbroker Quote
Vola Posted December 21, 2010 Report Posted December 21, 2010 EDIT um 21:28 : Der Logfile ist im Format ".log" im Ordner "C:\Program Files\MetaTrader - ActivTrades\LOG\" nach Datum sortiert abgelegt . Er dokumentiert alle Handlungen auf dem Terminal . KBIch weiß nicht ob das hilft, habe ja null Plan von der Materie, aber Vola schreibt doch soooo gern... Es gibt 2 Log Dateien. Einmal ActiveTrades > Log und ActiveTrades > Experts > Log Quote
WOGO Posted December 21, 2010 Report Posted December 21, 2010 Es gibt 2 Log Dateien. Einmal ActiveTrades > Log und ActiveTrades > Experts > LogDem Hinweis von Vola ist eigentlich nichts hinzuzufügen... Deine Print-Ausgabe sollte in dem Log im Experts-Verzeichnis stehen. Findest du da nichts, dann hat der Befehl nicht funktioniert. Ich hab aber auch schon mal beobachtet, dass plötzlich nichts mehr in's Logfile geschrieben wurde. Soweit ich das nachvollziehen konnte, war das der Fall, als ich das Logfile im Editor offen hatte und nicht neu geladen...Da half dann MT zu schließen und dann das Log-File zu löschen.Ist aber nicht die Regel und hab ich bisher nur 1x beobachtet. Zu CSV-Files.Das sind Files, die du dir selber erzeugst, vorallem um deine Orders zu dokumentieren. Zum Debuggen sind die aber weniger geeignet. Quote
Kleinerbroker Posted December 21, 2010 Author Report Posted December 21, 2010 Euch Beiden mein Dank . Welch &%$§§(%& Fehler meinerseits . Habe natürlich nun das 2.Log gefunden, verkneife mir die Frage, warum es 2 gibt und konzentriere mich darauf, dass ich nun einige Einträge finde, andere aber nicht , sicher aber einige mehr als das was ich vorher hatte . Also habe ich wieder etwas wo ich weiter arbeiten kann . :-) KB Quote
wingman Posted December 21, 2010 Report Posted December 21, 2010 folgender Vorschlag zur Vereinfachung des Codes: string sLog; sLog="Life um " + Hour() + " : " + Minute() + " // Signal = " + Long + " // Spatz = " + t1 + " // Trade1 = " + t2 + " // Trade2 = " + t3; Comment(sLog); Print(sLog); Wenn Du Deine Infos in eine Stringvariable schreibst sparst Du Dir einen Menge Tipparbeit und mögliche Fehlerquellen. 2 Quote
Mythos Posted December 22, 2010 Report Posted December 22, 2010 Hallo zusammen, zur Warnung: es kann sein das das mein einziger Post in dem Thread fuer laengere Zeit is (wegen Internet und so hier in AUS). zu den Log files: Die zwei Logfiles entstehen aus unterschiedlichen Quellen. Im "Livetrading" siehst du unten die verscheidenen Reiter: deine offenen Trades, History etc. Dort ist auch das "Journal" und "Experts" (oder so, hab grad keinen MT zur hand). Der Inhalt von Journal kommt ins allgemeine Logfile, der Inhalt von Experts in das Logfile im "experts" Ordner. Wenn du einen Backtest machst, werden die Logs nicht mit den offiziellen Live-Logs vermischt, waer ja auch bloed wenn du reale Trades auswertest und nicht weisst was BT und was real war. Ich kanns jetzt nit garantieren aber schau mal im Backtestordner nach ob du Logs findest. Da ich grad keinen MT hab kann i dir leider nit sagen wie der Ordner heisst, ist aber ein Unterordner im MT-Verzeichnis (so wie experts) und wenn du Parameterkonfigurationen im Backtest speicherst kommen sie in einen Unterordner davon, vielleicht hilft das.Der Backtestordner sollte im Prinzip gleich aufgebaut sein wie der reale Experts ordner (nur ohne die Experts), oder ich bin schon zu lange in den Tropen und red nur mehr quark ;) Falls es dort keine Logs gibt: ich glaub ich erinnern zu koennen das man die Logs im Backtest per Klick mit der rechten Maustaste speichern kann. Einen Versuch is es Wert ;) hth Mythos EDIT: Dank deines Screenshots kann ich dir doch sagen wie der Backtestordner heisst: "tester" 2 Quote
Kleinerbroker Posted December 22, 2010 Author Report Posted December 22, 2010 Guten Morgen, Ihr Trader Ihr , es ist wirklich beeindruckend für mich, wie Ihr Euch bemüht . Nochmal meinen Dank , Wogo , Vola, Wingman und Mythos (der Mythos der in den Tropen steckt :-) . Und dann Dank ich nicht mehr, sonst nervt das mehr als alles andere ). Mythos, Dein Beitrag erklärt mir, warum ich nur Teile dessen was ich erwartete im 2.Log gefunden habe Frage können wir später diskutieren : Im Moment wird dieser Thread ein Dialog (und das soll er ja auch) aber später ...würde es da Sinn machen, wenn ich das alles zu einem großen Post konzentriere und einem Admin gebe, der es dann als Post #1 am Anfang dieses Thread einfügt , quasi eine Zusammenfassung für den Einsteiger ? Leute ich habe seit Montag Urlaub , seit Samstag bin ich am proggen und ENDLICH nach Monaten komme ich wieder mit größeren Schritten vorwärts ! Bis später ! KB 2 Quote
Kleinerbroker Posted December 24, 2010 Author Report Posted December 24, 2010 Status Quo . 7 Variablen können dargestellt werden , Name, Wert und Trend . Das funktioniert auch im Strategietester , erfüllt also mein Hauptansinnen perfekt . Durch das variable Tempo kann ich glänzend beobachten , wie sich bestimmte Werte im Laufe der Zeit verhalten . Diese Variablen können im Normalbetrieb auch in einem separaten Indi-Fenster dargestellt werden . Hier muss ich noch die Formate anpassen . Da stecke ich aber nicht viel Zeit hinein, ist für mich eh unwichtig sondern mehr ein "Abfallprodukt". Letzte wirklich verbleibende Problem ist noch, dass das Prg erkennen muss, wenn ich das Konto gewechselt habe . Dann stoppt der EA und ich muss die ganz Station neu starten, bevor er wieder funktioniert . Aber das bekomme ich auch noch gelöst . Und dann habe ich Lösung 3 gemäß Post #5 von Wogo realisiert . Der SRC ist von mir absichtlich so gehalten, dass er möglichst modular ist und somit in alle möglichen EA´s implementiert werden kann . Wenn er steht, dann schicke ich diesen den Admin´s von TN zur Durchsicht . Wenn er für diese dann OK ist, dann poste ich diesen mit der Zusammenfassung die ich in #13 angekündigt habe . So haben dann alle etwas davon . KB Quote
Kleinerbroker Posted December 28, 2010 Author Report Posted December 28, 2010 So, alle Probleme soweit gelöst . Und ich hoffe, dass die Kommentare genug Erklärung liefern .Das Prg ist als EA gehalten und insofern "stand alone" zu betreiben . Aber viel eher wird der User es in seineeigenen Programme einbinden wollen, daher habe ich das meiste modular programmiert und bin auch mit derVariablenbenennung sehr großzügig verfahren (falls sich jemand über meine Prosa im SRC wundern sollte) . Es wird automatisch rechts im Preischart informieren . Das ist gut , insbesondere für Str-test . Findet dasPrg aber ein leeres Fenster "PLOTT" , dann wird es dort ausgeben . Gerne werde ich Fragen beantworten und ggfs auch bischen anpassen wenn gewünscht .Bitte nicht durch die Abfrage "Tradinghour" beeindrucken lassen, sie ist absolut "sinnlos". KB sagt : Danke Euch //+-----------------------------------------------------------------------------------------------+ //| Visualisierung.mq4 | //| WS | //| The aim of the Prg is to easen the work of debugging . "Tradinghour enquiry" is example only !| //| Prg will display in three columns : Name, value & variance in upper right price chart or ... | //| ..... in seperate Indi-Win "PLOTT" if previously opened by user | //| Change in Line : "34 Value 1250 for your screen size"; "48 & 49 for size of rows and text" | //| Change in Line : "60..66 for realname of variable" ; "136...142 for codename of your vars" | //| ... such as " DowJones "in line60 and "CTR_Val_New[0]= DJ " | | //| kleinerbroker@yahoo.de | //+-----------------------------------------------------------------------------------------------+ #property copyright "WS" #property link "kleinerbroker@yahoo.de" // //+-----------------------------------------------------------------------------------------------+ //| Definition of the control-variables which are to be displayed , max allowed : 7 | //+-----------------------------------------------------------------------------------------------+ // extern int Tradinghour1 = 9; // Variable1 .... could be displayed in column1 extern int Tradinghour2 = 23; // Variable2 .... they all are fully //extern int // Variable3 .... optional for user to define //extern int // Variable4 .... whatever she/he intends to //extern int // Variable5 .... debugg/visualize //extern int // Variable6 .... //extern int // Variable7 // //+-----------------------------------------------------------------------------------------------+ //| Definition of the variables which design the output mask | //+-----------------------------------------------------------------------------------------------+ // //------------------ general parameters ----------------------------------------------------------+ color Color[4]; // Declare the color array string Text[7]; // Declare the string-array for column1 int sScreenXClmn[]= {1250,110,150}; // 3 Columns at 18´´Screen, 100 & 85 is relative string // CTR_Val_New[7], // [0]data of controlled variable array Column2 CTR_Val_Old[7]; // previous status of these variables,needed for variance report // in column3 //------------------ code definition--- ----------------------------------------------------------+ int sRaise = 236, // Arrow sDown = 238, // Arrow sNeutral = 232, // Arrow sTrue = 110, // Full Square sFalse = 111, // Empty Square //------------------ definition of mask size : coordinates, rows & columns -----------------------+ Win_PLOTT_old = 0, // Standard output to Price Chart for StratTest sScreenYHome = 000, // Home Y of Mask ,extreme upper of any screen sScreenYStep = 050, // width of all 7 rows sScreenTextHeight = 020; // Height of all text/symbols //+-----------------------------------------------------------------------------------------------+ //| expert initialization function | //+-----------------------------------------------------------------------------------------------+ // int init() { int Win_PLOTT_old=0; // no seperate Window Text[0]= "Hour ="; // Name of control variable , 7 digits max Text[1]= "no Data"; // Name of control variable , 7 digits max Text[2]= "no Data"; // Name of control variable , 7 digits max Text[3]= "Open ="; // Name of control variable , 7 digits max Text[4]= "Close ="; // Name of control variable , 7 digits max Text[5]= "Trade ="; // Name of control variable , 7 digits max Text[6]= "Stopp ="; // Name of control variable , 7 digits max Color[0]= Lime; // Object color for .. Color[1]= Yellow; // .. different situations Long/Neutral/Short.. Color[2]= Red; // .. of the Variables , output in column3 Color[3]= Lime; // Standardtext Create_Maske(0); // Creation of the first mask Main(); return; } //+-----------------------------------------------------------------------------------------------+ //| expert start function | //+-----------------------------------------------------------------------------------------------+ // int start() // Special function 'start' { Main(); // Call to the user-defined function return; // Exit start() } //+-----------------------------------------------------------------------------------------------+ //| expert deinitialization function | //+-----------------------------------------------------------------------------------------------+ // int deinit() { //-- need to delete objects should user remove indicator ObjectsDeleteAll(0,OBJ_LABEL); //-- delete timeframe text labels for(int x=0;x<3;x++) for (int y=0;y<7;y++) ObjectDelete("CTR_VAR"+x+y); Comment(""); WindowRedraw(); // Redrawing the image return(0); } //+-----------------------------------------------------------------------------------------------+ //| expert main function displaying EA-controlling values for debugging | //+-----------------------------------------------------------------------------------------------+ // int Main() { int // Integer variables y=0,Ind_Time=0, Win_PLOTT_new=0; // Scratch number of the subwindow if there was one string Display="Y"; ArrayCopy(CTR_Val_Old,CTR_Val_New); // Saves the preceding values to check trends //ArrayInitialize(CTR_Val_New,"0"); // Zeroize the array // example Tradingssystem condition if((Tradinghour1 < Hour()) && (Tradinghour2 > Hour())) { Comment("paßt gut , aktuelle Zeit = ",TimeToStr(TimeCurrent(),TIME_MINUTES)); Print("On time"); Ind_Time=1;Display="Y"; } else { Comment("zu spät , aktuelle Zeit = ",TimeToStr(TimeCurrent(),TIME_MINUTES)); Print("too late"); Ind_Time=0;Display="N"; } // Informationsfenster füllen Win_PLOTT_new=WindowFind("PLOTT"); // seperate Window "PLOTT" available ? if(Win_PLOTT_new==-1) Win_PLOTT_new=0; // If there is no sep.wind., then the main window if(Win_PLOTT_new!=Win_PLOTT_old) // Deleted or placed .. { // .. the Window "PLOTT" ObjectsDeleteAll(); // Deletion of all Objects obje Create_Maske(Win_PLOTT_new); // Create new mask Win_PLOTT_old=Win_PLOTT_new; // Remember this window } // // Allocation of data => ctrl variables CTR_Val_New[0]= TimeToStr(TimeCurrent(),TIME_MINUTES);// Name of control variable , 7 digits max CTR_Val_New[1]= "0" ; // Name of control variable , 7 digits max CTR_Val_New[2]= "0"; // Name of control variable , 7 digits max CTR_Val_New[3]= DoubleToStr(Open[0],4); // Name of control variable , 7 digits max CTR_Val_New[4]= DoubleToStr(Close[0],4); // Name of control variable , 7 digits max CTR_Val_New[5]= Display; // Name of control variable , 7 digits max CTR_Val_New[6]= Display; // Name of control variable , 7 digits max // for (y=0;y<7;y++) // fill values ObjectSetText("CTR_VAR"+"1"+y,CTR_Val_New[y],sScreenTextHeight,"Arial",Color[3]); // Comparison to previous ctrl variables for (int Y=0;Y<7;Y++) // fill 3rd column ctrl values with trend { if (CTR_Val_New[Y]>CTR_Val_Old[Y]) ObjectSetText("CTR_VAR"+"2"+Y,CharToStr(sRaise),sScreenTextHeight,"Wingdings",Color[0]); else if(CTR_Val_New[Y]<CTR_Val_Old[Y]) ObjectSetText("CTR_VAR"+"2"+Y,CharToStr(sDown),sScreenTextHeight,"Wingdings",Color[2]); else ObjectSetText("CTR_VAR"+"2"+Y,CharToStr(sNeutral),sScreenTextHeight,"Wingdings",Color[1]); } WindowRedraw(); // Redrawing the image return; // Exit the user-defined function "Main" } //------------------------------------------------------------------------------------------------+ //------------------------------------------------------------------------------------------------+ // //+-----------------------------------------------------------------------------------------------+ //| expert object creation : this defines mask and fills first column once for all | //+-----------------------------------------------------------------------------------------------+ // int Create_Maske(int Win) // User-defined function { int u,v,w; if (Win==0) // Output in pricechart (good for strattester use) { // u=sScreenYHome; // v=sScreenYStep; // w=sScreenXClmn[0]; // Reset X // ..creating all Object for(int x=0;x<3;x++) // output : column { // for (int y=0;y<7;y++) // output : all rows in the column { // u=u+v; // next row ObjectCreate("CTR_VAR"+x+y,OBJ_LABEL, Win, 0,0); // Creation of an object ObjectSet("CTR_VAR"+x+y, OBJPROP_CORNER, 0); // Anchoring to an angle ObjectSet("CTR_VAR"+x+y, OBJPROP_XDISTANCE,w); // Coordinate X ObjectSet("CTR_VAR"+x+y, OBJPROP_YDISTANCE,u); // Coordinate Y } // u=sScreenYHome; // Reset Height w=w+sScreenXClmn[x+1]; // count to the next column } // end output in pricechart } // else // { //Output in empty indicator window named "PLOTT" u=sScreenYHome; // v=125; // w=10;//w=sScreenXClmn[0]; // Reset X , ganz links // ..creating all Object for(x=0;x<3;x++) // output : rows { // for (y=0;y<7;y++) // output : all column in the row { // w=w+v; // next row ObjectCreate("CTR_VAR"+x+y,OBJ_LABEL, Win, 0,0); // Creation of an object ObjectSet("CTR_VAR"+x+y, OBJPROP_CORNER, 0); // Anchoring to an angle ObjectSet("CTR_VAR"+x+y, OBJPROP_XDISTANCE,w); // Coordinate X ObjectSet("CTR_VAR"+x+y, OBJPROP_YDISTANCE,u); // Coordinate Y } // u=u+sScreenYStep; // Reset Height w=10; // count to the next row } // } // for (y=0;y<7;y++) // fill first column once ObjectSetText("CTR_VAR"+"0"+y,Text[y],sScreenTextHeight,"Arial",Color[3]); return; // Exit the user-defined function } Damit , so glaube ich, kann man diesen Thread schliessen . Wenn die Admins es für richtig halten, so reicht es aus meiner Sicht wenn man den Post #1, #5 von Wogo und diesen zu einem macht und an den Anfang setzt . 2 Quote
ronner Posted December 28, 2010 Report Posted December 28, 2010 Damit , so glaube ich, kann man diesen Thread schliessen . Wenn die Admins es für richtig halten, so reicht es aus meiner Sicht wenn man den Post #1, #5 von Wogo und diesen zu einem macht und an den Anfang setzt . jeder Thread hat einen Werdegang, daher würde ich es so stehenlassen Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.