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

 

Boa tarde.

Ainda sou novo em programação, se alguém puder me dar uma dica.

Pergunta. Temos um ou mais pedidos em aberto. Sabemos que eles fecharão com um lucro de 20 dólares.

Precisamos saber a que preço os pedidos serão fechados com lucro de 20 dólares.

Calculamos o volume total de lotes abertos, e então!

Por favor, aconselhe como fazer isso.

Talvez haja uma função pronta?

Obrigado de antemão.

 
KimIV:

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 posicionamos na mesma direção 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().


OláKimIV, a função é muito boa, funciona, eu a viro, funciona também, mas não consigo conectar as duas metades.

     int start()

{

      if (DistMarketAndPos()>150)

{                                     

      OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,Ask+150*Point);

   }     

      return(0);

   }

int DistMarketAndPos(string sy="", int op=OP_BUY, 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, "")<0) p=0.00001; 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);

}  


 

Por favor, vire-a para mim, todos dizem que está errada, mas funciona.
 
Recém-chegados, façam suas perguntas no tópico dedicado.
 

Nova versão da função Message().


A função Mensagem() sofreu duas mudanças desde sua publicação aqui. A primeira mudança acrescentou a possibilidade de desativar a saída para o log Expert por impressão() e a possibilidade de emitir apenas a primeira mensagem em uma série de mensagens semelhantes. A segunda mudança adicionou direções de saída, ou seja, além das funções Comentário() e Imprimir() Alerta(), SendMail() e SendNotification() existentes foram usadas. É esta última mudança que eu estou publicando.

A função Message() é projetada para emitir a mensagem de texto em diferentes direções. Pode ser usado tanto para fins de depuração como em aplicações prontas para explicar a situação comercial atual, para registrar a operação do programa, para informar oportunamente um comerciante sobre mudanças importantes, etc. A função aceita três parâmetros, os dois últimos dos quais são opcionais:
  • ms - String, mensagem de texto a ser emitida, transmitida.
  • nv - Um conjunto de bandeiras que especificam a direção da saída da mensagem. Cinco bandeiras são cinco lugares significativos. Cada face de bandeira com zero gira e uma gira em uma determinada direção de saída. Da esquerda para a direita em ordem são Alerta, Comentário, Impressão, SendMail e SendNotification. O valor padrão é "01100", ou seja, Comentário e Impressão estão habilitados, os outros estão desabilitados.
  • am - Lógico, Verdadeiro - emitem todas as mensagens, Falso - a partir de uma série de mensagens idênticas emitem apenas a primeira. O valor padrão é Falso.

Sobre as direções de saída de Alerta e Impressão (espaços 1 e 3) deve-se observar que eles são capazes de emitir a mensagem linha por linha. Isto é, se houver uma quebra de linha no texto da mensagem - caráter de controle "\n", então cada linha será impressa de forma independente. Experimente o roteiro de teste no anexo, acho que você vai gostar :-)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message(string ms, string nv="01100", bool am=False) {
  static string prevMessage="";
  string as[];
  int    i, k;

  if (StrToInteger(StringSubstr(nv, 1, 1))==1) Comment(ms);
  if ((StringLen(ms)>0) && (am || prevMessage!=ms)) {
    if (StrToInteger(StringSubstr(nv, 0, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Alert(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 2, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Print(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 3, 1))==1) SendMail(WindowExpertName(), ms);
    if (StrToInteger(StringSubstr(nv, 4, 1))==1) SendNotification(ms);
    prevMessage=ms;
  }
}

SZY. Em anexo está um roteiro para testar a função Message().

Arquivos anexados:
 
KimIV:

Nova versão da função Message().


A função Mensagem() sofreu duas mudanças desde sua publicação aqui. A primeira mudança acrescentou a possibilidade de desativar a saída para o log Expert por impressão() e a possibilidade de emitir apenas a primeira mensagem em uma série de mensagens semelhantes. A segunda mudança adicionou direções de saída, ou seja, além das funções Comentário() e Imprimir() Alerta(), SendMail() e SendNotification() existentes foram usadas. É esta última mudança que eu estou publicando.

A função Message() é projetada para emitir a mensagem de texto em diferentes direções. Pode ser usado tanto para fins de depuração como em aplicações prontas para explicar a situação comercial atual, para registrar a operação do programa, para informar oportunamente um comerciante sobre mudanças importantes, etc. A função aceita três parâmetros, os dois últimos dos quais são opcionais:
  • ms - String, mensagem de texto a ser emitida, transmitida.
  • nv - Um conjunto de bandeiras que especificam a direção da saída da mensagem. Cinco bandeiras são cinco lugares significativos. Cada face de bandeira com zero gira e uma gira em uma determinada direção de saída. Da esquerda para a direita em ordem são Alerta, Comentário, Impressão, SendMail e SendNotification. O valor padrão é "01100", ou seja, Comentário e Impressão estão habilitados, os outros estão desabilitados.
  • am - Lógico, Verdadeiro - emitem todas as mensagens, Falso - a partir de uma série de mensagens idênticas emitem apenas a primeira. O valor padrão é Falso.

Sobre as direções de saída de Alerta e Impressão (espaços 1 e 3) deve-se observar que eles são capazes de emitir a mensagem linha por linha. Isto é, se houver uma quebra de linha no texto da mensagem - caráter de controle "\n", então cada linha será impressa de forma independente. Experimente o roteiro de teste no anexo, acho que você vai gostar :-)


SZY. Em anexo está um roteiro para testar a função Message().

Você adicionou uma verificação stopplay à sua função OpenPosition?
 
sv.:
Você adicionou uma verificação para parar de nivelar a sua função OpenPosition?


Não... a que tipo de cheque você está se referindo? Bem, digamos que a parada e a tomada falhou o cheque, o que fazer? Há opções:

  1. Não abrir,
  2. Ajustar a parada e o takeaway.

 
KimIV:


não... a que tipo de cheque você está se referindo? Bem, digamos que a parada e a tomada não passaram o cheque, o que você faz? Há opções:

  1. Não abrir,
  2. Ajustar a parada e a tomada.

Você poderia introduzir uma troca personalizada entre os itens 1 e 2. Seguindo o padrão:
 int           modeSetOrders = 1;      // Способ установки ордеров:
                                       //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
 

Nova versão da funçãoOpenPosition() no roteiro de teste.

O que há de novo?

1. Quando o erro 130 Paradas Inválidas e o valor da variável NumberOfTry>1 é definido, a função tentará ajustar os níveis de preço StopLoss e TakeProfit aos valores de MODE_STOPLEVEL+MODE_SPREAD relativos ao Bid for OP_SELLL e Ask for OP_BUY.

Nota:

A variávelNumberOfTry global deveser maior que 1 para acionar a correção dos níveis de preços. Isto se deve aofato de que a primeira tentativa de abrir uma posição revela erro 130 e corrige os níveis de preços, enquanto que a segunda e subsequentes tentativas de abrir uma posição com níveis corrigidos.

Arquivos anexados:
 
KimIV, é bom vê-lo de volta aqui com novas características.
 

Boa tarde.

É possível complementar a biblioteca de funções úteis da KimIV com algumas funções simples como :

1.preço aberto, selecionado por alguns critérios posição (símbolo, tipo, tamanho do lote, número mágico). Este preço pode ser armazenado em variáveis globais e utilizado como um certo nível de preço, a partir do qual o algoritmo do Expert Advisor pode ser construído.

Devolve um bilhete selecionado de acordo com alguns critérios de uma posição ou ordem (símbolo, tipo, tamanho do lote, número mágico). O bilhete é um identificador importante, pode ser usado em qualquer lugar e até mesmo como uma bandeira de existência.

Quanto mais simples forem as funções, mais fácil será escolher as melhores para você, sem ter que se preocupar em cometer erros ao modificar as funções existentes.

Obrigado por suas funções.