Caratteristiche utili da KimIV - pagina 36

 

Esempi di come usare SetRegression().

  • Canale di regressione della linea rossa basato sulle barre degli ultimi 2 giorni.
    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));
    SetRegression(Red, "", d1, 0, True);

  • Canale marrone della regressione lineare basata sulle barre degli ultimi 2 giorni.
    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));
    SetRegression(Brown, "", d2, d0, True, STYLE_DASH);

PS. In allegato c'è uno script per testare la funzione SetRegression().

File:
 

La funzione EquationDirect().

L'equazione di una linea retta. Questa funzione calcola il valore dell'ordinata Y per l'ascissa X all'intersezione con una linea disegnata attraverso due punti arbitrari del grafico. La funzione prende i seguenti parametri obbligatori:

  • x1, y1 - Coordinate del primo punto.
  • x2, y2 - Coordinate del secondo punto.
  • x - Valore, ascissa per cui l'ordinata Y deve essere calcolata.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect(double x1, double y1, double x2, double y2, double x) {
  if (x2==x1) return(y1);
  return((y2-y1)/(x2-x1)*(x-x1)+y1);
}
 

Esempi di come usare EquationDirect().

  • Il punto rosso è all'intersezione della linea tracciata attraverso i minimi delle barre 23 e 11 e la barra zero verticale.
    double y=EquationDirect(23, Low[23], 11, Low[11], 0);
    SetArrow(108, Red, "", 0, y);

  • Una linea retta dai punti rossi attraverso due punti arbitrari sul grafico.
    double p, x[2], y[2];
    int    cd=115, i, k, ot;
    string on;
    
    ArrayInitialize(x, 0.0);
    ArrayInitialize(y, 0.0);
    
    k=ObjectsTotal();
    for (i=k-1; i>=0; i--) {
      on=ObjectName(i);
      ot=ObjectType(on);
      if (ot==OBJ_ARROW) {
        if (ObjectGet(on, OBJPROP_ARROWCODE)==cd) ObjectDelete(on);
      }
    }
    k=ObjectsTotal();
    for (i=0; i<k; i++) {
      on=ObjectName(i);
      ot=ObjectType(on);
      if (ot==OBJ_ARROW) {
        if (x[0]==0) {
          x[0]=iBarShift(NULL, 0, ObjectGet(on, OBJPROP_TIME1));
          y[0]=ObjectGet(on, OBJPROP_PRICE1);
        } else {
          if (x[1]==0) {
            x[1]=iBarShift(NULL, 0, ObjectGet(on, OBJPROP_TIME1));
            y[1]=ObjectGet(on, OBJPROP_PRICE1);
          }
        }
      }
    }
    if (x[0]==0 || x[1]==0 || y[0]==0 || y[1]==0)
      Message("НЕ инициализированы исходные данные!");
    else {
      if (x[0]>x[1]) k=x[0]; else k=x[1];
      for (i=k; i>=0; i--) {
        if (i!=x[0] && i!=x[1]) p=EquationDirect(x[0], y[0], x[1], y[1], i);
        else {
          if (i==x[0]) p=y[0];
          if (i==x[1]) p=y[1];
        }
        SetArrow(cd, Red, "arr"+i, Time[i], p);
      }
    }

SZY. In allegato c'è uno script per testare EquationDirect().

 

Funzione GetArrowInterval().

Ho scritto questa funzione per migliorare la comodità di sviluppare indicatori di segnale, cioè quegli indicatori che danno chiari segnali di acquisto o vendita. Il segnale di tale indicatore di solito faccio come una freccia verso il basso sopra il Khai di una barra o come una freccia verso l'alto sotto il basso della barra corrispondente. Il valore di "sotto" e "sopra" era di solito qualche punto, in modo che la freccia non "corresse sopra" la barra. Non era un gran problema nel caso di un indicatore a timeframe singolo progettato solo per barre di un'ora, per esempio. Per ogni timeframe ho avuto diversi valori "sotto" e "sopra". Tuttavia, per un indicatore multiframe ho dovuto usare la funzione GetArrowInterval():

//+------------------------------------------------------------------+
//| Возвращает интервал установки сигнальных указателей              |
//+------------------------------------------------------------------+
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);
  }
}

Questa è una vecchia variante che si è trasformata molto rapidamente in una forma più compatta e versatile:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Возвращает интервал установки сигнальных указателей            |
//|  Параметры:                                                                |
//|    pr - процент относительно ценового размера окна                         |
//+----------------------------------------------------------------------------+
int GetArrowInterval(int pr=7) {
  if (pr<=0) pr=7;
  return((WindowPriceMax()-WindowPriceMin())/100*pr/Point);
}
 

Esempi di come usare GetArrowInterval().

  • Segnale di vendita sulla barra corrente.
    SetArrow(242, Red, "", Time[0], High[0]+GetArrowInterval(15)*Point, 2);

  • Segnale di acquisto sulla precedente (prima) barra.
    SetArrow(233, Blue, "", Time[1], Low[1]-GetArrowInterval()*Point, 1);
    

In allegato c'è uno script per testare la funzione GetArrowInterval().

 
Caro Igor. In e-SOTrailing, è necessario modificare le posizioni di take e stop.
 
khorosh писал (а) >>
In e-SOTrailing EA è necessario effettuare la modifica di take e stop.

Grazie! Fatto... L'EA corretto è sul mio sito web.

 
KimIV писал (а) >>

La funzione EquationDirect().

L'equazione di una linea retta. Questa funzione calcola il valore dell'ordinata Y per l'ascissa X all'intersezione con una linea disegnata attraverso due punti arbitrari del grafico. La funzione prende i seguenti parametri obbligatori:

  • x1, y1 - Coordinate del primo punto.
  • x2, y2 - Coordinate del secondo punto.
  • x - Valore, l'ascissa per la quale volete calcolare l'ordinata Y.

Scrivi la seconda parte dell'equazione della linea.

Calcola il valore dell'ordinata Y per l'ascissa di X nel punto di intersezione con una linea disegnata attraverso un punto arbitrario su un grafico con un angolo dato. La funzione prende i seguenti parametri obbligatori:

  • x1, y1 - Coordinate del primo punto.
  • a - Angolo in gradi.
  • x - Valore, l'ascissa per la quale volete calcolare l'ordinata y .

Grazie.

 
Un vero programmatore Igor. Grande rispetto e stima per te.
 
djday писал (а) >>

Scrivi la seconda parte dell'equazione di una linea retta.

Calcola il valore dell'ordinata Y per l'ascissa X nel punto di intersezione con una linea disegnata attraverso un punto arbitrario su un grafico con un angolo dato. La funzione prende i seguenti parametri obbligatori:

  • x1, y1 - Coordinate del primo punto.
  • a - Angolo in gradi.
  • x - Valore, l'ascissa per cui l'ordinata Y deve essere calcolata.

Grazie.

Un angolo di 45° si verifica quando i cateti sono uguali. Quando l'unità di misura dei cateti è metrica, non ci sono problemi. Un cateto è di due metri e anche l'altro è di due metri. Quindi è un angolo di 45°. Ma che dire quando un cateto è il numero di barre o il tempo, e l'altro cateto è il prezzo? Come ti assicuri che siano uguali in modo che l'angolo sia di 45°? È una questione di scala. Datemi un fulcro e muoverò la terra (c).