Características úteis da KimIV - página 11

 
KimIV:
Todo homem tem a direita para a esquerda... hee... Eu vou me divertir um pouco com isto

Ilnar, no tópico Ordens fractais pendentes, perguntou: Como fazer ordens pendentes sobre fractais?


Acho que a Ilnar teve algumas dificuldades com os níveis de preços fractais. É por isso que eu sugiro usar minha função:


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. 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);
}
Função FindNearFractal() procura o fractal mais próximo do tipo especificado no símbolo especificado, no prazo determinado, e retorna seu nível de preço. Conhecendo o nível de preço da localização do fractal, já é fácil colocar um pedido nesse nível.
É possível que a função devolva dois valores, por exemplo, o número da barra onde o fractal está localizado, ou devemos conectar outro?
 
xrust писал (а):
É possível que a função retorne dois valores, por exemplo, também o número de barra onde o fractal está localizado, ou devo conectar outro?
E por que devolver dois valores quando um - o número da barra - é suficiente? Para este fim, na declaração:
return(NormalizeDouble(f, d));
escrever o valor do contador de barras ao invés do nível de preço. Na saída, você receberá o número de barra do fractal. E você obterá o nível de preço com uma das funções iHigh () ou iLow(), dependendo do tipo fractal.
 
Não, está tudo claro aqui, eu estou basicamente perguntando. Obrigado, seus postos são muito úteis.
 
xrust:
Não, é claro, eu estou basicamente perguntando.
ah... Bem, se em princípio, você pode usar um array passado por referência. Então o número de parâmetros devolvidos seria limitado pelo tamanho da matriz.
 

Função ExistOrdersByLot().

Devolve uma bandeira para a existência de um pedido com o tamanho de lote especificado. Verdadeiro - a ordem existe (conjunto), Falso - a ordem não existe (não conjunto). Você pode limitar a lista de ordens a serem verificadas usando os parâmetros da função:

  • sy - Nome do instrumento. Se você definir este parâmetro, a função só verificará as ordens do instrumento especificado. NULL significa instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação, tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 indica qualquer tipo de pedido.
  • mn - Identificador do pedido (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.
  • lo - Tamanho de um lote com uma precisão de duas casas decimais. O valor padrão é 0 - qualquer tamanho de lote.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Exemplos de como usar a função ExistOrdersByLot().

  1. Verifique se há algum pedido com tamanho de lote 0,2
    ExistOrdersByLot("", -1, -1, 0.2);
  2. Verifique qualquer pedido com o tamanho de lote 0,3 no símbolo do gráfico atual
    ExistOrdersByLot(NULL, -1, -1, 0.3);
  3. Verifique se há um pedido BuyLimit com o tamanho de lote 0,5 para qualquer símbolo
    ExistOrdersByLot("", OP_BUYLIMIT, -1, 0.5);
  4. Verifique a presença do pedido SellStop com o tamanho de lote 0,1 e o número mágico 123456 por EURUSD
    ExistOrdersByLot("EURUSD", OP_SELLSTOP, 123456, 0.1);
  5. Verifique a presença de qualquer pedido com o lote 0,4 com o número mágico 987 em USDJPY
    ExistOrdersByLot("USDJPY", -1, 987, 0.4);

Em anexo, como de costume, está um roteiro de trabalho com os exemplos acima.

Arquivos anexados:
 

Função GetLotLastOrder().

Devolve o tamanho do lote do último pedido colocado ou -1. Você pode limitar a lista de ordens a serem verificadas usando os parâmetros da função:

  • sy - Nome do instrumento. Se este parâmetro for dado, a função somente verificará as ordens do instrumento especificado. NULL significa o instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação, tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 significa qualquer ordem.
  • mn - Identificador do pedido (MagicNumber). O valor padrão -1 significa qualquer 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);
}
 

Exemplos de como usar GetLotLastOrder().

  1. Encontre o tamanho do lote do último pedido feito
    GetLotLastOrder();
  2. Encontre o tamanho do lote do último pedido colocado no símbolo atual
    GetLotLastOrder(NULL);
  3. Encontre o tamanho do lote do último pedido BuyLimit em qualquer símbolo
    GetLotLastOrder("", OP_BUYLIMIT);
  4. Encontre o tamanho do lote do último pedido SellStop com o número mágico 123456 em EURUSD
    GetLotLastOrder("EURUSD", OP_SELLSTOP, 123456);
  5. Especificar o tamanho do lote do último pedido com o número mágico 2345 para o símbolo atual
    GetLotLastOrder(NULL, -1, 2345);

Em anexo, encontra-se um roteiro de trabalho tradicional com os exemplos acima.

Arquivos anexados:
 

Função GetOrderOpenPrice().

Retorna o preço de ajuste do último pedido aberto ou 0. Você pode limitar a lista de pedidos a serem verificados com parâmetros de função:

  • sy - Nome do instrumento. Se este parâmetro for dado, a função somente verificará as ordens do instrumento especificado. NULL significa o instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação, tipo de ordem pendente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP ou -1. O valor padrão de -1 indica qualquer ordem.
  • mn - Identificador do pedido (MagicNumber). O valor padrão -1 significa qualquer 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);
}
 

Exemplos de como usar o GetOrderOpenPrice().

  1. Obtenha o preço de abertura do último pedido efetuado
    GetOrderOpenPrice();
  2. Encontre o preço do último pedido feito com o símbolo atual
    GetOrderOpenPrice(NULL);
  3. Encontre o preço de ajuste do último pedido BuyLimit em qualquer símbolo
    GetOrderOpenPrice("", OP_BUYLIMIT);
  4. Encontre o preço do último pedido SellStop feito com o mágico 123456 em EURUSD
    GetOrderOpenPrice("EURUSD", OP_SELLSTOP, 123456);
  5. Especificar o preço do último pedido feito com o mágico 2345 para o símbolo atual
    GetOrderOpenPrice(NULL, -1, 2345);

Em anexo está um roteiro perfeitamente funcional com os exemplos acima.

Arquivos anexados: