Nützliche Funktionen von KimIV - Seite 116

 

Die Funktion SetChannel().

Diese Funktion setzt das ObjektOBJ_CHANNEL auf einen äquidistanten Kanal im aktuellen Diagramm.

  • cl- Farbe des Objekts. Obligatorischer Parameter.
  • t[]- Array mit drei Werten auf der Zeitachse.Obligatorischer Parameter.
  • p[]- Array mit drei Werten auf der Preisachse.Obligatorischer Parameter.
  • nm- Objektname. Wenn der Standardwert -""- übergeben wird, wird die aktuelle Öffnungszeit der Bar als Name verwendet.
  • ry- Flagge der EigenschaftBOW, Standardwert istFalse.
  • st- Linienstil. Gültige Werte sindSTYLE_SOLID(Standard),STYLE_DASH,STYLE_DOT,STYLE_DASHDOT.
  • wd- Linienstärke. Der Standardwert ist1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2013                                                     |
//|  Описание : Установка объекта OBJ_CHANNEL Равноудаленный канал.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl  - цвет линии                                                        |
//|    t[] - время открытия бара                                               |
//|    p[] - ценовой уровень                                                   |
//|    nm  - наименование              (  ""  - время открытия текущего бара)  |
//|    ry  - луч                       (False - по умолчанию)                  |
//|    st  - стиль линии               (  0   - простая линия)                 |
//|    wd  - ширина линии              (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetChannel(color cl, datetime& t[], double& p[],
                string nm="", bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t[0]<=0) t[0]=Time[20];
  if (p[0]<=0) p[0]=High[20];
  if (t[1]<=0) t[1]=Time[0];
  if (p[1]<=0) p[1]=High[0];
  if (t[2]<=0) t[2]=Time[15];
  if (p[2]<=0) p[2]=Low[15];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_CHANNEL, 0, 0,0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t[0]);
  ObjectSet(nm, OBJPROP_PRICE1, p[0]);
  ObjectSet(nm, OBJPROP_TIME2 , t[1]);
  ObjectSet(nm, OBJPROP_PRICE2, p[1]);
  ObjectSet(nm, OBJPROP_TIME3 , t[2]);
  ObjectSet(nm, OBJPROP_PRICE3, p[2]);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
ZZY: Im Anhang finden Sie ein Skript zum Testen der Funktion SetChannel().
Dateien:
 

Guten Tag.

Ich verwende die Funktion SetTLine() aus KimIV https://forum.mql4.com/ru/38949/page6#434255. Das Problem ist, dass ich zwei Zeilen brauche (oben und unten), aber das funktioniert bei mir nicht. Ich habe eine weitere Funktion SetTLine1() mit anderen Variablen erstellt, aber sie funktioniert immer noch nicht. Wie kann man das tun?

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
datetime d1=TimeCurrent()-24*60*60;
while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
d1=StrToTime(TimeToStr(d1, TIME_DATE));
datetime d2=d1-24*60*60;
while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
d2=StrToTime(TimeToStr(d2, TIME_DATE));
int b2=iBarShift(NULL, 0, d2);     // номер бара начала второго дня
int b1=iBarShift(NULL, 0, d1);     // номер бара начала первого дня
int b0=iBarShift(NULL, 0, d0);     // номер бара начала текущего дня
int n2=iLowest(NULL, 0, MODE_LOW, b2-b1-1, b1);
int n1=iLowest(NULL, 0, MODE_LOW, b1-b0-1, b0);
datetime t1=Time[n2];
double   p1=Low[n2];
datetime t2=Time[n1];
double   p2=Low[n1];
SetTLine(Magenta, "", t1, p1, t2, p2, True, STYLE_SOLID, 3);   


datetime di0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
datetime di1=TimeCurrent()-24*60*60;
while (TimeDayOfWeek(di1)==0 || TimeDayOfWeek(di1)==6) di1-=24*60*60;
di1=StrToTime(TimeToStr(di1, TIME_DATE));
datetime di2=di1-24*60*60;
while (TimeDayOfWeek(di2)==0 || TimeDayOfWeek(di2)==6) di2-=24*60*60;
di2=StrToTime(TimeToStr(di2, TIME_DATE));
int bi2=iBarShift(NULL, 0, di2);     // номер бара начала второго дня
int bi1=iBarShift(NULL, 0, di1);     // номер бара начала первого дня
int bi0=iBarShift(NULL, 0, di0);     // номер бара начала текущего дня
int ni2=iHighest(NULL, 0, MODE_HIGH, bi2-bi1-1, bi1);
int ni1=iHighest(NULL, 0, MODE_HIGH, bi1-bi0-1, bi0);
datetime t1i=Time[ni2];
double   p1i=High[ni2];
datetime t2i=Time[ni1];
double   p2i=High[ni1];
SetTLine1(Magenta, "", t1i, p1i, t2i, p2i, True, STYLE_SOLID, 3);
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}


void SetTLine1(color cli, string nmi="",
              datetime t1i=0, double p1i=0, datetime t2i=0, double p2i=0,
              bool ryi=False, int sti=0, int wdi=1) {
  if (nmi=="") nmi=DoubleToStr(Time[0], 0);
  if (t1i<=0) t1i=Time[10];
  if (p1i<=0) p1i=Low[10];
  if (t2i<=0) t2i=Time[0];
  if (p2i<=0) p2i=Bid;
  if (ObjectFind(nmi)<0) ObjectCreate(nmi, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nmi, OBJPROP_TIME1 , t1i);
  ObjectSet(nmi, OBJPROP_PRICE1, p1i);
  ObjectSet(nmi, OBJPROP_TIME2 , t2i);
  ObjectSet(nmi, OBJPROP_PRICE2, p2i);
  ObjectSet(nmi, OBJPROP_COLOR , cli);
  ObjectSet(nmi, OBJPROP_RAY   , ryi);
  ObjectSet(nmi, OBJPROP_STYLE , sti);
  ObjectSet(nmi, OBJPROP_WIDTH , wdi);
}
 

Sie brauchen nicht zwei Funktionen zu erstellen. Sie müssen eine mit anderen Parametern aufrufen. Sie haben zwei Funktionen aufgerufen, aber an beide einen leeren Namen des Objekts LINE übergeben. Standardmäßig setzt die Funktion SetTLine() die aktuelle Öffnungszeit des Balkens als Namen. In Ihrem Fall würde dies dazu führen, dass Sie, egal wie oft SieSetTLine() aufrufen, jedes Mal ein Objekt mit demselben Namen, also EIN LINE-Objekt, erzeugen.

Ich habe Ihren Code überarbeitet. Siehe Anhang. Und als Beispiel dafür, was Ihr Code zeichnet, ein Bild

Dateien:
 
KimIV:

Sie brauchen nicht zwei Funktionen zu erstellen. Sie müssen eine mit anderen Parametern aufrufen. Sie haben zwei Funktionen aufgerufen, aber an beide einen leeren Namen des Objekts LINE übergeben. Standardmäßig setzt die Funktion SetTLine() die aktuelle Öffnungszeit des Balkens als Namen. In Ihrem Fall würde dies dazu führen, dass Sie, egal wie oft SieSetTLine() aufrufen, jedes Mal ein Objekt mit demselben Namen, also EIN LINE-Objekt, erzeugen.

Ich habe Ihren Code überarbeitet. Siehe Anhang. Und als Beispiel dafür, was Ihr Code zeichnet, ein Bild


Ich verstehe, danke.

 

Hallo!

Ich möchte Ihnen ein großes Dankeschön für Ihre Arbeit aussprechen. Ich habe 2 Dateien(ByMarketBuy(Sell)+e-SARTrailing) von Ihrer Website heruntergeladen, um mein Handelssystem aufzubauen.Ich sende das SkriptByMarketBuy(Sell) für das Paar EUR/USD auf 1 Bildschirm, wobei ich MAGIC 30 für einen Auftrag undMAGIC 60 für einen anderen Auftrag (jeweils M30 und H1) unde-SARTrailing Advisor auf 2 und 3 Bildschirmen mit den EinstellungenSAR.TF=30bzw. 60vorschreibe.Und da zwei Aufträge auf dem gleichen Währungspaar geöffnet sind, so gehen sie co-rotated und es stellt sich heraus, dass ohneMagicNumber Advisorse-SARTrailing auf zwei Bildschirme miteinander in Konflikt geraten. Ich habe eine GROSSEANFRAGEan Sie, wenn Sie den Berater ändern könnte (zu schreiben) eine solche Funktion alsMagicNumber kann eine solche Ergänzung würde viele zu schätzen wissen. Und dies wird auf allen Zeitrahmen gleichzeitigfunktionieren, ohne dass es zu Konflikten kommt, unabhängig von der Richtung.

Vielen Dank im Voraus!

 
tim-time:

Ich habe eine GROSSE ANFRAGE an Sie, ob Sie Ihren Expert Advisor mit derMagicNumber-Funktionoptimieren könnten.

Danke für den Hinweis. Ich habe einen Filter für Magier hinzugefügt...
 

GetTimeOpenBar() Funktion.

Diese Funktion gibt die Eröffnungszeit eines beliebigen Symbols und eines beliebigen Zeitrahmens zurück. Im Allgemeinen handelt es sich um eine Kombination der Basisfunktionen iBarShift() und iTime(). Es handelt sich also um nichts Neues, und die Verwendung einer bestimmten Variante ist eine Frage der Bequemlichkeit. Sie können die folgenden optionalen Parameter an die Funktion übergeben

  • sy- Name des Handelsinstruments (Symbol). Die Werte "" und NULL bedeuten das aktuelle Symbol. Der Standardwert ist "".
  • tf- Zeitrahmen. Standardwert - 0 - aktueller Zeitrahmen.
  • dt- Datum und Uhrzeit. Standardwert - 0 - aktuelle Zeit.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.01.2012                                                     |
//|  Описание : Возвращает время открытия бара.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий)                 |
//|    dt - дата/время                 (    0       - текущее)                 |
//+----------------------------------------------------------------------------+
datetime GetTimeOpenBar(string sy="", int tf=0, int dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf==0) tf=Period();
  if (dt==0) dt=TimeCurrent();
  
  int sh=iBarShift(sy, tf, dt, False);

  return(iTime(sy, tf, sh));
}

 
KimIV:
Vielen Dank für den Hinweis. Ich habe einen Filter für Magier hinzugefügt...

HALLO!

WOW! DAS IST DAS TEMPO!!! (Ich mache es selbst oder ich sage NEIN!)

EINENGROSSEN RESPEKTVOR PROFESSIONELLEN!(Ein Profi muss alle kleinsten Details kennen + harte Arbeit in seinem Bereich und natürlich die Erfahrung, die sich im Laufe der Jahre ansammelt).

Ich bin in den eingebauten Möbeln schon 4 5 Jahre beschäftigt und 1 5 Jahre beendet Forex Handel (harte Arbeit+Erfahrung von erfolgreichen und erfolglosen Momenten im Handel, es bleibt, die kleinsten Details zu lernen).

MEIN ZIEL IST ES, EIN PROFI IM HANDEL ZU WERDEN.

ICH DANKE IHNEN FÜRIHRE HILFE!

MIT RESPEKT!

 

Ich habe die Funktion ErrorRU() erstellt, die eine kurze oder ausführliche russische Beschreibung eines Fehlers anhand seines Codes liefert. Es werden sowohl vom Handelsserver zurückgegebene Fehler als auch Fehler bei der Ausführung von MQL-Programmen erkannt. Nicht bei allen Fehlern gibt es jedoch eine detaillierte Beschreibung mit Empfehlungen, was zu tun ist, aber das ist nun mal so.

Ich veröffentliche die Funktion im Skript, um sie zu testen.

Wenn jemand eine Variante in Form einer MQH-Datei benötigt, kann er sie von meiner Website erhalten.

Dateien:
 

Hallo!

Ist es möglich, PUSH-Benachrichtigungen zu Ihreme-SignalOfTrade EA hinzuzufügen?

https://www.mql5.com/ru/forum/6960

https://www.mql5.com/ru/docs/common/sendnotification

(Der gemietete VPS-Server weigert sich, die Daten des SMTP-Servers zu übermitteln, der in den MT4-E-Mail-Einstellungen für die Arbeit des Advisors mitUseSendMail=True- E-Mail angegeben werden sollte. )

Vielen Dank im Voraus!