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

 

Obrigado pela resposta, Igor, eu já descobri. Também uso suas funções separadamente, mas queria aproveitar a biblioteca na fase de desenvolvimento da EA.

Eu vi como é feita a biblioteca do komposter trade_lib&info_lib e fiz algumas mudanças na sua para meu próprio uso.

1. Eu removi em todas as bibliotecas #bibliotecas de propriedade e #incluir ligações cruzadas de bibliotecas, renomeando bibliotecas para não confundir.

2. Fiz um bloco de chamadas diretas de todas as bibliotecas.

#include <b-Positions#.mqh>        // Библиотека функций для работы с позициями 
#include <b-KimIV#.mqh>            // Библиотека дополнительных функций
#include <b-Orders#.mqh>           // Библиотека функций для работы с ордерами
#include <stdlib.mqh>              // Стандартная библиотека
#include <WinUser32.mqh>           // Стандартная библиотека  

Agora todas as funções de todas as bibliotecas estão disponíveis, não há erros e mensagens criminais durante a compilação, exceto "não é referenciado..." normal.

Todos os EAs externos estão disponíveis, sem problemas.

Escreva mais, vamos nos conectar e usar. Antes de tudo, eu gostaria de ver a função de rastreamento pelo lucro total.

 

A função WeekOfMonth().

Esta função retorna na semana do mês por data. Aceita apenas um parâmetro opcional:

  • dt - Data, hora. Valor padrão - 0 - data e hora atual do servidor comercial.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth(datetime dt=0) {
  if ( dt<=0) dt=TimeCurrent();
  datetime d;
  int      i, kd=TimeDay( dt), nn=1;

  for ( i=2; i<= kd; i++) {
    d=StrToTime(TimeYear( dt)+"."+TimeMonth( dt)+"."+ i);
    if (TimeDayOfWeek( d)==1) nn++;
  }
  return( nn);
}

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

Arquivos anexados:
 
Igor, não existe uma função que feche todas as posições a partir daquelas com um lote maior?
 

Olá, Igor! Muito obrigado por suas características úteis! Estou usando-as o máximo que posso! Eu mesmo só recentemente entrei nisto, então uma pergunta para você... Já os uso há muito tempo, portanto, já os uso há muito tempo. Estou usando sua função OpenPosition, talvez esteja reagindo a um erro ou algo assim... Aqui está o diário de bordo de ontem, tudo estava bem antes disso! não pode encontrar erro 220........ em nenhum lugar

07:47:28 MetaTrader 4.00 build 220 iniciado (MetaQuotes Software Corp.)
07:47:28 Expert open prob USDJPY EURUSD,M1: carregado com sucesso
07:47:32 '1262868': login
07:47:44 '1262868': login
07:49:40 '1262868': login
07:49:46 '1262868': login
07:54:44 '1262868': falha na conexão [Sem conexão]
11:38:16 Expert open prob USDJPY EURUSD,M1: removido
11:38:18 MetaTrader 4.00 build 220 parou
14:05:05 MetaTrader 4.00 build 220 começou (MetaQuotes Software Corp.)
14:05:05 'Expert open prob USDJPY EURUSD,M1: carregado com sucesso
14:05:10 '1262868': login
14:05:31 '1262868': login
14:06:39 '1262868': login
14:06:46 '1262868': login
15:57:06 '1262868': falha na conexão [Sem conexão]
18:30:46 Expert open prob USDJPY EURUSD,M5: removido
18:30:49 Bombeamento principal: timeout na parada
18:30:52 Bombeamento principal: timeout na parada
18:30:55 Bombeamento principal: timeout na parada
18:30:58 Bombeamento principal: timeout na parada
18:31:01 Bombeamento principal: timeout na parada
18:31:01 Bombeamento principal: terminado
18:31:02 MetaTrader 4.00 build 220 parou
18:31:02 MetaTrader 4.00 build 220 parou porque o sistema foi desligado
18:47:57 MetaTrader 4.00 build 220 começou (MetaQuotes Software Corp.)
18:47:58 Sonda aberta por especialista USDJPY EURUSD,M5: carregada com sucesso
18:48:01 '1262868': falha na conexão [Sem conexão]
18:48:10 '1262868': login
18:48:20 '1262868': login
20:19:00 '1262868': login
20:19:07 '1262868': login
20:20:05 '1262868': login
20:20:13 '1262868': login
20:59:29 '1262868': login
20:59:39 '1262868': login
21:02:16 '1262868': login
21:02:41 '1262868': Falha na conexão do DataCenter [6]
22:08:40 '1262868': Falha no ping
22:08:43 '1262868': login
22:08:49 '1262868': Falha na conexão do DataCenter [6]
22:1001 '1262868': login
22:10:05 '1262868': Falha na conexão do DataCenter [6]
22:14:59 '1262868': login
22:15:13 '1262868': login
22:15:22 '1262868': Falha na conexão do DataCenter [6]
22:37:16 '1262868': login
22:37:27 '1262868': Falha na conexão do DataCenter [6]
22:4051 '1262868': login
22:41:04 '1262868': Falha na conexão do DataCenter [6]
23:17:14 Sonda aberta por especialista USDJPY EURUSD,M5: removido
23:17:16 Sonda aberta por especialista USDJPY EURUSD,M5: carregada com sucesso
23:25:52 Sonda aberta por especialista USDJPY EURUSD,M5: removido
23:25:55 MetaTrader 4.00 build 220 parou
23:25:59 MetaTrader 4.00 build 220 começou (MetaQuotes Software Corp.)
23:26:05 '1262868': login
23:26:05 Expert open prob USDJPY EURUSD,M5: carregado com sucesso
23:26:15 '1262868': login
23:27:19 '1262868': login
23:27:34 '1262868': login
23:28:20 Expert open prob USDJPY EURUSD,M5: removido
23:28:25 Expert open prob USDJPY USDCHF,H4: carregado com sucesso
23:28:33 Expert open prob USDJPY USDCHF,H4: removido

Muito obrigado de antemão!

 
khorosh писал(а) >>
Igor, não há função que feche todas as posições a partir daquelas que têm um lote maior?

não foi... escrito...

A função ClosePosBySortLots().

Esta função fecha posições em ordem de classificação por tamanho de lote. Ou seja, usando esta função, você pode fechar posições em ordem ascendente ou descendente de lotes de tamanhos. Função ClosePosBySortLots() aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento comercial. "" - qualquer instrumento, NULL - instrumento atual. O valor padrão é "".
  • op - Tipo de operação comercial. Valores válidos -1 - qualquer posição, OP_BUY - comprar, OP_SELL - vender. O valor padrão é -1.
  • mn - MagicNumber, identificador único de operação comercial. Valor por default -1 - qualquer número mágico.
  • sd - Direção da classificação do tamanho do lote. Valores válidos MODE_ASCEND - ascendente, MODE_DESCEND - descendente. O valor padrão é MODE_DESCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots(string sy="", int op=-1, int mn=-1, int sd= MODE_DESCEND) {
  double a[][2];                  // Массив лотов и тикетов
  int    i, k=OrdersTotal();      // Счётчик и количество ордеров
  int    p=0;                     // Количество позиций

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; 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) {
            p++;
            ArrayResize( a, p);
            a[ p-1][0]=OrderLots();
            a[ p-1][1]=OrderTicket();
          }
        }
      }
    }
  }

  // вдруг позиций нету, тогда и закрывать нечего
  if ( p>0) {
    ArraySort( a, WHOLE_ARRAY, 0, sd);
    for ( i=0; i< p; i++) {
      if (OrderSelect( a[ i][1], SELECT_BY_TICKET)) {
        // проверим незакрытость на всякий случай,
        // может какая-то позиция уже закрылась по стопу/тейку
        if (OrderCloseTime()==0) ClosePosBySelect();
      }
    }
  }
}

SZY. anexado um script para testar a função ClosePosBySortLots().

Arquivos anexados:
 

A função AddLeadingZero().

Esta função adiciona o mesmo número de zeros à corda (à esquerda), de modo que o comprimento da corda se torna igual a algum valor dado. A função AddLeadingZero() toma os seguintes parâmetros obrigatórios:

  • s - O fio ao qual os zeros principais devem ser adicionados.
  • k - O comprimento da corda S resultante.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero(string s, int k) {
  while(StringLen( s)< k) s=StringConcatenate("0", s);
  return( s);
}

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

Arquivos anexados:
 

A função toTime().

Esta função converte dois/três inteiros em uma cadeia no formato de tempo. Se dois números forem passados para a função, o primeiro será usado como horas e o segundo como minutos. A cadeia de formato retornada será "HH:MM". Se houver três números, o terceiro será substituído pelos segundos e a função retornará a string "HH:MM:SS". A função toTime() aceita os seguintes parâmetros opcionais:

  • h - Relógio. O valor padrão é 0.
  • m - Minutos. O valor padrão é 0.
  • s - Segundos. 0 - Não usar. Valor padrão 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime(int h=0, int m=0, int s=0) {
  string st="";

  if ( h==0) st="00:";
  else      st=StringConcatenate( AddLeadingZero( h, 2), ":");

  if ( m==0) st=StringConcatenate( st, "00");
  else      st=StringConcatenate( st, AddLeadingZero( m, 2));

  if ( s!=0) st=StringConcatenate( st, ":", AddLeadingZero( s, 2));

  return( st);
}

ZS. Em anexo está um roteiro para testar a funçãoTime().

Arquivos anexados:
 

Igor, você poderia sugerir uma função que daria um sinal correspondente quando o preço corresponde a uma das variáveis, digamos b=1,2400, s=1,2300;

Se b=preço sig=1, se s=preço sig=-1.

Peço desculpas pelo desleixo).

 
Prival >> :
Desculpe, eu não sou Igor. Mas talvez isto ajude.

Eu também peço desculpas. >> é mais preciso.

//+------------------------------------------------------------------+
//| Функция                                                          |
//+------------------------------------------------------------------+
int Sign(double b, double s)
   {
   double var, e; var=Close[0]; e=0.000001;
   if( var< b+ e && var> b- e) return( 1);
   if( var< s+ e && var> s- e) return(-1); 
   return(0);
   }
 
Prival >> :

...apagarei meus cargos até hoje à noite para não desarrumar o fio...

Não é necessário. Será útil dar uma olhada, despertará em você a idéia de que o valor exato do preço não é constantemente capturado.