Nützliche Funktionen von KimIV - Seite 75

 

Hallo, lieber Igor, mein System verwendet Trendunterdrücker. Und dabei sind sowohl die Zeit als auch der Preis des Crossovers wichtig.
Eine Folge von Takten hat nicht immer eine "kontinuierliche" Zeit. Ausgänge, Löcher, etc.
Die Verwendung von CrossPointOfLines ( in test_CrossPointOfLines.mq4) zur Berechnung der Zeit in ihrer natürlichen Form führt zu den folgenden Ergebnissen

links von der Nullleiste

(Die Position der Trendlinien in den Diagrammen hat nichts mit dem System zu tun - zufällige Auswahl. Die Referenzpunkte der Trendlinie können

eine auf der linken Seite der Nullleiste, die andere auf der rechten Seite).


und auf der rechten Seite

Die Berechnungen sollten nicht in Stunden, sondern je nach Situation sowohl in Balken als auch in Stunden durchgeführt werden. Die Zeiteinheit auf der linken Seite ist bar. Und auf der rechten Seite, nach dem Null-Balken, sollte sie in Stunden gemessen werden.

Die Suche nach vorgefertigten Lösungen hat bisher nichts ergeben. Die Funktion CrossPointOfLines ist die einzige, die bisher auf der Website zu finden ist. Es erfordert eine perfekte Geschichte :(

 

Guten Tag, Igor!

Bitte helfen Sie mir mit Rat oder einer Lösung. Ich versuche, den Expert Advisor dazu zu bringen, ein Signal zu geben, wenn ein vorheriger Balken den vorhergehenden "absorbiert".

1 - wenn die Absorption nach oben erfolgte
2 - wenn die Absorption nach unten erfolgte.

Ich dachte, es wäre ganz einfach, einfach Eröffnungs- und Schlusskurse vergleichen und voila ... aber das ist es nicht. Wenn ich mit der Maus über die vorherigen 2 Balken fahre, ist es klar, dass der letzte den vorletzten Balken frisst.

Ich hoffe sehr auf Hilfe, und danke Ihnen im Voraus


Hier ist der Text:

int start()
{
//----
if (SShort()==1)
Alert("1");
}
if (SLong()==1)
Alert("2");
}
//----
return(0);
}
//+------------------------------------------------------------------+
int SShort()
{int MS=0;
if (Open[1]>Close[2] && Close[1]<Open[2] && Open[1]>Close[1] && Open[2]<Close[2])
MS=1;
return(MS);
}
//+------------------------------------------------------------------+
int SLong()
{
int ML=0;
if(Open[1]<Close[2] && Close[1]>Open[2] && Open[1]<Close[1] && Open[2]>Close[2])
ML=1;
return(ML);
}
//+------------------------------------------------------------------+
 

Zeitfiltersatz: C und PO

(und mehr...).

Auf die Frage, was los ist, kam ich selbst zu folgendem Ergebnis.


1. Tägliche Aktivitäten verbieten oder erlauben.


Option 1.

// Закрыть все позиции в конце дня в указанное время
if (Hour()==23 && Minute()>=45) 
{ ЗакрытьДень();}


// Запретить эксперту торговать С и ПО
if ( (Hour()==22 && Minute()>=00) && (Hour()==23 && Minute()>=59) ) return;

Beachten Sie, dass die "Ablaufzeit" in diesen Optionen bis zum Ende der Stunde und 59 Sekunden der Anzahl der Minuten reicht.

d.h. die als 23:59 angegebene Endzeit des Ereignisses ist tatsächlich 23:59:59

Und zum Ende der Stunde, weil die Minuten den Vergleichsoperator ">=" verwenden, was aber kein Problem ist und man "==" angeben kann,

aber das Wischen der Zeit auf 59 Sekunden funktioniert auf jeden Fall noch...


Option 2.

Genauer gesagt unter dem Gesichtspunkt der Festlegung von Bedingungen...

// Выборка ОТ и ДО
if( OtTime(2,15,21) < OrderCloseTime() && OrderCloseTime() < DoTime(4,58,33) )
{ Действия;}

// Функции преобразования 
datetime OtTime(int h=0, int m=0, int s=0) {datetime ot;
ot=( h*3600)+( m*60)+ s+StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
return ( ot);}
//--------------
datetime DoTime(int h=0, int m=0, int s=0) { datetime dt;
//if(h>23||h<0) Alert("Должно быть от 0 до 23"); h=0; 
//if(m>59||m<0) Alert("Должно быть от 0 до 59"); m=0;
dt=( h*3600)+( m*60)+ s+StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
return ( dt);}

Die Zeit wird durch die Übergabe von Parametern an die Funktion festgelegt, zum Beispiel 21:15:23 als (21,15,23).

Es ist klar, dass das nicht cool ist, aber es ist ein recht brauchbarer Code...

SZY: Die Überprüfung der Gültigkeit der eingegebenen Parameter ist nicht zufällig.

Denn wenn man das Falsche eingibt, ist das ein Schlag ins Gesicht. Ich konnte keine andere Möglichkeit finden, also habe ich es auskommentiert.

Daher wäre ich für eine Lösung dieses Problems sehr dankbar ...


Variante #3.

Wie sich herausstellt, ist dies die einfachste und genaueste Methode.

// Внешние параметры, могут быть экстернами
string ВН="02:15"; // начало события
string ВК="04:58"; // конец события

int start()
{
int m;
datetime vn=StrToTime( ВН);
datetime vk=StrToTime( ВК);
// либо напрямую указывать время по типу:
//  datetime vn=StrToTime("02:15");
//  datetime vk=StrToTime("04:58");

for (int m=0; m < OrdersHistoryTotal() ; m++) 
{
OrderSelect( m, SELECT_BY_POS, MODE_HISTORY);
if( (OrderCloseTime()> vn) && (OrderCloseTime()< vk) )
{ Действия;}
}

return()
}

Die Sache mit der Einfachheit, so scheint es, liegt in den Besonderheiten der Umwandlung von Parametern, die von der Funktion StrToTime() an sie übergeben werden.

Wenn Sie z.B. nur die Uhrzeit "HH:MM:SS" eingeben, wird die Uhrzeit des aktuellen Tages ausgegeben...


Übrigens...

// можно написать и так:
if( (OrderCloseTime()>StrToTime( ВН)) && (OrderCloseTime()<StrToTime( ВК)) )
// или даже так:
if( (OrderCloseTime()>StrToTime("02:15")) && (OrderCloseTime()<StrToTime("04:58")) )

Durch die Kombination von Stichproben nach Stunden und Tagen können Sie nach Typen filtern:

- was um 18:00 Uhr eines jeden Tages war, oder was jeden Tag im angegebenen Zeitraum von C und aufwärts Stunden:Minuten:Sekunden war

Die Palette der Tage kann aber auch von und zu vollgestopft werden...


2. Function DateFirstDayMonday()

(basierend auf DateOfMonday() )

datetime DateFirstDayMonday() 
{ 
datetime dfdm;
dfdm=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))-((Day()-1)*86400);
return ( dfdm);
}

Gibt das Datum des ersten Tages als 00:00:00 des aktuellen Monats zurück.

Benötigt, um Ereignisse VOR dem Monatsanfang zu filtern...

// выборка закрытых ордеров с начала месяца:
if( DateFirstDayMonday() < OrderCloseTime() )
{ Действия;}

// выборка ДО начала месяца (с начала истории счёта):
if( DateFirstDayMonday()-1 > OrderCloseTime() )
{ Действия;}

DateFirstDayMonday()-1 im zweiten Beispiel gibt "letzter Tag des Vormonats 23:59:59" aus.


...

Bitte treten Sie mich nicht im Voraus, denn ich bin ein Dummkopf.

:)))

 
Igor, bitte helfen Sie, diesem Indikator eine Warnmeldung zuzuordnen
Dateien:
 
kombat >> :

Bitte treten Sie mich nicht im Voraus, denn ich bin ein Dummkopf. :)))

Chyneg nicht chyneg, aber wenn Sie den Busch aufgenommen haben, folgen Sie ihm bis zum Ende. Wir möchten die zulässige Betriebszeit und die Schließzeit in separate boolesche Funktionen dieses Typs überführen:

bool TradeTime(Trade Startzeit, Trade Endzeit)

Dann wird es sehr bequem zu verwenden, wenn (TradeTime(.,...)) und Arbeit!

 
granit77 >> :

Chyneg ist kein Chyneg, aber wenn du das Ruder in die Hand genommen hast, musst du es auch durchziehen. Es bietet sich an, die zulässige Betriebszeit und die Schließzeit in einer Art separater boolescher Funktion zu erfassen:

bool TradeTime(Trade Startzeit, Trade Endzeit)

Es wird sehr bequem sein, dann zu verwenden, wenn (TradeTime(.,.)) und Arbeit!



Nun, schon... ;)

Für eine Bank mache ich eine Variante mit zwei gleichzeitigen Zeitangaben:

- alle Aufträge und Positionen vor dem Rollover um 22:00 Uhr schließen

- Handelspause vom Beginn des Rollover um 22:00 Uhr bis zum Ende des Tages um 23:59 Uhr

(Rohfassung ohne zusätzliche Prüfungen)

//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
//HHHHH Стартуем... HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
int start() {
//--- Общая проверка --------------------------------------------------------+
if(! IsCondition()) {Print("Низззяяя..."); return;}
//--- Задание неторгового времени (паузы) -----------------------------------+
ObjectDelete("НЕТОРГВРЕМЯ");
if((TimeCurrent()>StrToTime("22:00"))&&(TimeCurrent()<StrToTime("23:59:59"))) 
{ NoTradeTime(); return;}
//--- Принудительное закрытие всех ордеров и позиций в конце дня ------------+
if(Hour()==21 && Minute()>=45) { ЗакрытьДень(); return;}
//*метод имеет недостаток: он будет закрывать до конца указаного часа...
//*например время 21:45, закрывать будет до 21:59:59 а с 22:00 прекратит.
//*впринципе это нам не повредит...
//--- Конец условий ---------------------------------------------------------+
// бла-бла-бла...
return(0);
}
 
kombat >> :

...(Rohfassung ohne zusätzliche Prüfungen)

Vinin hatte separate Funktionen für die Zeitmessung, die sehr detailliert und ausgearbeitet waren. Sehen Sie sich die EAs auf seiner Website an oder klopfen Sie an seine Tür.

 
granit77 >> :

Vinin's EA hat separate Funktionen für die Arbeit mit der Zeit, die sehr detailliert und gründlich sind. Sehen Sie sich die Expert Advisors auf seiner Website an oder klopfen Sie auf seiner Website an.

Danke, aber das ist noch nicht nötig...

Ich habe im Moment einfach nicht viel Zeit für diesen Berater,

Ich weiß, was ich dort schreiben muss, und ich weiß auch, wie ich es schreiben muss...

*

Ich werde den Haupttext im Forum der Bank veröffentlichen, um dieses Thema nicht zu überfrachten.

Zu seiner Zeit, versteht sich. ;)

 
granit77 >> :

bool TradeTime(Trade Startzeit, Trade Endzeit)

Dann wird es sehr bequem zu verwenden, wenn (TradeTime(.,.)) und Arbeit!

Es ist notwendig, eine solche Funktion für Igor Kim zu bestellen.

 
goldtrader писал(а) >>

Igor Kim sollte eine solche Funktion bestellen.

Ich schließe mich der Bitte an! Dies wäre eine sehr nützliche und notwendige Funktion. In Anbetracht der derzeitigen Handelsbedingungen....

Es ist sogar möglich, dort zwei TIME-Intervalle anzugeben.

Grund der Beschwerde: