Caratteristiche utili da KimIV - pagina 46

 
SK. писал (а) >>

Questo è quello che voglio dire. Bisogna tenere conto dei vincoli esistenti, che, in generale, cambiano continuamente.

C'è qualche funzione che analizza tutti i possibili vincoli?

Lo stesso per le modifiche.

--

(Ho 16 funzioni - 3 per ogni ordine buono (OP, SL, TP) e 2 per ogni ordine a mercato (SL, TP),

e poi altre funzioni che analizzano le combinazioni di permessi).

Sì, ho anche una funzione separata per impostare un ordine controllando tutte le limitazioni possibili e una separata (parzialmente simile alla prima) per le modifiche. non darò il codice - c'è così tanta roba "sinistra" lì che solo io ho bisogno, che - ahi. :-) ma in generale - è difficile senza di esso nel trading reale Expert Advisors. :-)

 
Shu писал (а) >>

Sì, ho anche una funzione separata per impostare un ordine, che controlla tutte le possibili limitazioni e una separata (parzialmente simile alla prima) per la modifica. Non vi darò il codice - ci sono così tanti trucchi "a sinistra", che servono solo a me, che - ahi. :-) ma in generale - è difficile senza di esso nel trading reale Expert Advisors. :-)

In realtà, volevo verificare io stesso - se ho tenuto conto di tutto. Se non li controllate, potete andare incontro a una serie di rimbalzi (a volte con la prospettiva di essere bannati).

Elencherò brevemente i miei controlli.

1) StopLevel. Per esempio, quando si modifica il SL BuyStop.

Non controlla solo la distanza. Dovresti analizzare la posizione attuale di StopLevel e la direzione del movimento dell'ordine di stop.

Se SL è al di fuori del corridoio di StopLevel, puoi spostarlo vicino o spostarlo indefinitamente.

Se lo SL è all'interno del corridoio, il movimento verso l'alto viene respinto. Il movimento verso il basso è accettato, ma con considerazione dello StopLevel: se la distanza di modifica all'interno del corridoio di distanza è impostata a 3 p, e il corridoio è 30 p, allora il valore effettivo accettato per l'esecuzione è definito dal confine del corridoio StopLevel.

2) FreezeLevel.

3. rapporto tra StopLevel e TICKSIZE. L'ordine può essere fuori da tutti i corridoi, ma non multiplo di TICKSIZE - allora è un problema. Deve essere arrotondato verso la direzione di modifica. Critico per "non valuta".

4. Lotti. Minlote +/- minlote. Tieni conto che le chiusure parziali e le controchiusure sono limitate anche ai minlot (anche se secondo me è illogico, ma è così).

Dopo gli assegni personali, l'ordine viene emesso se ogni assegno si è concluso positivamente (nessun divieto).

 

Librerie di funzioni completamente pubblicate:

b-Graphics.rar - lavora con oggetti grafici.

b-Indicators.rar - lavora con gli indicatori.

 

La funzione ArrayLR().

Questa funzione genera un array di valori di regressione lineare. La funzione accetta i seguenti parametri obbligatori:

  • x è un array di valori di serie numeriche. Questo è il parametro di ingresso. Questo array deve contenere i valori prima che la funzione venga chiamata.
  • y è una matrice di valori di regressione lineare. Questo è il parametro di uscita, cioè l'array sarà riempito dopo l'esecuzione della funzione.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.05.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    y - массив значений линейной регрессии                                  |
//+----------------------------------------------------------------------------+
void ArrayLR(double& x[], double& y[]) {
  double a, b, c, sx=0, sx2=0, sxy=0, sy=0;
  int    i, n=ArraySize(x);

  if (n>1) {
    for (i=0; i<n; i++) {
      sx+=i+1;
      sy+=x[i];
      sxy+=(i+1)*x[i];
      sx2+=(i+1)*(i+1);
    }
    a=sx*sy-n*sxy;
    c=sx*sx-n*sx2;
    if (c!=0) a=a/c; else a=0;
    b=(sy-a*sx)/n;
    ArrayResize(y, n);
    for (i=0; i<n; i++) y[i]=a*(i+1)+b;
  } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", n);
}
 

Esempio di utilizzo della funzione ArrayLR().

Segniamo i livelli di prezzo della regressione lineare per le 30 barre precedenti.

#define r 30
double x[r], y[];
for (int i=0; i<r; i++) x[i]=Close[i+1];
ArrayLR(x, y);
for (i=0; i<r; i++) SetArrow(170, Red, "arr"+i, Time[i+1], y[i]);

P.S. In allegato c'è uno script per testare la funzione ArrayLR().

File:
 
KimIV писал (а) >>

Librerie di funzioni completamente pubblicate:

b-Graphics.rar - lavora con oggetti grafici.

b-Indicators.rar - lavora con gli indicatori.

Molto figo! >> Grazie!

 
Parabellum писал (а) >>

Igor, c'è un buon indicatore che può combinare diverse candele in una sola. Ma funziona solo sul grafico orario. È possibile renderlo universale?

Grazie.

?

 
Parabellum писал (а) >>

?

ooh... Scusa...

Un simile indicatore è già stato scritto, non ricordo da chi e non ricordo dove l'ho visto... Pensavo che l'avresti trovato da solo o che qualcuno ti avrebbe dato il link...

 

La funzione ArrayLR() non funziona accuratamente.

1. Non tiene conto della posizione temporale delle barre. Funziona in modo errato quando mancano le barre.

2. l'algoritmo utilizzato per calcolare i coefficienti ha un inconveniente sotto forma di accumulo di errori di arrotondamento, vedi 'Help me write a linear regression' (il fondo della pagina di Rosh conferma questa insidia).

3. Propongo un algoritmo senza questi inconvenienti.

4. Se sostituite X[i]=Time[i+1]; con X[i]=i+1; l'algoritmo è simile, ma senza accumulo di errori.

5. I bar sono saltati non solo nei fine settimana :-(((

Ecco la mia variante

//+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов aka Prival,  Skype: privalov-sv                |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.09.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии y(x)=A*x+B.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    X    - массив значений числового ряда, ось X                            |
//|    Y    - массив значений числового ряда, ось Y                            |
//+----------------------------------------------------------------------------+

void Array_LR(double &X[], double& Y[])
{
      double mo_X = 0, mo_Y = 0, var_0 = 0, var_1 = 0;
      int    i,N=ArraySize(X);
      double A,B;
     
      if(N>1)  {
         for ( i = 0; i < N; i ++ ) {
            mo_X +=X[i];
          mo_Y +=Y[i];
      }
      mo_X /=N;
      mo_Y /=N;
        
      for ( i = 0; i < N; i ++ )   {
         var_0 +=(X[i]-mo_X)*(Y[i]-mo_Y);
         var_1 +=(X[i]-mo_X)*(X[i]-mo_X);
      }
      // значение коэффициента A
      if(var_1!=0)   A = var_0 / var_1; else A=0;
      // значение коэффициента B
      B = mo_Y - A * mo_X;
      ArrayResize(Y, N);
     for (i=0; i<N; i++) Y[i]=A*X[i]+B;
    } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", N);
    
}

ecco un'immagine

Esempio di lavoro

#define r 280
void start() {
  double X[r], Y[r];
  for (int i=0; i<r; i++)  {
    Y[i]=Close[i+1];
    X[i]=Time[i+1];
  }
   Array_LR(X, Y);
  for (i=0; i<r; i++) {SetArrow(170, Blue, "arr"+i, X[i], Y[i])}

Script di controllo allegato

File:
 
Prival писал (а) >>
Ecco la mia variante

Ok, Sergei, facciamo che ci siano due varianti di questa funzione.

La mia variante è buona perché è identica all'oggetto grafico integrato OBJ_REGRESSION. Se qualcuno ha bisogno di prendere prezzi da questo oggetto, la mia funzione lo aiuterà, mentre la tua, ahimè... Ma potrebbe essere usato per qualcos'altro... Grazie!