Caratteristiche utili da KimIV - pagina 18

 
rid писал (а):
MA. Terrò il post per 24 ore - poi lo cancellerò!

Non c'è bisogno di cancellarlo! Lascia che rimanga...

 

Igor, prima di tutto grazie per le tue funzioni e per questo ramo, aiutano molti programmatori non professionisti. Ma vorrei farvi una domanda sulla funzione NumberOfOrders(). Non riesco a farlo funzionare. L'ho inserito in un MACD Expert Advisor standard per dare un esempio di come lo uso. Sto incollando il codice:

Per descriverlo brevemente, è cambiato lì:

// в стандартной версии  
total=OrdersTotal();
   if(total<1) 
     {
// бла бла бла ...
// в моей версии эксперта
   total=OrdersTotal(); // total я оставил т.к. он используется дальше
   if(NumberOfOrders(NULL,-1,-1)<1) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders() ниже
Naturalmente, non funziona. Potresti spiegare cosa c'è che non va? Grazie in anticipo.
 
seifer писал (а):
Potresti spiegare cosa c'è che non va? Grazie in anticipo.

Due commenti:

1. Io farei così:

total=NumberOfOrders(NULL);
if (total<1) {
  ...
}
2. La funzione NumberOfOrders() restituisce il numero di ordini - scambi di tipo BuyLimit, BuyStop, SellLimit e SellStop. L'Expert Advisor che hai modificato non funziona con gli ordini. Apre le posizioni ai prezzi di mercato, cioè esegue operazioni di acquisto e vendita. Dovete usare la funzione NumberOfPositions(), che posterò nel prossimo post.
 

La funzione NumberOfPositions().

Questa funzione restituisce il numero di posizioni attualmente aperte. Una selezione più accurata delle posizioni contate è specificata da parametri esterni:

  • sy - Nome dello strumento di mercato. Se questo parametro è impostato, la funzione considererà solo le posizioni dello strumento specificato. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
In allegato c'è uno script per testare la funzione NumberOfPositions().
 

Wow! Pensavo fosse un design:

      ...
      ot=OrderType();
      if (ot>1 && ot<6) {
      ...
passerebbe attraverso tutte le posizioni (comprese OP_SELL e OP_BUY). Ora tutto funziona. Grazie ancora!
 

Funzione GetProfitFromDateInCurrency().

Questa funzione restituisce il profitto totale nella valuta delle posizioni chiuse da una certa data. Una selezione più accurata delle posizioni da prendere in considerazione è specificata utilizzando parametri esterni:

  • sy - Nome dello strumento di mercato. Se si specifica questo parametro, la funzione considererà solo le posizioni di questo strumento. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
  • dt - Data e ora in secondi dal 1970. Valore predefinito - 0 significa che tutte le posizioni disponibili nella storia sono prese in considerazione.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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. In allegato c'è uno script per testare la funzione GetProfitFromDateInCurrency().

L'indicatore i-Profit, che mostra valori di profitto assoluti e percentuali per diversi periodi di tempo, è un esempio più pratico di come imparare a usare questa funzione.

 

Ciao Igor.

Vorrei ringraziarvi per la fic di correlazione. Avevo alcune opzioni, volevo solo chiarirle)

Anch'io ho una domanda simile. Incontro molto spesso l'errore 130 - stop sbagliato durante il test di Expert Advisor in modalità tempo reale. Non lo analizzo, non capisco perché si verifica in una situazione o in un'altra. Ho iniziato a usare questa costruzione

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

Ho iniziato a usare questo costrutto per normalizzare stop e TP, ma non ha risolto la situazione. Forse hai affrontato situazioni simili, dimmi come affrontarle e qual è il modo migliore per analizzarle.

Per chiarire: questo succede molto spesso quando cerco di impostare uno stop a +1 p dal prezzo di apertura

 
scorpionk писал (а):
incontrare l'errore 131 - arresto errato.

131 - Volume errato, errore nella granulazione del volume. Questa è la dimensione del lotto che viene scambiato.

 
KimIV:
scorpionk ha scritto (a):
incontro l'errore 131 - Wrong stop.

131 - Volume errato, un errore nella granulazione del volume. Questa è la dimensione del lotto che viene scambiato.

Codice sbagliato, non 131 ma 130

 
scorpionk:

Codice sbagliato, non è 131, è 130.

Capisco...

Provate a normalizzare come segue:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Lo faccio e non incontro l'errore 130.