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

 
rid писал (а):
MA. Vou manter o correio por 24 horas - depois vou apagá-lo!

Você não precisa apagá-lo! Deixe ficar...

 

Igor, antes de tudo obrigado por suas funções e por este ramo, eles ajudam muitos programadores não-profissionais. Mas eu gostaria de lhe fazer uma pergunta sobre a função NumberOfOrders(). Não consigo colocá-lo para trabalhar. Coloquei-o em um Expert Advisor MACD padrão para dar um exemplo de como eu o utilizo. Estou colando o código:

Para descrevê-lo brevemente, ele foi alterado ali:

// в стандартной версии  
total=OrdersTotal();
   if(total<1) 
     {
// бла бла бла ...
// в моей версии эксперта
   total=OrdersTotal(); // total я оставил т.к. он используется дальше
   if(NumberOfOrders(NULL,-1,-1)<1) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders() ниже
Naturalmente, não funciona. Você poderia, por favor, explicar o que está errado? Obrigado de antemão.
Arquivos anexados:
 
seifer писал (а):
Você poderia explicar o que está errado? Obrigado de antemão.

Dois comentários:

1. Eu o faria desta maneira:

total=NumberOfOrders(NULL);
if (total<1) {
  ...
}
2. Função NumberOfOrders() retorna o número de ordens - negócios dos tipos BuyLimit, BuyStop, SellLimit e SellStop. O Expert Advisor que você modificou não trabalha com pedidos. Ela abre posições a preços de mercado, ou seja, realiza operações de Compra e Venda. Você precisa usar a função NumberOfPositions(), que eu colocarei no próximo post.
 

A função NumberOfPositions().

Esta função retorna o número de posições atualmente em aberto. Uma seleção mais precisa das posições contadas é especificada 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   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  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()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
Em anexo está um roteiro para testar a função NumberOfPositions().
Arquivos anexados:
 

Uau! Pensei que fosse um projeto:

      ...
      ot=OrderType();
      if (ot>1 && ot<6) {
      ...
passaria por todas as posições (incluindo OP_SELL e OP_BUY). Tudo está funcionando agora. Mais uma vez, obrigado!
 

Função GetProfitFromDateInCurrency().

Esta função retorna o lucro total na moeda das posições fechadas desde uma determinada data. Uma seleção mais precisa das posições a serem levadas em conta é especificada usando parâmetros externos:

  • sy - Nome do instrumento de mercado. Se você especificar este parâmetro, a função considerará apenas as posições deste instrumento. 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.
  • dt - Data e hora em segundos desde 1970. Valor padrão - 0 significa que todas as posições disponíveis na história são levadas em conta.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

HH. Em anexo está um script para testar a função GetProfitFromDateInCurrency().

O indicador i-Profit, que mostra valores absolutos e percentuais de lucro para diferentes períodos de tempo, é um exemplo mais prático de como aprender a usar esta função.

Arquivos anexados:
 

Olá Igor.

Gostaria de dizer obrigado pela ficção de correlação. Eu tinha algumas opções, eu só queria esclarecê-las)

Eu também tenho essa pergunta. Muitas vezes encontro erro 130 - parada errada durante o teste do Expert Advisor no modo de tempo real. Não o analiso, não entendo porque ocorre em uma ou outra situação. Eu comecei a usar esta construção

   double md = MarketInfo(Symbol(), MODE_TICKSIZE);
   return(NormalizeDouble(Value/md, 0) * md);

Comecei a usar esta construção para normalizar o stop e TP, mas não resolveu a situação. Talvez você tenha enfrentado situações semelhantes, diga-me como lidar com isso e qual é a melhor maneira de analisá-lo.

Para esclarecer: Isto acontece com muita freqüência quando tento estabelecer uma parada em +1 p a partir do preço aberto

 
scorpionk писал (а):
encontrar o erro 131 - Parada incorreta.

131 - Volume incorreto, erro na granulação do volume. Este é o tamanho do lote sendo comercializado.

 
KimIV:
scorpionk escreveu (a):
Encontro o erro 131 - Parada errada.

131 - Volume incorreto, um erro na granulação do volume. Este é o tamanho do lote sendo negociado.

Código errado, não 131 mas 130

 
scorpionk:

Código errado, não é 131, é 130.

Estou vendo...

Tente normalizar como se segue:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Eu o faço e não encontro erro 130.