Nützliche Funktionen von KimIV - Seite 109

 
Die Funktion wurde ein wenig optimiert. Jetzt werden Kreuzungen ohne Absturz berechnet.
Eingabeparameter: |
nm1 - Name der ersten Zeile |

nm2 - Name der zweiten Zeile

Produktion M ist das Preisniveau.

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

PS. Entschuldigung an den Autor dieses Threads, dass ich meinen Code hier gepostet habe. Ich dachte nur, dass vielleicht auch jemand mit Kreuzungen zu kämpfen hat...

 
Shuba: Ich dachte nur, dass vielleicht auch jemand mit Crossover zu kämpfen hat...

Es fällt mir ein (bereits in den Annalen):

Novozar 23.07.2011 12:18
Bitte sagen Sie mir den Ausweg. Ich habe einen Indikator namens Average Directional Movement Index und er zeichnet gestrichelte Linien. Ich möchte Überschneidungen erkennen. Ich glaube nicht, dass es notwendig ist, gestrichelte Linien zu zeichnen.
 
Shuba:

PS. Ich entschuldige mich beim Autor dieses Threads, dass ich meinen Code hier gepostet habe. Ich dachte nur, dass vielleicht auch jemand mit Kreuzungen zu kämpfen hat...

Also gut. Verzeihen Sie ihm...
 
Shuba:
Ich habe die Funktion ein wenig verändert. Jetzt werden Kreuzungen ohne Absturz berechnet.
Eingabeparameter: |
nm1 - Name der ersten Zeile |

nm2 - Name der zweiten Zeile

Produktion M - Preisniveau.

PS. Es tut mir leid für den Autor dieses Threads, dass ich meinen Code hier gepostet habe. Ich dachte nur, dass vielleicht auch jemand mit der Überfahrt zu kämpfen hatte...

Nun, vielleicht sollte diese Funktion genau dieses Preisniveau zurückgeben (wie bei der vorherigen Variante)! Außerdem gibt es in Ihrem Code eine nicht deklarierte Variable "T".
 
TarasBY:
Nun, vielleicht sollte diese Funktion genau dieses Preisniveau zurückgeben (wie bei der vorherigen Variante)! Außerdem enthält Ihr Code eine nicht deklarierte Variable "T".

Nun, er gibt sie zurück)

über nicht deklarierte Variablen - sorry. Ich nehme das zurück.

double M - Überschreiten des Preisniveaus. Diese Variable wird am Anfang deklariert.

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      double T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

Der Trailer ist ein Expert Advisor, um zu sehen, wie die Funktion funktioniert.

 

Ich konnte sie nicht sofort laden...

Dateien:
proba_per_1.mq4  11 kb
 
Shuba:

Ich konnte sie nicht sofort laden...


IMHO sollten Sie das Wasser nicht aufwirbeln - bombardieren Sie die Funktionsbibliotheken hier mit Beschreibungen, und das war's...

Diejenigen, die es brauchen, werden es finden.

 

Die Funktion ClosePosByTakeProfitZone().

Diese Funktion schließt eine Position zum Marktpreis, wenn der Preis für eine Anzahl von Takten in der Zone nahe dem TakeProfit verharrt, oder wenn er versucht, diese Zone zu verlassen. Die Auswahl der zu schließenden Positionen wird über externe Parameter festgelegt:

  • sy - Name des Instruments. Wenn wir diesen Parameter setzen, wird die Funktion nur die Positionen des angegebenen Instruments überprüfen. NULL bedeutet das aktuelle Instrument, während "" (Standard) ein beliebiges Instrument bedeutet.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Kennung der Position (MagicNumber). Der Standardwert von -1 bedeutet eine beliebige MagicNumber.
  • tf - Chart-Zeitrahmen, auf dem die Balken gezählt werden sollen, während derer der Preis in der TakeProfit-Zone steht. Der Standardwert 0 ist der aktuelle Zeitrahmen.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.04.2012                                                     |
//|  Описание : Закрытие позиций при нахождении цены в зоне TakeProfit         |
//|             в течение заданного количества баров,                          |
//|             а также при попыте выйти из этой зоны.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
void ClosePosByTakeProfitZone(string sy="", int op=-1, int mn=-1, int tf=0) {
  double pa, pb, po, pp, tp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTakeProfit()>0) {
          po=MarketInfo(OrderSymbol(), MODE_POINT);
          if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol());
          else {
            if (OrderType()==OP_BUY) {
              RefreshRates();
              pb=MarketInfo(OrderSymbol(), MODE_BID);
              pp=iLow(OrderSymbol(), tf, iLowest(OrderSymbol(), tf, MODE_LOW, TP.ZoneBars, 0));
              tp=OrderTakeProfit()-TP.ZonePoint*po;
              if (pp>tp || (pb<tp && (iHigh(OrderSymbol(), tf, 0)>tp) || (iHigh(OrderSymbol(), tf, 1)>tp))) ClosePosBySelect();
            }
            if (OrderType()==OP_SELL) {
              RefreshRates();
              pa=MarketInfo(OrderSymbol(), MODE_ASK);
              pp=iHigh(OrderSymbol(), tf, iHighest(OrderSymbol(), tf, MODE_HIGH, TP.ZoneBars, 0));
              tp=OrderTakeProfit()+TP.ZonePoint*po;
              if (pp<tp || (pb>tp && (iLow(OrderSymbol(), tf, 0)<tp) || (iLow(OrderSymbol(), tf, 1)<tp))) ClosePosBySelect();
            }
          }
        }
      }
    }
  }
}
Im Anhang finden Sie einen Expert Advisor zum Testen der ClosePosByTakeProfitZone() Funktion. Sie können ihn sowohl im Tester als auch online testen.
 

Guten Abend, Igor!

Ich habe vor nicht allzu langer Zeit angefangen, Ihre Funktionen zu studieren, auf Seite 36 habe ich die Funktionen nicht ganz verstanden, bitte helfen Sie mir, sie zu verstehen:


Function GetArrowInterval().


//+------------------------------------------------------------------+
//| Gibt Signalzeiger-Einstellintervall zurück |
//+------------------------------------------------------------------+
int GetArrowInterval() {
int p = Period();

switch (p) {
case 1: return(4);
case 5: return(5);
case 15: return(6);
case 30: return(8);
case 60: return(10);
case 240: return(20);
case 1440: return(40);
case 10080: return(80);
case 43200: return(150);
} xml-ph-0015@deep

d.h. diese Funktion wurde verwendet, um Pfeile mit der Funktion SetArrow() zu setzen, und zwar anstelle des Preisniveaus in der Zeile ObjectCreate(nm, OBJ_ARROW, 0, 0,0), sagen Sie mir, wie das passiert ist, es ist mir nicht klar, was die Rückgabewerte bedeuten (4,5,6,8,10....)


Auch die neue Version der Funktion bleibt unklar:





//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 12.10.2007 |
//+----------------------------------------------------------------------------+
//| Beschreibung : Gibt Signalzeigerintervall zurück |
//| Parameter: |
//| pr - Prozentwert relativ zur Fensterpreisgröße |
//+-------------------

return((WindowPriceMax()-WindowPriceMin())/100*pr/Point);


Die Funktion WindowPriceMax() gibt den Höchstwert der vertikalen Skala zurück, d. h. den maximalen Preiswert, aber über welchen Zeitraum?

Und danke für Ihre harte Arbeit....))))

 
Lisi4ka330:

Ich habe vor nicht allzu langer Zeit angefangen, Ihre Funktionen zu studieren, auf Seite 36 habe ich die Funktionen nicht ganz verstanden, bitte helfen Sie mir, sie zu verstehen:

d.h. diese Funktion wurde verwendet, um Pfeile mit der Funktion SetArrow() zu setzen, und zwar anstelle des Preisniveaus in der Zeile ObjectCreate(nm, OBJ_ARROW, 0, 0,0), sagen Sie mir, wie das gemacht wurde...

Sie müssen den Zweck dieser Funktionen missverstanden haben. Sie arbeiten nicht mit Preisen und setzen keine Symbole, sondern geben nur den Abstand in Pips zurück, der vom aktuellen Zeitrahmen abhängt. Bitte beachten Sie das unten stehende Bild.

Wenn Sie eine solche Markierung nicht in der Nähe des Preises, sondern in einem gewissen Abstand und zum Beispiel auf dem H1-Zeitrahmen platzieren und dann auf M1 umschalten, werden Sie die Markierung wahrscheinlich nicht sehen. Die Skala ändert sich und das Symbol bewegt sich entweder weit nach unten oder nach oben. Die von Ihnen erwähnten Funktionen sollen sicherstellen, dass die Symbole in jedem Zeitrahmen immer im Diagramm sichtbar sind.

Lisi4ka330:

...was bedeuten die Rückgabewerte (4,5,6,8,10....)

Abstand in Pips, abhängig vom aktuellen Zeitrahmen.


Lisi4ka330:

Die Funktion WindowPriceMax() gibt den Höchstwert der vertikalen Skala zurück, d. h. den maximalen Preiswert, aber über welchen Zeitraum?

Nicht für irgendeinen Zeitraum... Nur im aktuellen Fenster. In der nachstehenden Abbildung beträgt der Höchstpreis beispielsweise 97,35