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

 
KimIV:
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 calculado for <0, então feche todas as negociações e venda.

:)))) claro, obrigado pela ajuda, mas meu erro, não expliquei com precisão suficiente, o indicador CCI com um intervalo de 50 mostra a direção e a mudança de tendência e a abertura ocorre quando o preço toca o EMA 8 e também usa stop-loss e take-profit e outros indicadores para determinar a correção. A imagem é que quando a CCI atravessa +100 uma posição de compra é aberta ao toque da EMA e não importa onde a CCI está (+10 ou -20), o principal é que quando atravessa -100 uma posição de venda é aberta. No intervalo de tempo entre a passagem de 100 velas e a abertura de 10 ou mais posições, a CCI>=+100 e CCI<=-100 pode passar por 100 velas. Espero que seja claro. Se você tiver alguma dica, eu ficaria feliz em ajudar.

 
B_Dima писал (а):
meu erro, não o expliquei com precisão suficiente,

Bem... Seu erro é seu para corrigir :-)

Eu lhe dei a direção correta. Isso levará ao objetivo. Portanto, vá em frente...

 
KimIV:

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

Decidi dar os primeiros exemplos que já me foram perguntados muitas vezes. Esta é a abertura de posições em termos de execução de ordens de mercado Market Watch. É quando não podemos simultaneamente dar uma ordem para abrir uma posição ao preço de mercado e anexar uma ordem pendente a ela. Tal abertura na Market Watch deve ser realizada em duas etapas: primeiro, abrimos uma posição, e depois anexamos uma ordem pendente a ela, ou seja, estabelecemos níveis de preços StopLoss e TakeProfit.

1. Comprar 0,1 lote do símbolo atual e definir uma parada de 30 pontos

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2. Venda 0,15 lote do instrumento atual e conjunto SL=45, TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
Um roteiro de trabalho com exemplos está incluído no trailer.


Igor, por favor, verifique novamente - o roteiro não funciona:

1) Nas empresas normais de corretagem não há limite para o número de ordens em aberto (abre infinitamente)

2) Nas corretoras onde as ordens são abertas no mercado - (Erro131). Você pode testá-lo, por exemplo, com a NorthFinance.

 

Tantas funções úteis dispostas... Talvez haja o desejo de escrever um modelo para escrever uma EA comercial que possa abrir e fechar ordens pendentes, posições, definir take e stoploss, modificar ordens e posições, dependendo das condições definidas pelo usuário... Tal modelo permitirá escrever rapidamente um EA onde apenas o bloco de condições muda (é claro, esta parte será inserida pelo usuário, dependendo da estratégia)...


Se existem funções úteis da Kim, ou seja, um certo padrão de versatilidade no uso, então por que não estabelecer o código de um modelo para uma EA comercial da Kim...

 
Set777 писал (а):
Igor, favor verificar novamente - o script não funciona:
1) Nas corretoras normais não há limite no número de ordens abertas (abre infinitamente)
2) Nas corretoras onde as ordens são abertas por mercado - (Erro131). Você pode testá-lo, por exemplo, NorthFinance.

1. Não há controle sobre o número de posições em aberto no roteiro. Quantas vezes você executa o roteiro, o número de posições que ele vai abrir.

Erro 131 - Volume incorreto, tamanho do lote. Provavelmente, é 0,15. Substitua por 0,2.

 
kharko писал (а):
Tantas características úteis dispostas...

Nem um quinto do que eu tenho em mente ainda... Estarei aborrecendo a todos aqui até o outono. Por isso, tenham paciência comigo...

kharko escreveu (a):
Talvez haja o desejo de escrever algum modelo para escrever um consultor de negociação, que possa abrir e fechar ordens pendentes, posições, definir take e stoploss, modificar ordens e posições, dependendo das condições definidas pelo usuário...
Modelo... Modelo... Boa idéia! Obrigado! Mas primeiro as funções...
 

Função DistMarketAndPos().

Aqui vamos nós! Aí vêm funções mais interessantes! Por exemplo, retorna a distância em pips entre o mercado e a posição mais próxima. A seleção mais precisa das posições a serem verificadas é 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. O "" ou NULL significa o instrumento atual.
  • 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      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;

  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}
 

Exemplos do uso de DistMarketAndPos().

Por que seria necessária uma função que determine a distância do mercado em relação à posição mais próxima? Vejo pelo menos quatro opções básicas:

  1. Compra ou venda. O mercado avançou em nossa direção. E assim que passa alguma distância, as posições existentes ganharam algum lucro, imediatamente fazemos um depósito - entrar novamente na mesma direção.
  2. Nós compramos ou vendemos. O mercado foi na nossa direção. Uma vez percorrida uma certa distância, e as posições existentes terem obtido um certo lucro, percebemos imediatamente que é isso! A inversão está próxima! É hora de virar. Nós fechamos nossas posições atuais e abrimos na direção oposta.
  3. Nós compramos ou vendemos. O mercado se voltou contra nós. Mas por alguma razão, temos certeza de que estamos certos e, a alguma distância do ponto de entrada mais próximo, ou seja, a algum nível de perda, nos colocamos em média e abrimos na mesma direção.
  4. Nós compramos ou vendemos. O mercado foi contra nós. E percebemos que entramos no mercado de forma incorreta. Portanto, nos fixamos em um certo nível de perda e nos abrimos na outra direção.

Se você deseja uma implementação específica de qualquer uma destas opções, escreva aqui seus pedidos. Vou atender a todos os pedidos dentro da estrutura do que listamos acima.

ZZY-ZY. Em anexo está um modelo para experimentar a função DistMarketAndPos().

Arquivos anexados:
 
Prezado KimIV Na função idPriceLevel() que faz parte de seu Expert Advisor e-TFL_v2 há um erro: na última condição gdUpPrice==0 é repetido duas vezes. Provavelmente, no segundo caso você pretendia escrever gdDnPrice==0. Por algum motivo, este EA trabalha no Testador de Estratégia em modo visual, mas a conta demo não abre posições, embora os comentários informem sobre os níveis de compra e venda. Talvez você possa me dizer o que está errado.
 
khorosh:
há um erro na função bool idPriceLevel() incluída no e-TFL_v2 Expert Advisor: gdUpPrice==0 é repetido duas vezes na última condição, você provavelmente pretendia escrever gdDnPrice==0 no segundo caso.

Obrigado! Fiz o upload da versão corrigida do e-TFL_v2 para o site.


khorosh:
Por alguma razão, este EA trabalha no meu Testador de Estratégia em modo visual, mas não abre posições em uma conta demo, embora informe os níveis de compra e venda nos comentários. Talvez você possa me dizer qual é o problema.

Não sei... Acabei de testar este Expert Advisor em uma demonstração da NorthFinance. Ontem eu liguei para meu amigo de Moscou. Ele reclamou do mesmo Conselheiro Especialista. Ele diz que ele abre posição pela linha e depois cada vez mais até que você a pare e abra muitas posições. Portanto, existiam dois objetivos para os testes:

1. A respeito de sua pergunta. Verificação da funcionalidade geral.

2. Sobre a pergunta de meu amigo. Abri apenas uma posição a partir de uma linha.

Para verificar, coloquei o e-TFL_v2 Expert Advisor em prazos de 5 minutos EURUSD, GBPUSD, USDCHF e USDJPY. Usando linhas de tendência, desenhei canais nas últimas 20-30 barras. Como resultado, o Expert Advisor trabalhou como deveria. EUR foi comprado da linha inferior, enquanto o JPY foi vendido da linha superior. Para pound and chyf tudo estava correto também. Portanto, você deve verificá-lo por conta própria. O Expert Advisor trabalha.

Razão: