Caratteristiche utili da KimIV - pagina 57

 

La funzione ArrayInsertDouble()

Inserisce un elemento di una matrice con l'indice dato. Restituisce il numero di elementi (dimensione) del nuovo array. L'inserimento viene eseguito come segue. In primo luogo, la dimensione dell'array viene aumentata di uno. Poi tutti gli elementi che hanno un indice maggiore o uguale a quello da inserire vengono spostati alla fine dell'array uno per uno, facendo spazio a quello da inserire. Infine, il valore viene scritto nella cella richiesta. La funzione ArrayInsertDouble() prende i seguenti parametri:

  • m - Una matrice di elementi di tipo doppio.
  • e - Valore dell'elemento dell'array da inserire.
  • i - Indice dell'elemento dell'array da inserire. Se il valore dell'indice è minore di zero o maggiore o uguale alla dimensione dell'array, l'elemento verrà aggiunto alla fine dell'array. Il valore predefinito è -1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble(double& m[], double e, int i=-1) {
  int j, k=ArraySize( m);

  ArrayResize( m, k+1);
  if ( i>=0 && i< k) {
    for ( j= k; j> i; j--) m[ j]= m[ j-1];
    m[ i]= e;
  } else m[ k]= e;

  return( k+1);
}

SZY. Trovi in allegato gli script per testare le funzioni ArrayInsertDouble(), ArrayInsertInt(), ArrayInsertString().

ZZZY. Ho aggiornato la libreria b-Array sul mio sito.

 

Igor, visto che stiamo parlando di array, possiamo tornare alla mia vecchia richiesta, sull'ordinamento degli array ("Funzioni utili da KimIV"). Quello che è stato fatto prima è un po' sbagliato, scusate il TOR indefinito.

Ho bisogno di ordinare un array bidimensionale per una data colonna (riga), analogamente all'operazione in EXCEL. Questa procedura è necessaria per utilizzare la statistica di Spearman 'Spearman's Rank Correlation Coefficient', in alcune varianti di analisi delle matrici di correlazione valute (portafogli).

 

La funzione BubbleSort2().

Questa funzione bolla gli elementi di una matrice bidimensionale in una colonna arbitraria. Potete anche specificare la direzione di ordinamento. La funzione BubbleSort2() prende i seguenti parametri:

  • a - Matrice bidimensionale di elementi. Parametro obbligatorio.
  • r - Numero (indice) della colonna di ordinamento (colonna). Il valore predefinito è 0 - la prima colonna (colonna con indice zero).
  • m - Direzione di ordinamento. Valori validi: MODE_ASCEND - ordine ascendente, MODE_DESCEND - ordine discendente. Il valore predefinito è MODE_ASCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2(double& a[][], int r=0, int m= MODE_ASCEND) {
  double t;
  int    e, i, j;
  int    k=ArrayRange( a, 1);      // Количество колонок
  int    n=ArrayRange( a, 0);      // Количество строк

  if ( r<0) r=0;
  if ( r> k) r= k;

  for ( i= n-1; i>0; i--) {
    for ( j=0; j< i; j++) {
      if ( m== MODE_ASCEND) {
        // по возрастанию
        if ( a[ j][ r]> a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      } else {
        // по убыванию
        if ( a[ j][ r]< a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      }
    }
  }
}
In allegato c'è uno script per testare la funzione BubbleSort2().
File:
 

Funzione GetTypeLastDeleted().

Questa funzione restituisce il tipo dell'ultimo ordine cancellato, o -1. Ci possono essere situazioni in cui abbiamo bisogno di legare la logica dell'operazione EA al tipo di un ordine appena cancellato. Per esempio, se avete appena cancellato BuyStop, dovreste fare quello, ma se BuyLimit, dovreste fare qualcos'altro, ecc. La funzione GetTypeLastDeleted() accetta i seguenti parametri opzionali:

  • sy - Nome dello strumento. "" - qualsiasi carattere, NULL - carattere corrente. Il valore predefinito è "".
  • mn - identificatore dell'ordine dell'utente (MagicNumber). Valore predefinito -1 - qualsiasi MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()== sy || sy=="") && ( mn<0 || OrderMagicNumber()== mn)) {
        if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
          t=OrderCloseTime();
          r=OrderType();
        }
      }
    }
  }
  return( r);
}
 
beginner писал(а) >>

Sì, ora questo.

#include "b-KimIV.mqh" // Libreria di funzioni aggiuntive

Ciao Oleg!

Per una compilazione senza errori della libreria b-Positions. mqh, hai bisogno delle funzioni che sono già in questo ramo:

  • GetNameOP() - Restituisce il nome dell'operazione commerciale.
  • GetNameTF() - Restituisce il nome del timeframe.
  • IIFc() - Restituisce uno dei due valori a seconda della condizione.
  • Message() - Uscita del messaggio nel commento e nel log.

Quindi, potete fare quanto segue:

  1. Crea un file vuoto chiamato b-kimiv.mqh nella stessa cartella, dove hai b-Positions.mqh
  2. Inserite le funzioni di cui sopra e compilate b-Positions.mqh.

>> Buona fortuna!

 

La funzione iBarLargest().

Questa funzione restituisce l'indice della barra più grande o -1. La dimensione della barra è misurata dalla funzione in uno dei due modi, determinata dal parametro di input ty - tipo di elementi di ricerca. O solo le dimensioni del corpo o insieme alle ombre. La funzione iBarLargest() accetta i seguenti parametri opzionali:

  • sy - Nome dello strumento. "" o NULL - il simbolo corrente. Il valore predefinito è "".
  • tf - Timeframe. Il valore predefinito è 0 - l'intervallo di tempo corrente.
  • ty - Tipo di elementi di ricerca. Valori validi - 0 - High-Low, 1 - abs(Open-Close).
  • co - Numero di elementi della serie temporale. Valore predefinito - 0 - tutti gli elementi.
  • in - Indice della barra iniziale. Valore predefinito - 0 - barra attuale.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, int in=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( in< 0) in=0;
  if ( co<=0) co=iBars( sy, tf)- in;

  double r, rb=0;       // размер бара
  int    i, nb=-1;      // счётчик и номер бара

  for ( i= co+ in; i>= in; i--) {
    if ( ty>0) r=MathAbs(iOpen( sy, tf, i)-iClose( sy, tf, i));
    else r=iHigh( sy, tf, i)-iLow( sy, tf, i);
    if ( rb< r) {
      rb= r;
      nb= i;
    }
  }

  return( nb);
}
ZS. In allegato c'è uno script per testare la funzione iBarLargest().
File:
 

La funzione iBarOfDayCalc().

Questa funzione restituisce il numero di barra calcolato dall'inizio del giorno. Le barre sono numerate a partire da uno, cioè la barra con il tempo di apertura più breve in un dato giorno sarà la numero uno, la barra successiva sarà la numero due, ecc. Questa funzione è utile per ottimizzare i tempi di entrata/uscita. Se qualcuno è interessato ai dettagli, faccia domande. Farò del mio meglio per rispondere. La funzione iBarOfDayCalc() accetta i seguenti parametri opzionali:

  • tf - Timeframe. Il valore predefinito è 0 - l'intervallo di tempo corrente.
  • dt - Data e ora di apertura della barra. Il valore predefinito è 0 - ora corrente.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc(int tf=0, datetime dt=0) {
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }
  double ms=MathMod( dt/60, 1440);      // количество минут от начала суток
  int    bd=MathFloor( ms/ tf)+1;        // номер бара от начала суток

  return( bd);
}

SZY. in allegato c'è uno script per testare la funzione iBarOfDayCalc(). L'illustrazione qui sotto mostra come usare lo script.

File:
 

Funzione iBarOfDayReal().

Questa funzione restituisce il numero di barra attuale dall'inizio del giorno. Le barre sono numerate con uno, cioè la barra con il tempo di apertura più breve in un dato giorno avrà il numero uno, la barra successiva avrà il numero due, ecc. Non ho ancora trovato un uso pratico per questa funzione. Ma l'ho scritto per averlo :-) insieme alla funzione iBarOfDayCalc(). La funzione iBarOfDayReal() accetta i seguenti parametri opzionali:

  • sy - Nome dello strumento di trading. NULL o "" - simbolo corrente. Il valore predefinito è "".
  • tf - Timeframe. Valore predefinito - 0 - l'intervallo di tempo corrente.
  • dt - Data e ora di apertura della barra. Valore predefinito - 0 - ora corrente.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay( dt);                       // текущий день месяца
  int nb=iBarShift( sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime( sy, tf, nb))== cd) {
    nb++;
    bd++;
  }

  return( bd);
}

Allego uno script per testare la funzione iBarOfDayReal(). L'illustrazione qui sotto mostra come usare lo script.

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

La funzione iBarOfDayReal().

Non ho ancora trovato un'applicazione pratica per questa funzione.

yyyy... :)

Sono qui come strumento di allenamento, ho deciso di scrivere uno script che calcola la distanza percorsa.

Se qualcuno lo sa c'è un programma che conta quanti chilometri ha percorso il mouse sul monitor.

Quindi qui, sommate le barre aperte-chiuse del giorno corrente (settimana, mese o anno) o se immaginate

in un altro modo, come un filo e un ago che cuce una pelliccia: Aprire-chiudere-chiudere-chiudere-chiudere-chiudere-chiudere-chiudere... nel corso del grafico.

Stessa cosa ma sull'alto-basso...

*

L'intoppo è iniziato fin dai primi passi.

Come faccio a filtrare le barre del giorno corrente dal grafico...

Cercherò di applicare le vostre funzioni per questa dabbenaggine.

 

Igor. Buon pomeriggio.

Forse puoi disegnare un semplice compito per te: il compito (per me) è il seguente:

Il compito è il seguente: stabilire a quale valore di prezzo la linea del segnale attraverserà il MACD, o, in altre parole, l'istogramma MACD diventerà uguale a zero.

La soluzione di questo problema è necessaria, per esempio, per calcolare un prezzo di stop o un limite di ordine per la prossima barra nei segnali di un sistema di trading che utilizza questo indicatore,

che mostrerà visivamente il livello di prezzo, al quale l'istogramma MACD attraverserà la linea dello zero (cioè, l'attraversamento di una linea sopra il prezzo - linea sul grafico)

Questo si riferisce alla percentuale MACD calcolata usando la formulaMACD= (FastEMA/SlowEMA - 1). Periodi 12, 26, Segnale 9.

Ho i codici per Omega e Metostock, ma non riesco a trovare da nessuna parte come implementarlo in MT4.

Grazie