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

 
KimIV:

Mas permite parar o Expert Advisor ao pressionar o botão "Expert Advisors" na barra de ferramentas.

Não há muitos parâmetros para deixar a EA, não vai ser difícil.

 

Um exemplo de utilização da função ClosePosBySizeProfitInCurrency()

Especialmente para demonstrar a função ClosePosBySizeProfitInCurrency(), escrevi um Consultor Especialista
e-CloseByProfitPosInCurrency, que fecha somente aquelas posições em que o lucro na moeda do depósito excede um determinado valor especificado. O Expert Advisor pode ser instalado em apenas uma tabela ou em várias tabelas. Você pode especificar uma lista de posições a serem fechadas usando parâmetros externos do Expert Advisor:

  • symbol="0" - Instrumento comercial. São permitidos os seguintes valores: "0" - qualquer instrumento comercial, "" - somente o instrumento atual e qualquer valor da visão geral do mercado (EURUSD, GBPUSD, etc.).
  • Operação=-1- Operação comercial. Valores válidos: -1 - qualquer comércio, 0 - OP_BUY, 1 - OP_SELL.
  • Lucro=50- Lucro na moeda do depósito.
  • MagicNumber=0- Identificador da posição.
 

Boa tarde a todos.

Você, Igor, tem uma função que fecha posições perdidas de forma similar ao ClosePosBySizeProfitInCurrency() quando uma perda especificada é atingida. (Ou, talvez, uma combinação, onde se pode especificar o fechamento sobre o lucro e sobre o prejuízo).

Pelo que entendi, podemos simplesmente definir nos parâmetros pr para OrderProfit() - com sinal de menos e conseguiremos o que estamos procurando.

É possível estabelecer o limite em pontos (não em moeda de depósito)? Se sim, então como ? (TakeProfit e StopLoss não são sugeridos)

 
rid писал (а):
Você, Igor, tem uma função que fecha posições perdidas de forma similar ao ClosePosBySizeProfitInCurrency() quando uma perda especificada é atingida. (Ou talvez um combinado, onde você pode especificar o fechamento com lucro e prejuízo).

Não, eu ainda não tenho essa função. No entanto, você pode refazer ClosePosBySizeProfitInCurrency():


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.04.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых убыток в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит/убыток                                                      |
//+----------------------------------------------------------------------------+
void ClosePosBySizeLossInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}

Fi-lo para que a perda pudesse ser passada como um número positivo (perda) e negativo (lucro com um sinal de menos).

rid escreveu:
Pelo que entendi, podemos apenas definir nos parâmetros pr para OrderProfit() - com sinal de menos e conseguiremos o que estamos procurando.

É possível estabelecer o limite em pontos (e não na moeda do depósito)? Se sim, como ? (Take Profit e Stop Loss não são uma opção)

Veja o código do e-CloseByProfit.

 
Obrigado.
 

A função ClosePositions().

Esta função fecha posições cujos parâmetros atendem aos valores especificados:

  • sy - Nome do instrumento. Se você definir este parâmetro, a função só verificará as posições do instrumento especificado. NULL significa o instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição (MagicNumber). Valor padrão -1 - qualquer MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
Por favor, ajudem-me!! Há 4 dias eu tenho estado intrigado com uma tarefa aparentemente simples. Tenho que prescrever, se a CCI se tornou superior a 100, então abrir posição de compra até que o valor seja inferior a -100, e quando for inferior a -100, então abrir posição de venda até que seja superior a 100.
 

A função ClosePosFirstProfit().

Esta função fecha posições em uma determinada ordem, ou seja, posições lucrativas primeiro, seguidas por todas as outras posições. Uma seleção mais precisa das posições a serem fechadas é definida por parâmetros externos:

  • sy - Nome do instrumento. Se este parâmetro for definido, a função só verificará as posições do instrumento especificado. NULL significa o instrumento atual, enquanto "" (padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição (MagicNumber). Valor por default -1 - qualquer MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 

A função ClosePosWithMaxProfitInCurrency().

Esta função fecha uma posição com o máximo lucro positivo na moeda do depósito. Ou seja, de cinco posições, cada uma com um lucro de -34, 15, 73, -90, 41, a posição com um lucro de 73 unidades na moeda do depósito será fechada. Uma seleção mais precisa das posições a serem fechadas é especificada usando parâmetros externos:

  • sy - Nome do instrumento. Se definirmos este parâmetro, a função só verificará as posições do instrumento especificado. NULL significa o instrumento atual, enquanto "" (padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição (MagicNumber). Valor por default -1 - qualquer MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие одной позиции с максимальным положительным профитом   |
//|             в валюте депозита                                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  }
}
 
B_Dima:
Se o valor da CCI estiver acima de 100, então abra uma posição de compra até que o valor esteja abaixo de -100 e quando estiver abaixo de -100, então abra uma posição de venda até que esteja acima de 100.

Para você, Dima, eu posso sugerir esta função:

int CCI_period=14;
int Applied_Price=PRICE_CLOSE;

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.24.2008                                                     |
//|  Описание : Возвращает торговый сигнал:                                    |
//|              1 - покупай                                                   |
//|              0 - сиди, кури бамбук                                         |
//|             -1 - продавай                                                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий номер бара)      |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double cci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
  double cci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
  int bs=0;

  if (cci1<=+100 && cci0>+100) bs=+1;
  if (cci1>=-100 && cci0<-100) bs=-1;

  return(bs);
}

Esta função retorna 1 quando se compra e -1 quando se vende. As condições de compra/venda são as que você deseja que sejam. Tudo o que você precisa fazer agora é fazer o seguinte em cada tic tac:

1. Obtenha o valor da GetTradeSignal().

2. Se o valor recebido ==0, então não faça nada.

Se o valor recebido for >0, então feche todas as vendas e compras.

4. Se o valor obtido for <0, então feche todas as compras e vendas.

Razão: