Caratteristiche utili da KimIV - pagina 11

 
KimIV:
Ogni uomo ha il diritto alla sinistra... hee... Mi divertirò un po' con questo

Ilnar, nel topic Pending Fractal Orders, ha chiesto, Come fare ordini pendenti su frattali?


Credo che Ilnar abbia avuto qualche difficoltà con i livelli di prezzo frattali. Ecco perché suggerisco di usare la mia funzione:


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 07.10.2006                                                      |
//| Описание : Поиск ближайшего фрактала.                                      |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента     (NULL - текущий символ)                |
//|   tf - таймфрейм                    (  0  - текущий ТФ)                    |
//|   mode - тип фрактала               (MODE_LOWER|MODE_UPPER)                |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
La funzione FindNearFractal() cerca il frattale più vicino del tipo specificato al simbolo specificato, al timeframe dato, e restituisce il suo livello di prezzo. Conoscendo il livello di prezzo della posizione del frattale, è già facile piazzare un ordine a quel livello.
È possibile che la funzione restituisca due valori, per esempio il numero della barra in cui si trova il frattale, o dobbiamo collegarne un altro?
 
xrust писал (а):
È possibile che la funzione restituisca due valori, per esempio anche il numero della barra dove si trova il frattale, o devo collegarne un altro?
E perché restituire due valori quando uno - il numero della barra - è sufficiente? A tal fine, nella dichiarazione:
return(NormalizeDouble(f, d));
scrivere il valore del contatore a barre s invece del livello di prezzo. Sull'output otterrete il numero di barra del frattale. E otterrete il livello di prezzo con una delle funzioni iHigh () o iLow() a seconda del tipo di frattale.
 
No, qui è tutto chiaro, in pratica sto chiedendo. Grazie, i tuoi post sono molto utili.
 
xrust:
No, è chiaro, sto praticamente chiedendo.
ah... Beh, se in linea di principio, si può usare un array passato per riferimento. Allora il numero di parametri restituiti sarebbe limitato dalla dimensione dell'array.
 

Funzione ExistOrdersByLot().

Restituisce un flag per l'esistenza di un ordine con la dimensione del lotto specificata. True - l'ordine esiste (impostato), False - l'ordine non esiste (non impostato). Puoi limitare la lista degli ordini da controllare usando i parametri della funzione:

  • sy - Nome dello strumento. Se imposti questo parametro, la funzione controllerà solo gli ordini dello strumento specificato. NULL significa strumento corrente, e "" (di default) significa qualsiasi strumento.
  • op - Operazione, tipo di ordine in sospeso. Valori validi: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. Il valore predefinito di -1 indica qualsiasi tipo di ordine.
  • mn - Identificatore dell'ordine (MagicNumber). Il valore predefinito di -1 significa qualsiasi MagicNumber.
  • lo - Dimensione di un lotto con una precisione di due cifre decimali. Il valore predefinito è 0 - qualsiasi dimensione del lotto.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает флаг существования ордера по размеру лота.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    lo - лот                        ( 0   - любой лот)                      |
//+----------------------------------------------------------------------------+
bool ExistOrdersByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), ot;
  lo=NormalizeDouble(lo, 2);

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (lo<=0 || NormalizeDouble(OrderLots(), 2)==lo) return(True);
          }
        }
      }
    }
  }
  return(False);
}
 

Esempi di come usare la funzione ExistOrdersByLot().

  1. Controlla qualsiasi ordine con dimensione del lotto 0,2
    ExistOrdersByLot("", -1, -1, 0.2);
  2. Controlla qualsiasi ordine con dimensione del lotto 0,3 sul simbolo del grafico corrente
    ExistOrdersByLot(NULL, -1, -1, 0.3);
  3. Controlla se c'è un ordine BuyLimit con la dimensione del lotto 0,5 per qualsiasi simbolo
    ExistOrdersByLot("", OP_BUYLIMIT, -1, 0.5);
  4. Controlla la presenza dell'ordine SellStop con la dimensione del lotto 0,1 e il numero magico 123456 da EURUSD
    ExistOrdersByLot("EURUSD", OP_SELLSTOP, 123456, 0.1);
  5. Verificare la presenza di un ordine con lotto 0,4 con numero magico 987 su USDJPY
    ExistOrdersByLot("USDJPY", -1, 987, 0.4);

In allegato, come al solito, c'è uno script funzionante con gli esempi di cui sopra.

 

Funzione GetLotLastOrder().

Restituisce la dimensione del lotto dell'ultimo ordine piazzato o -1. Puoi limitare la lista degli ordini da controllare usando i parametri della funzione:

  • sy - Nome dello strumento. Se questo parametro è dato, la funzione controllerà solo gli ordini dello strumento specificato. NULL significa lo strumento corrente, e "" (di default) significa qualsiasi strumento.
  • op - Operazione, tipo di ordine in sospeso. Valori validi: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. Il valore predefinito di -1 significa qualsiasi ordine.
  • mn - Identificatore dell'ordine (MagicNumber). Il valore predefinito -1 significa qualsiasi MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает размер лота последнего выставленного ордера или -1  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}
 

Esempi di come usare GetLotLastOrder().

  1. Trova la dimensione del lotto dell'ultimo ordine effettuato
    GetLotLastOrder();
  2. Trova la dimensione del lotto dell'ultimo ordine piazzato al simbolo corrente
    GetLotLastOrder(NULL);
  3. Trova la dimensione del lotto dell'ultimo ordine BuyLimit in qualsiasi simbolo
    GetLotLastOrder("", OP_BUYLIMIT);
  4. Trova la dimensione del lotto dell'ultimo ordine SellStop con il numero magico 123456 su EURUSD
    GetLotLastOrder("EURUSD", OP_SELLSTOP, 123456);
  5. Specificare la dimensione del lotto dell'ultimo ordine con numero magico 2345 per il simbolo corrente
    GetLotLastOrder(NULL, -1, 2345);

In allegato c'è uno script tradizionalmente funzionante con gli esempi di cui sopra.

 

Funzione GetOrderOpenPrice().

Restituisce il prezzo di impostazione dell'ultimo ordine aperto o 0. Puoi limitare la lista degli ordini da controllare con i parametri della funzione:

  • sy - Nome dello strumento. Se questo parametro è dato, la funzione controllerà solo gli ordini dello strumento specificato. NULL significa strumento corrente, e "" (di default) significa qualsiasi strumento.
  • op - Operazione, tipo di ordine in sospeso. Valori validi: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. Il valore predefinito di -1 significa qualsiasi ordine.
  • mn - Identificatore dell'ordine (MagicNumber). Il valore predefinito -1 significa qualsiasi MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает цену установки последнего ордера или 0.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetOrderOpenPrice(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=0;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 

Esempi di come usare GetOrderOpenPrice().

  1. Ottieni il prezzo di apertura dell'ultimo ordine effettuato
    GetOrderOpenPrice();
  2. Trova il prezzo dell'ultimo ordine piazzato al simbolo corrente
    GetOrderOpenPrice(NULL);
  3. Trova il prezzo di impostazione dell'ultimo ordine BuyLimit in qualsiasi simbolo
    GetOrderOpenPrice("", OP_BUYLIMIT);
  4. Trova il prezzo dell'ultimo ordine SellStop piazzato con la magia 123456 su EURUSD
    GetOrderOpenPrice("EURUSD", OP_SELLSTOP, 123456);
  5. Specifica il prezzo dell'ultimo ordine piazzato con magic 2345 per il simbolo corrente
    GetOrderOpenPrice(NULL, -1, 2345);

In allegato c'è uno script perfettamente funzionante con gli esempi di cui sopra.

Motivazione: