Zeit-Enumeration über 0Uhr Problem optimieren (EA mit 2 Zeitfenstern (Signal&Trading) Wie zeiteffizient gestalten??
Ich hab mir das nochmals angesehen. Ich denke das NOT passt nicht.
if(!InTimeRange(TimeCurrent(),checkTimeBegin,checkTimeEnd)) so geht's if(InTimeRange(TimeCurrent(),checkTimeBegin,checkTimeEnd))
Hmm - soweit ich Dich verstehe, beginnt Dein "Tag" mit checkTimeBegin und dann hast Du das Problem, dass die Tageszeit von checkTimeEnd kleiner ist als checkTimeBegin - richtig?
das ließe sich korrigieren leicht korrigieren, indem Du die datetime-Variablen in Stunde umrechnest:
#define HoD(t) ((int)(((t)%86400)/3600)) // Hour of Day 2018.02.03 17:55:56 => (int) 17 ... checkTimeBegin = HoD(..) checkTimeEnd = ( HoD(TimeCurrent() >= HoD(checkTimeBegin) ? HoD(TimeCurrent()) : HoD(TimeCurrent())+ 24) ) if (InTimeRange( HoD(TimeCurent(),checkTimeBegin, checkTimeEnd)
(UNGETESTET!)
Dankeschön, hab ich leider übersehen...
aber warum minus 86400? (nur 23,5STd) statt 24Std?
datetime EnumToDateTime(ENUM_T15 value) { return(StringToTime(TimeToString(TimeCurrent(), TIME_DATE))+value); } datetime EnumToDateTime(ENUM_T30 value) { return(StringToTime(TimeToString(TimeCurrent(), TIME_DATE))+value); } void NormalizeRange(datetime &rStart,datetime rEnd) { if(rStart>rEnd) rStart-=86400; } bool InTimeRange(datetime aDateTime,datetime rStart,datetime rEnd) { bool result=(aDateTime>=rStart) && (aDateTime<=rEnd); return(result); }
Verstehe weiterhin nicht, Warum die Daychanged() Funktion nur auf den Tag angepasst ist und nicht dann den nächsten Tag Zeigt,wenn checkTimeBegin ist.
Dankeschön, hab ich leider übersehen...
aber warum minus 86400? (nur 23,5STd) statt 24Std?
Verstehe weiterhin nicht, Warum die Daychanged() Funktion nur auf den Tag angepasst ist und nicht dann den nächsten Tag Zeigt,wenn checkTimeBegin ist.
dann bleibt doch auch weiterhin dass Problem, dass nach Null Uhr alle Orders gelöscht werden oder? (falls das so ist, wäre blöd wenn die TradeTimeBegin um 23:30 beginnt)
dann bleibt doch auch weiterhin dass Problem, dass nach Null Uhr alle Orders gelöscht werden oder? (falls das so ist, wäre blöd wenn die TradeTimeBegin um 23:30 beginnt)
Hmm - soweit ich Dich verstehe, beginnt Dein "Tag" mit checkTimeBegin und dann hast Du das Problem, dass die Tageszeit von checkTimeEnd kleiner ist als checkTimeBegin - richtig?
das ließe sich korrigieren leicht korrigieren, indem Du die datetime-Variablen in Stunde umrechnest:
(UNGETESTET!)
Ich hab einen kl. Denkfehler korrigiert: HoD( TC()+24*60*60) == HoD(TC()) - es muss natürlich heißen HoD(TC())+24!
dann bleibt doch auch weiterhin dass Problem, dass nach Null Uhr alle Orders gelöscht werden oder? (falls das so ist, wäre blöd wenn die TradeTimeBegin um 23:30 beginnt)
Das Löschen muss halt passieren wenn: !InTimeRange(..) :
if (InTimeRange(..)) { // trade ... } else { // delete pending orders ... }
Das Löschen muss halt passieren wenn: !InTimeRange(..) :
ich meine in der onInit(),
oder habe ich es Flasch verstanden, dass sobald sich der Tag ändert (also nicht die Range von checkTimeBegin zu checkTimeEnd, sondern das reale Tagesdatum), die OnInit() durchgeführt wird -> welche dann unabhängig von der InTimeRange() bools =false setzt & PendingOrders löscht
int OnInit() { checkTimeBegin=EnumToDateTime(inp_CheckTimeBegin); checkTimeEnd =EnumToDateTime(inp_CheckTimeEnd ); tradeTimeBegin=EnumToDateTime(inp_TradeTimeBegin); tradeTimeEnd =EnumToDateTime(inp_TradeTimeEnd ); NormalizeRange(checkTimeBegin,checkTimeEnd); NormalizeRange(tradeTimeBegin,tradeTimeEnd); calculated=false; setpending=false; DeleteAllPendingOrders(); //Das hier meine Ich (und die beiden Bools), es gibt keine "Bedingung" die an die InTimeRange gebunden ist, //sondern für mich sieht das so aus als wäre es fest an das reale TagesDatum gebunden, liege ich falsch? return(INIT_SUCCEEDED); }
Meiner Meinung nach sollte ein EA 24/7 (oder 24-h/5-d) laufen oder willst Du ihn jeden Tag händisch anstellen?
Hmm - soweit ich Dich verstehe, beginnt Dein "Tag" mit checkTimeBegin und dann hast Du das Problem, dass die Tageszeit von checkTimeEnd kleiner ist als checkTimeBegin - richtig?
das ließe sich korrigieren leicht korrigieren, indem Du die datetime-Variablen in Stunde umrechnest:
(UNGETESTET!)

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Folgender EA arbeitet mit dem Hoch und Tiefkurs eines bestimmten Tageszeitfensters. In einem zweiten TagesZeitfenster sollen dann mit die vorher genutzten Höchst und Tiefkurse als Signal mit PendingOrders getradet werden... (Ursprungscode stammt von @Otto Pauser)
Soweit sogut... Sofern alles am gleichen Tag geschieht funktioniert alles...
Nun habe ich aber das problem, dass ich keine Lösung finde, wenn ich dieses "Check"-Zeitfenster über die Nacht legen Möchte (bspw von 22Uhr bis 4Uhr).
Zumindest fällt mir kein zeiteffizienter Code ein, wie müsste ich also die DayChanged() (oder die OnInit() und OnTick()) Funktion abändern,
sodass ich die Checkphase (inp_CheckTimeBegin bis inp_CheckTimeEnd) Über Nacht anlegen könnte?