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

 

A função isCloseLastPosByStop().

Esta função retorna uma bandeira para fechar a última posição por meio de uma parada. A bandeira está hasteada - Verdade - StopLoss foi acionada. Bandeira arriada - Falsa - a posição foi fechada por outro motivo. Uma seleção mais precisa das posições a serem levadas em conta é definida usando parâmetros externos:

  • sy - Nome do instrumento de mercado. Se este parâmetro for definido, a função considerará apenas as posições do instrumento especificado. O valor padrão "" significa qualquer instrumento de mercado. 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. O valor padrão -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
P.S. Em anexo está um script para testar a funçãoCloseLastPosByStop().
Arquivos anexados:
 
Lukyanov:
KimIV:

Função OpenPosition() para on-line.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
//-- skip --
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
//-- skip -- 
Função OpenPosition() plugada na EA em real, erro 4059, mudou NULL para Symbol(), desapareceu, então a mensagem apareceu
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: Perito parado
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: não são permitidas chamadas de funções especializadas; 'stdlib' -'ErrorDescription' (descrição do erro)
De volta à linha de base, tudo funciona... (stdlib.mqh && stderror.mqh estão na pasta include da entrega MT base)
 
teraptor2 писал (а):
Eu conectei a função OpenPosition() no meu Expert Advisor sobre o real, o erro 4059

Oerro 4059 significa que a função não está disponível no modo teste. O identificador do erro é ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE. As seguintes funções geram o erro: MarketInfo, MessageBox, SendFTP, SendMail, WindowIsVisible, WindowFind, WindowHandle.

teraptor2 escreveu (a):
mudou NULL para Symbol(), desapareceu, então uma mensagem apareceu
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: Perito parado
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: não são permitidas chamadas de funções especializadas; 'stdlib' -'ErrorDescription' (descrição do erro)
 

A função isCloseLastPosByTake().

Esta função retorna uma bandeira para fechar a última posição na Take Profit. A bandeira está hasteada - Verdadeiro - TakeProfit foi acionada. Bandeira arriada - Falsa - posição foi fechada devido a outro motivo. Uma seleção mais precisa das posições a serem consideradas é feita usando parâmetros externos:

  • sy - Nome do instrumento de mercado. Se este parâmetro for definido, a função considerará apenas as posições do instrumento especificado. O valor padrão "" significa qualquer instrumento de mercado. 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. O valor padrão -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
HH. Anexado um script para testar a função isCloseLastPosByTake().
Arquivos anexados:
 

A função isLossLastPos().

Esta função retorna a bandeira de perda da última posição fechada. Flag up - True - última posição foi fechada com uma perda. Bandeiras para baixo - Falso - a última posição foi fechada ou a zero, ou com lucro. Esta função não considera permutas e comissões. A seleção das posições é definida por parâmetros externos:

  • sy - Nome do instrumento de mercado. Se você especificar este parâmetro, a função considerará apenas as posições do instrumento especificado. O valor padrão "" significa qualquer instrumento de mercado. 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. O valor padrão -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
P.S. Anexado um roteiro para testar a função isLossLastPos().
Arquivos anexados:
 

A função isTradeToDay().

Esta função retorna a bandeira comercial para hoje. A bandeira está hasteada - É verdade - havia posições em aberto hoje. Bandeira para baixo - Falso - nenhuma posição aberta hoje. A seleção das posições a serem levadas em consideração é definida por parâmetros externos:

  • sy - Nome do instrumento de mercado. Se este parâmetro for definido, a função considerará apenas as posições do instrumento especificado. O valor padrão "" significa qualquer instrumento de mercado. 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. O valor padrão -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
ZZY. anexado um script para testar a função isTradeToDay().
Arquivos anexados:
 
KimIV:

A função isCloseLastPosByStop().

Esta função retorna uma bandeira para fechar a última posição por meio de uma parada. A bandeira está hasteada - Verdade - StopLoss foi acionada. Bandeira arriada - Falsa - a posição foi fechada por outro motivo. Uma seleção mais precisa das posições a serem levadas em conta é definida usando parâmetros externos:

().

Tarde . Ao implementar o código com esta função, surgiu alguma confusão. Eu apliquei esta função desta maneira:

if (isCloseLastPosByStop(NULL,OP_BUY, MagicLong1))               {
//если одна из открытых позиций BUY вдруг закрылась по стоплосу   
  for ( int rb_ = OrdersTotal() - 1; rb_ >= 0; rb_ -- )                {       
      if (OrderSelect(rb_, SELECT_BY_POS, MODE_TRADES))                 { 
      //выбираем среди открытых и отложенных ордеров          
      if( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicLong1))  {
         //закрываем все остальные позиции BUY
        OrderClose(OrderTicket(),OrderLots(),Bid,ОтклонениеЦены,Black );
       OrderDelete(OrderTicket());// и удаляем BUY-отложки   
        //  return(0); // выходим     
        }}}}

Até este ponto tudo funciona bem! Todas as posições COMPRAR são fechadas e as posições COMPRAR são excluídas, como eu defini! Mas então o Expert Advisor redefine as ordens pendentes de acordo com seus sinais de entrada. Como esperado.

Mas essas ordens são imediatamente apagadas! Aparentemente, a bandeira ainda está pendurada ali. Mas por que está pendurado? As últimas posições não foram fechadas por uma Stop Loss, mas pela força!

Como devo lidar com esta situação? Como posso conseguir que meu Expert Advisor exiba suas próximas ordens normalmente após o comando de fechamento deste algoritmo ser executado?

 
rid писал (а):
O que devo fazer nesta situação? Para que a EA possa fazer suas próximas encomendas normalmente após o comando para fechá-las?

Esta questão precisa ser abordada no contexto de toda a tarefa, porque não é apenas uma ação única, mas uma interação, e em uma certa ordem. Portanto, descreva a tarefa na íntegra. Você não precisa de um código. Basta descrever a tarefa em palavras.

Pergunta de aquecimento. Por que você precisa apagar os pedidos e colocá-los de volta? Acho que é preferível modificar.

 

Minhas ordens e posições são agrupadas em matrizes de acordo com lucros, perdas, ordens de parada e limite, e outros motivos.

Neste caso particular, estou fechando o conjunto de posições de COMPRA que foram abertas usando ordens de parada e que acumularam um lucro especificado. E eu apago todas as outras ordens de parada que não funcionaram.

//---------------------------------------------------------------------------------------------

 

Agora eu coloquei uma função de comentário - Comentário (isCloseLastPosByStop());

Olhando para. Inicialmente, a função =0. Após o primeiro fechamento de um Stop Loss Comment (isCloseLastPosByStop()); muda para um, e então - após o fechamento forçado de outras posições, não retorna a zero, mas continua a ser um!

Razão: