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 MQL5 (http://www.expert-advisor.com/forum/forumdisplay.php?f=221)
-   -   Einstellung? Cache? (http://www.expert-advisor.com/forum/showthread.php?t=7223)

TraderMike 10.08.22 18:09

Einstellung? Cache?
 
Zum testen habe ich einen EA mit einem manipulierbaren Wert (lot),
manuelle Schritte von 0.10 via Editor, start bei 0.50, beim gleichen Symbol.
Es kommt bei jedem Single Test bei 0.5, 0.6, 0.7, 0.8, 0.9 das identische Ergebnis raus, was alleine wegen der Änderung der Lotgröße nicht sein kann - Anzahl Positionen bleibt natürlich gleich. Zeitraum 1.1.2020 - 6.8.2022

Erst wenn ich alle Unterverzeichnisse nach einem Test aus dem Verzeichniss "Tester" lösche, im Editor einen neuen Wert eingebe und ohne Fehler kompiliere, einen neuen Test starte, kommt auch an anderes Ergebnis raus....

Mit zwei MT5 Broker getestet.

Jemand ähnliche Erfahrungen?

Bei einer Optimierung 0.5-0.9 kommt kompletter Blödsinn raus

TraderMike

Indikator-Trading 11.08.22 14:24

Das kann nur ein Fehler in deinem Code sein. Wenn du den entsprechenden Teil hier teilen würdest, dann könne man dir bei dem Problem bestimmt helfen. Gruß

TraderMike 11.08.22 16:11

Mal davon abgesehen das ich technische Informatik studiert habe, also sowohl die Herstellung von Hardware als auch von Software erlernt habe!

Wiederspricht meine Aussage, das nach dem Löschen der Tester Sub Ordner und der manuellen Änderung Lot Size (kompilieren ohne Fehler) es funktioniert - deiner Aussage.

-Manuelle Änderung, keine Löschung der Tester SubOrdner, immer das gleiche Ergebnis, egal welche manuell Lot Size eingestellt wird. Das Log zeigt immer die Start Lots von 0.5 an, egal was im Editor manuell geändert und kompiliert wurde - Verdacht das irgenwo, irgendwas im Cache liegt

-Manuelle Editor Änderung und Kompilierung, Löschung aller Tester SubOrdner, Ergebnisse ändern sich korrekterweise, Anzahl der Trades in allen 5 Durchläufen gleich, die Balance steigt mit steigender Lot Größe an. OK. Es ist egal on man vorher ändert und dann die Ordner löscht oder umgekehrt.

MT5 wird als Administrator ausgeführt mit Parameter:
/portable
/affinity 80000000
kein VPS
Code nichts Aussergewöhnliches, alles standard, die statischen Variables sind klar, es wird nur LotsBuy1 im Editor global geändert
Code:

int PABuyOrder1=0; trade.SetExpertMagicNumber(Magic);
  PABuyOrder1=trade.Buy(LotsBuy1,NULL,Ask,Ask-(SymbolSL*pt),Ask+(SymbolTP*pt),("PA1B-1/10-"+DoubleToString(SymbolTP,0)+"/"+DoubleToString(SymbolSL,0)+"-"+HLP+"-"+DoubleToString(MultiTP,2)));

  if(PABuyOrder1>0){GlobalVariableSet(Symbol()+"-PAOrd",1); GlobalVariableSet(Symbol()+"-LastTPMulti",MultiTP); GlobalVariableSet(Symbol()+"-BOPrice",Ask); GlobalVariableSet(Symbol()+"-BTPPrice",Ask+(SymbolTP*pt));

    if(time!=iTime(Symbol(),_Period,0)){
      if(PABuyOrder1>0 && SABAlertON)Alert(Symbol()+" Date:"+TimeToString(TimeCurrent())+" " +DoubleToString(LotsBuy1,2)+" PA1BuyOrder1 PA1B-1/10-"+DoubleToString(SymbolTP,0)+"/"+DoubleToString(SymbolSL,0)+"-"+HLP+"-"+DoubleToString(MultiTP,2)," Bid:"+DoubleToString(Bid,4)+" Spread:"+DoubleToString(Spread,1));
      if(PABuyOrder1>0 && SABEmailON)SendMail(Symbol()+" Date:"+TimeToString(TimeCurrent())+" "+DoubleToString(LotsBuy1,2)+" PA1BuyOrder1 PA1B-1/10-"+DoubleToString(SymbolTP,0)+"/"+DoubleToString(SymbolSL,0)+"-"+HLP+"-"+DoubleToString(MultiTP,2)," Bid:"+DoubleToString(Bid,4)+" Spread:"+DoubleToString(Spread,1));
      if(PABuyOrder1>0 && SABPrintON)Print(Symbol()+" Date:"+TimeToString(TimeCurrent())+" "+DoubleToString(LotsBuy1,2)+" PA1BuyOrder1 PA1B-1/10-"+DoubleToString(SymbolTP,0)+"/"+DoubleToString(SymbolSL,0)+"-"+HLP+"-"+DoubleToString(MultiTP,2)," Bid:"+DoubleToString(Bid,4)+" Spread:"+DoubleToString(Spread,1));
      if(PABuyOrder1>0 && SABSoundON)PlaySound(SASExtSoundFileName);
    time=iTime(Symbol(),_Period,0);} }

Das ganze ist ein simpler MT5 Test, das es Probleme mit der korrekten Ausführung dynamischer vektor basierender Verarbeitung von OHLC Daten gibt, wurde mir bereits bestätigt.

Nachtrag:
Und, im normalen Chart läuft alles normal, ist ja auch nicht wirklich was dran an diesem Code, nur der Tester bockt wiedermal

Indikator-Trading 11.08.22 17:52

Der Code den du hier teilst hilft natürlich überhaupt nicht weiter um dein Problem näher einzugrenzen. LotsBuy1 wird dort ja nicht gesetzt und genau dieser Teil des Codes könnte dein Problem evtl. erklären. Ich schreibe und lese auch Daten aus Files im Backtest und im Livetrading und habe bisher keine Probleme damit gehabt.
Allerdings definiere ich die Dateien, welche ich im Backtest nutze auch mit der entsprechenden property, hier ein Beispiel:

Code:

#property tester_file "SYMBOL_DATA\\Spread.csv"

TraderMike 11.08.22 19:28

Zitat:

Zitat von Indikator-Trading (Beitrag 46226)
Der Code den du hier teilst hilft natürlich überhaupt nicht weiter um dein Problem näher einzugrenzen. LotsBuy1 wird dort ja nicht gesetzt und genau dieser Teil des Codes könnte dein Problem evtl. erklären. Ich schreibe und lese auch Daten aus Files im Backtest und im Livetrading und habe bisher keine Probleme damit gehabt.
Allerdings definiere ich die Dateien, welche ich im Backtest nutze auch mit der entsprechenden property, hier ein Beispiel:

Code:

#property tester_file "SYMBOL_DATA\\Spread.csv"

???

Posting #3
"die statischen Variables sind klar, es wird nur LotsBuy1 im Editor global geändert"

extern double LotsBuy1=50; (statische variable, global definiert und via editor global verändert! 0.5, 0.6, 0.7, 0.8, 0.9) - alle variablen sind statisch global definiert in diesem test!

UND im chart verläuft alles ganz normal! nur wieder mal im tester nicht
im besonderen da nur das trade kommando effektiv genutzt wird, die globalen variablen im trade kommando werden zwar geschrieben aber derzeit nicht genutzt, ditto die alerts, erst wenn der statische test im tester funktioniert, kommt stückweise die umstellung auf den dynamischen teil dazu.

Und was mich am tester auch nervt, das im report die einstellungen nicht mehr mitgeschrieben werden. (keine Lust das Html Template zu hacken)

Auch könnte ich mir vorstellen:
der tester liest das/die agent verzeichnisse aus (single test) man sieht ja die komplette history der single tests im reiter übersicht, eventuell hat der tester die letzte einstellung irgendwo im cache, wobei mit /portable müßte er alles im MT5 Verzeichnis ablegen, mit dem löschen der Tester SubOrdner dürfte auch der Cache (Verz.) geleert werden...ausserdem werden viele Datein im Read-Only Modus betrieben, egal ob man Administrator ist oder nicht (könnte ich, aber habe keine Lust die Rechte zu hacken um das Read-Only aufzuheben)

Und nochmals: im Chart läuft es wie es soll!

Bei mir wird wird alles in eine Oracle DB (Unix) geschrieben, ist aber für diesen statischen Test nicht aktiv und nicht einmal MT5 kodiert. UND NUR LIVE+FORWARD (predictive) Daten werden nach der Umstelung verwendet, Backtest Daten werden nicht weiterverarbeitet nur zum Test, keine DB, kein CSV, kein TXT

Indikator-Trading 11.08.22 22:18

ich verstehe nicht was du mit " es wird nur LotsBuy1 im Editor global geändert" meinst. Wenn man den EA auf den Chart zieht und die Settings der extern-Variablen definiert, bzw. wenn du den EA im Strategie Tester den EA laufen lässt und dann die Input Variablen festgelegt hast?

Die extern Variablen kannst du während der Laufzweit des EAs nicht ändern. Du musst den Wert der Variablen in eine lokale Variable kopieren und diese dann im EA ändern.

Änderst du eine der Input Variablen, dann muss der EA neu Initialisiert werden, sonst werden die Änderungen nicht aktiv. So ist es halt. Bei einer Aussage wie " via editor global verändert! " gehe ich von dem Editor von Windows aus und dass du da eine Variable, welche du hier als 'Global' bezeichnest, ausliest aus dieser Datei.

Wenn du input double LotsBuy1 definiert hast und diese dann direkt in der TradeFunktion als Wert für die Lotsize benutzt, dann läuft das im Test genauso wie in Live, sonst würde ja einfach gar nicht laufen, und das ist nicht der Fall.

Schmeißt der Tester eine Fehlermeldung, wenn du die Lotsize auf 0.6 hast? Vielleicht die der LotsizeStep, die MinLotsize oder MaxLotsize nicht auf dem Symbol passend eingestellt, so wie es im Livetrading wäre? Kontrolliere das mal besser ab.

TraderMike 12.08.22 06:04

input = read only!

diese können während der Laufzeit systemisch nicht verändert werden - nur durch manuelle Eingabe im Chart Window, was jedesmal ein ReInit auslößt = manuelle Anpassung! = unbrauchbar für dynamische vorausschauende OHLC Systeme, die sich permanent den geänderten Marktbedingungen anpassen!
Kein A(N)I oder NN System kann mit "input" arbeiten!

Es gibt nichts schlimmeres wenn man die Variablen nicht jederzeit systemisch verändern kann. Statische Variablen sind der Tod in einem dynamischen Markt!

Aber ich habe den Speicher (Hex) ausgelesen, ja MT5 "cached" die letzten Einstellungen via Agent + Cache Folder, nachgewiesen da weiterhin die Log Datei im read-only Modus exklusiv dem Tester vorbehalten ist = man braucht nur MT5 schließen und der Speicher wird freigegeben=Cache geleert.

Und Ja es war der Editor gemeint, ALLE Variablen sind global mit extern double deklariert und werden in diesem Test manuell mittels Editor geändert und jedesmal neu kompiliert.

Ist also ein statischer OHLC Test mit einigen wenigen statischen Variablen.
Im normalen Chart keine Probleme!

Und sollte es einmal notwendig sein während der Laufzeit Variablen manuell ändern zu müssen, würde ich das IMMER entweder über eine Button oder Menü Funktion programmieren NIEMALS über "input"!

TraderMike 12.08.22 07:08

Zitat:

Zitat von Indikator-Trading (Beitrag 46228)
Die extern Variablen kannst du während der Laufzweit des EAs nicht ändern. Du musst den Wert der Variablen in eine lokale Variable kopieren und diese dann im EA ändern.

Das ist Nonsens!

extern = read+write, kein ReInit notwendig
input = read-Only, ReInit notwendig

Jede mit "0" initialisierte externe Variable bekommt während der Laufzeit einen Wert zugeordnet.
Sogar extern Varablen die zum Init einen Startwert haben, können jederzeit neu befüllt werden und müssen NICHT in eine neue (lokal oder global) Variable kopiert werden! (Es braucht halt ein Reset auf "0" bevor man sie neu befüllt! Das vergessen Anfänger gerne)
Und externe Varablen kann man überladen, input nicht! weil sie ja nur read-only sind

input verwendet man wenn man für einen Kunden programiert und der eine manuelle Eingabemaske gerne hätte! Das man Variablen nicht jederzeit be/neu füllen kann ist ein echtes NoGo!

Das ist der tiefere Sinn von input vs. extern!
Kein dynamisches System, inkl. NN und AI verwendet input!

Und lokale Variablen werden immer nur innerhalb einer Funktion verwendet, ansonsten sind sie immer global definiert, egal ob mit "0" oder einem anderen Wert um sie eben global verfügbar zu machen aka anderen Teilen zur Verfügung zu stellen.

z.B. LotsBuy1 könnte ich innerhalb der trade funktion lokal definieren, was aber in einem dynamischen System nicht geht da sich die Lots z.B. dem Markt anpassen, aus welchen Gründen auch immer (Volumen, Vola, Zeit,....) Somit kann man nur Systemweite Variablen mit extern int/double global deklarieren um sie jederzeit verändern zu können!

Das geht mit lokalen Variablen nicht, bzw. nur wenn man mehrere Funktionen schachtelt (dafür ist C++ nicht gut geeignet, das geht mit OCaml besser - die Garbage Collection ist da das Problem von C/C++).
Das geht mit input Variablen nicht

Fazit:
Statisches System/Kunden Code -> input = Kundenbindung
Dynamisches System (inkl. AI, NN) -> extern


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