Caratteristiche utili da KimIV - pagina 44

 

Esempi di come usare GetNearestDownFractal().

  • Il livello di prezzo del frattale al rialzo più vicino sul grafico corrente. La formula frattale è 2-2 (standard).
    Message(GetNearestUpFractal());
  • Il livello di prezzo del frattale superiore più vicino sul grafico H1 di USDJPY. La formula del frattale 5-2.
    Message(GetNearestUpFractal("USDJPY", PERIOD_H1, 5));
  • Disegna una linea orizzontale attraverso il livello di prezzo del frattale superiore 4-3 più vicino sul grafico corrente.
    double p=GetNearestUpFractal(NULL, 0, 4, 3);
    SetHLine(Red, "", p);

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

 

Funzione CorrectTF().

Ho scritto questa funzione dopo aver scoperto che a volte posso facilmente specificare un timeframe errato, che è uguale a un numero intero di minuti, nei parametri di input di un indicatore o di un EA. Per esempio, ho inserito 50 per l'ora invece di 60. Bene... un po' mancato. Risulta che la funzione iRSI() restituisce zero per un timeframe errato. Non posso dire nulla sulle altre funzioni, perché non le ho controllate. Per evitare malintesi derivanti dai miei errori di disattenzione, ho scritto questa funzione come una primitiva infallibile. Regola il parametro di input al tempo "più vicino" appropriato e corretto e restituisce il suo valore.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.03.2008                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  if (TimeFrame< PERIOD_M5                         ) return(PERIOD_M1);
  if (TimeFrame>=PERIOD_M5  && TimeFrame<PERIOD_M15) return(PERIOD_M5);
  if (TimeFrame>=PERIOD_M15 && TimeFrame<PERIOD_M30) return(PERIOD_M15);
  if (TimeFrame>=PERIOD_M30 && TimeFrame<PERIOD_H1 ) return(PERIOD_M30);
  if (TimeFrame>=PERIOD_H1  && TimeFrame<PERIOD_H4 ) return(PERIOD_H1);
  if (TimeFrame>=PERIOD_H4  && TimeFrame<PERIOD_D1 ) return(PERIOD_H4);
  if (TimeFrame>=PERIOD_D1  && TimeFrame<PERIOD_W1 ) return(PERIOD_D1);
  if (TimeFrame>=PERIOD_W1  && TimeFrame<PERIOD_MN1) return(PERIOD_W1);
  if (TimeFrame>=PERIOD_MN1                        ) return(PERIOD_MN1);
}
SZY. In allegato c'è uno script per testare la funzione CorrectTF().
File:
 

La funzione DateBeginQuarter().

Questa funzione restituisce la data di inizio del trimestre per il suo numero. Per esempio, se ora è il 27.08.2008, la data di inizio del trimestre corrente sarà il 01.07.2008. La funzione prende solo un parametro - il numero del trimestre relativo al trimestre corrente. Per esempio, 0 è il trimestre corrente, 1 è il trimestre successivo e -1 è il trimestre precedente. Cioè, i numeri positivi dei quarti richiederanno date dal futuro, mentre zero e negativi richiederanno date dal passato. Il valore restituito è il numero di secondi trascorsi dalle 00:00 del 1° gennaio 1970.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату начала квартала                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позапрошлый)                      |
//|                                    (-1 - прошлый)                          |
//|    nq - номер квартала             ( 0 - текущий)                          |
//|                                    ( 1 - следующий)                        |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateBeginQuarter(int nq=0) {
  int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);
  int mo=Month()-MathMod(Month()+2, 3)+3*nq;
  if (mo<1) {
    mo+=12;
    ye--;
  }
  if (mo>12) {
    mo-=12;
    ye++;
  }

  return(StrToTime(ye+"."+mo+".01"));
}

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

 

La funzione DateOfMonday().

Questa funzione restituisce la data di inizio della settimana (lunedì) tramite il suo numero. Per esempio, se ora è il 29.08.2008, la data di inizio della settimana corrente sarà il 25.08.2008. La funzione prende solo un parametro - il numero di settimana relativo alla settimana corrente. Per esempio, 0 è la settimana corrente, 1 è la settimana successiva e -1 è la settimana precedente. Cioè, i numeri positivi della settimana richiederanno date dal futuro, mentre i numeri zero e negativi richiederanno date dal passato. Il valore restituito è il numero di secondi trascorsi dalle 00:00 del 1° gennaio 1970.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.05.2008                                                     |
//|  Описание : Возвращает дату понедельника по номеру недели                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - предпредыдущая неделя)            |
//|                                    (-1 - предыдущая неделя)                |
//|    nn - номер недели               ( 0 - текущая неделя)                   |
//|                                    ( 1 - следующая неделя)                 |
//|                                    ( 2 - последующая неделя)               |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int nn=0) {
  datetime dt=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));

  while (TimeDayOfWeek(dt)!=1) dt-=24*60*60;
  dt+=nn*7*24*60*60;

  return (dt);
}

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

File:
 

La funzione Fibonacci().

Questa funzione restituisce un elemento di una serie di Fibonacci per il suo numero di sequenza.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.08.2008                                                     |
//|  Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    n - номер элемента ряда                                                 |
//+----------------------------------------------------------------------------+
int Fibonacci(int n) {
  int a=0, b=0, i=1, s=0;

  if (n==1) s=1;
  if (n>1) {
    s=1;
    while (i<n) {
      i++;
      a=b;
      b=s;
      s=a+b;
    }
  }
  return(s);
}

P.S. In allegato c'è uno script per testare Fibonacci().

File:
 

Funzione GetNameMA().

Questa funzione restituisce il nome del metodo MA (Moving Averages) tramite il suo identificatore. Questa funzione è comoda da usare nei commenti, indicatori e messaggi di Expert Advisors.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование метода МА.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mm - идентификатор метода МА                                            |
//+----------------------------------------------------------------------------+
string GetNameMA(int mm) {
  switch (mm) {
    case MODE_SMA : return("SMA");
    case MODE_EMA : return("EMA");
    case MODE_SMMA: return("SMMA");
    case MODE_LWMA: return("LWMA");
    default       : return("Unknown Method");
  }
}
 
KimIV писал (а) >>

Funzione GetNameMA().

Questa funzione restituisce il nome del metodo MA (Moving Averages) tramite il suo identificatore. Questa funzione è utile in commenti, indicatori e Expert Advisors.

Non consideratelo come un pignolo ....

default       : return("Unknown Method");

È solo che se vuoi essere coerente, devi andare fino in fondo...
 
TheXpert писал (а) >>

Non pensare che sia un modo per prendersela con ....

con tutti i mezzi... grazie! Corretto!

 
KimIV

Buon pomeriggio!

Aiutatemi a far passare l'expo solo un po'.

Non posso credere che stia aprendo ordini e non chiudendo questa pila su condizione.

Cioè, se un affare è solo uno, esce dalla posa e se ci sono 2 affari, si spegne.

File:
panzer.mq4  5 kb
 

Funzione GetPriceDiffInPoint().

Questa funzione restituisce la differenza di prezzo tra due barre, che sono specificate dai loro numeri. Lo scopo di sviluppare questa funzione era quello di determinare il valore e la direzione del movimento del prezzo. La funzione GetPriceDiffInPoint() determina i punti di riferimento (Open o High o Low o Close) delle barre da prendere in considerazione. La funzione accetta i seguenti parametri opzionali:

  • sy - Nome dello strumento. "" o NULL - simbolo corrente. Il valore predefinito è NULL.
  • tf - Timeframe. Valore predefinito 0 - simbolo corrente.
  • n2 - Numero della barra di sinistra. Valore predefinito - 2.
  • n1 - Numero della barra di destra. Valore predefinito - 1.

Valore restituito:

  • positivo - c'è stato un aumento del tasso tra le barre N2 e N1.
  • Negativo - c'è stata una diminuzione tra le barre N2 e N1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает ценовую разницу в пунктах между двумя барами.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий таймфрейм)  |
//|    n2 - номер левого бара               (    2       - второй бар)         |
//|    n1 - номер правого бара              (    1       - первый бар)         |
//|  Возвращаемое значение:                                                    |
//|    положительное - между барами N2 и N1 был рост курса                     |
//|    отрицательное - между барами N2 и N1 было снижение курса                |
//+----------------------------------------------------------------------------+
int GetPriceDiffInPoint(string sy="0", int tf=0, int n2=2, int n1=1) {
  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  int    d=MarketInfo(sy, MODE_DIGITS);
  int    dd=0, k=iBars(sy, tf);

  if (n1>k || n2>k)
    Print("GetPriceDiffInPoint(): Недостаточно баров для ",sy," ",GetNameTF(tf));
  else {
    if (n1>0 && n2>0) {
      int d1=NormalizeDouble((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
      int d2=NormalizeDouble((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);

      if (MathAbs(d1)>MathAbs(d2)) dd=d1;
      if (MathAbs(d1)<MathAbs(d2)) dd=d2;
      if (MathAbs(d1)==MathAbs(d2)) {
        if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
      }
    }
  }

  return(dd);
}
Motivazione: