Caratteristiche utili da KimIV - pagina 62

 

Grazie per la risposta, Igor, ho capito. Uso le vostre funzioni anche separatamente, ma ho voluto approfittare della libreria nella fase di sviluppo di EA.

Ho guardato come è fatta la libreria trade_lib&info_lib di komposter e ho fatto alcune modifiche nella tua per il mio uso personale.

1. Ho rimosso in tutte le librerie #property library e #include library cross-links, rinominato le librerie per non essere confuso.

2. Ho fatto un blocco di chiamate dirette di tutte le librerie.

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

Ora tutte le funzioni di tutte le librerie sono disponibili, non ci sono errori e messaggi criminali durante la compilazione, tranne il normale "non è referenziato...".

Tutti gli EA esterni sono disponibili, senza problemi.

Scrivete di più, ci collegheremo e useremo. Prima di tutto vorrei vedere la funzione di trailing per il profitto totale.

 

La funzione WeekOfMonth().

Questa funzione restituisce la settimana del mese per data. Accetta solo un parametro opzionale:

  • dt - Data, ora. Valore predefinito - 0 - data e ora attuali del server commerciale.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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. In allegato c'è uno script per testare la funzione WeekOfMonth().

File:
 
Igor, non c'è una funzione che chiuderebbe tutte le posizioni a partire da quelle con un lotto più grande?
 

Ciao, Igor! Grazie mille per le tue utili funzioni! Le sto usando il più possibile! Io stesso ho iniziato da poco, quindi una domanda per te... Li uso da molto tempo ormai, quindi li uso da molto tempo. Sto usando la tua funzione OpenPosition, forse sta reagendo a un errore o qualcosa del genere? Ecco il log di ieri, prima andava tutto bene! non riesco a trovare l'errore 220........ da nessuna parte

07:47:28 MetaTrader 4.00 build 220 avviato (MetaQuotes Software Corp.)
07:47:28 Expert open prob USDJPY EURUSD,M1: caricato con successo
07:47:32 '1262868': login
07:47:44 '1262868': login
07:49:40 '1262868': login
07:49:46 '1262868': login
07:54:44 '1262868': connect failed [No connection]
11:38:16 Expert open prob USDJPY EURUSD,M1: removed
11:38:18 MetaTrader 4.00 build 220 stopped
14:05:05 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
14:05:05 Expert open prob USDJPY EURUSD,M1: caricato con successo
14:05:10 '1262868': login
14:05:31 '1262868': login
14:06:39 '1262868': login
14:06:46 '1262868': login
15:57:06 '1262868': connessione fallita [Nessuna connessione]
18:30:46 Expert open prob USDJPY EURUSD,M5: rimosso
18:30:49 Pompaggio principale: timeout su stop
18:30:52 Pompaggio principale: timeout su stop
18:30:55 Pompaggio principale: timeout su stop
18:30:58 Pompaggio principale: timeout su stop
18:31:01 Pompaggio principale: timeout su stop
18:31:01 Pompaggio principale: terminato
18:31:02 MetaTrader 4.00 build 220 stopped
18:31:02 MetaTrader 4.00 build 220 stopped perché il sistema si è spento
18:47:57 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
18:47:58 Expert open prob USDJPY EURUSD,M5: loaded successfully
18:48:01 '1262868': connect failed [No connection]
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:20:13 '1262868': login
20:59:29 '1262868': login
20:59:39 '1262868': login
21:02:16 '1262868': login
21:02:41 '1262868': DataCenter connecting failed [6]
22:08:40 '1262868': ping failed
22:08:43 '1262868': login
22:08:49 '1262868': DataCenter connecting failed [6]
22:1001 '1262868': login
22:10:05 '1262868': DataCenter connecting failed [6]
22:14:59 '1262868': login
22:15:13 '1262868': login
22:15:22 '1262868': DataCenter connecting failed [6]
22:37:16 '1262868': login
22:37:27 '1262868': DataCenter connecting failed [6]
22:4051 '1262868': login
22:41:04 '1262868': DataCenter connessione fallita [6]
23:17:14 Expert aperto prob USDJPY EURUSD,M5: rimosso
23:17:16 Expert aperto prob USDJPY EURUSD,M5: caricato con successo
23:25:52 Expert aperto prob USDJPY EURUSD,M5: rimosso
23:25:55 MetaTrader 4.00 build 220 stopped
23:25:59 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.)
23:26:05 '1262868': login
23:26:05 Expert open prob USDJPY EURUSD,M5: caricato con successo
23:26:15 '1262868': login
23:27:19 '1262868': login
23:27:34 '1262868': login
23:28:20 Expert open prob USDJPY EURUSD,M5: rimosso
23:28:25 Expert open prob USDJPY USDCHF,H4: caricato con successo
23:28:33 Expert open prob USDJPY USDCHF,H4: rimosso

Grazie mille in anticipo!

 
khorosh писал(а) >>
Igor, non esiste una funzione che chiuda tutte le posizioni a partire da quelle che hanno un lotto più grande?

non era... ha scritto...

La funzione ClosePosBySortLots().

Questa funzione chiude le posizioni in ordine di ordinamento per dimensione del lotto. Cioè, usando questa funzione, potete chiudere le posizioni in ordine crescente o decrescente di dimensioni dei lotti. La funzione ClosePosBySortLots() accetta i seguenti parametri opzionali:

  • sy - Nome dello strumento di trading. "" - qualsiasi strumento, NULL - strumento corrente. Il valore predefinito è "".
  • op - Tipo di operazione commerciale. Valori validi -1 - qualsiasi posizione, OP_BUY - comprare, OP_SELL - vendere. Il valore predefinito è -1.
  • mn - MagicNumber, identificatore unico dell'operazione commerciale. Valore predefinito -1 - qualsiasi numero magico.
  • sd - Direzione di ordinamento delle dimensioni del lotto. Valori validi MODE_ASCEND - ascendente, MODE_DESCEND - discendente. Il valore predefinito è 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();
      }
    }
  }
}

In allegato c'è uno script per testare la funzione ClosePosBySortLots().

 

La funzione AddLeadingZero().

Questa funzione aggiunge tanti zeri iniziali (a sinistra) "0" alla stringa in modo che la lunghezza della stringa diventi uguale a un dato valore. La funzione AddLeadingZero() prende i seguenti parametri obbligatori:

  • s - La stringa a cui devono essere aggiunti gli zeri iniziali.
  • k - La lunghezza della stringa risultante S.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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. in allegato c'è uno script per testare la funzione AddLeadingZero().

 

La funzione toTime().

Questa funzione converte due/tre interi in una stringa nel formato tempo. Se due numeri vengono passati nella funzione, il primo sarà usato come ore e il secondo come minuti. La stringa di formato restituita sarà "HH:MM". Se ci sono tre numeri, il terzo sarà sostituito dai secondi e la funzione restituirà la stringa "HH:MM:SS". La funzione toTime() accetta i seguenti parametri opzionali:

  • h - Orologio. Il valore predefinito è 0.
  • m - Verbale. Il valore predefinito è 0.
  • s - Secondi. 0 - Non usare. Valore predefinito 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. In allegato c'è uno script per testare la funzione toTime().

File:
 

Igor, potresti suggerire una funzione che dia un segnale corrispondente quando il prezzo corrisponde a una delle variabili, diciamo b=1,2400, s=1,2300;

Se b=prezzo sig=1, se s=prezzo sig=-1.

Mi scuso per la sciatteria).

 
Prival >> :
Mi dispiace, non sono Igor. Ma forse questo aiuterà.

Mi scuso anch'io. >> è più 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 >> :

...cancellerò i miei post entro stasera per non ingombrare il thread...

Non ce n'è bisogno. Sarà utile dare un'occhiata, vi sveglierà all'idea che il valore esatto del prezzo non è sempre preso.