Errori, bug, domande - pagina 479

 
Poi scrivete a servicedesk e allegate il codice.
 
sergeev:

Poi scrivi a Service Desk e allega il codice.

Sì, è meglio scrivere al Service Desk con il codice esperto allegato.

Non preoccupatevi del codice - cancelliamo tutto dopo i test. Il nostro principale e unico compito è quello di trovare gli errori.

 

Un'altra domanda. Sto usando la funzione CopyTime. Chiama:

CopyTime("EURUSD", PERIOD_MN1, D'2011.06.30', D'2011.08.01', Array)

restituisce solo un elemento con valore D'2011.08.01' per qualche motivo. Dov'è D'2011.07.01' in realtà? Qual è il trucco?

P.S. Array[] è un array dinamico.

 
marketeer:

Un'altra domanda. Sto usando la funzione CopyTime. Chiama:

restituisce solo un elemento con valore D'2011.08.01' per qualche motivo. Dov'è D'2011.07.01' in realtà? Qual è la fregatura?

P.S. Array[] è dinamico.

Sì, per qualche motivo il primo elemento è saltato, scrivi a servicedesk.

datetime Array[];
   CopyTime("EURUSD", PERIOD_MN1, D'2011.06.01', D'2011.08.01', Array); 
   for(int i=0;i<ArraySize(Array);i++)
     {
      Print(i," ",Array[i]);
     }

1 2011.08.01 00:00:00

0 2011.07.01 00:00:00

 
marketeer:

Un'altra domanda. Sto usando la funzione CopyTime.

Esiste già un'applicazione simile.

Capire cosa fare.

 

Ecco un altro mistero. Non riesco a prendere l'insetto - non so se è mio o del terminale.

C'è un codice banale che conta il numero di ordini piazzati dall'Expert Advisor. Il contatore è memorizzato in variabili globali. Sembra così:

int Count;

int OnInit()
{
  Count = (int)GlobalVariableGet("Count");
  return(0);
}

void OnTick()
{
  // bla-bla-bla
  if(успешно отправлен ордер)
  {
    Count++;
    if(!MQL5InfoInteger(MQL5_TESTING))
    {
      if(GlobalVariableSet("Count", Count) == 0)
      {
        Print("GlobalVariableSet error ", GetLastError());
      }
    }
  }
}

Questo conteggio è usato nei commenti d'ordine. Come risultato, occasionalmente noto che il numero dell'ordine successivo è inferiore (di alcune unità) al numero di posizioni che sono già sul mercato. Non ci sono errori nel registro.

Hai qualche idea? Forse qualcuno ha incontrato una simile "scomparsa" degli ultimi valori delle variabili globali, per esempio a causa del loro non salvataggio da parte del terminale quando si esce in certe condizioni (beh, forse in un caso in cui la connessione viene persa - solo una versione)?

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 
marketeer:

Ecco un altro puzzle. Non riesco a prendere l'insetto - non so se è mio o del terminale.

Provate qualcosa del genere. Non l'ho fatto veramente a livello globale. Ma conta giusto.

    int Amount_Orders = 0;

    for(count = 0; count < OrdersTotal(); count++)
       {  
        if(OrderSelect(OrderGetTicket(count))) 
          {
           int tp_ord = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);  
           if(tp_ord == ORDER_TYPE_BUY_STOP  || tp_ord == ORDER_TYPE_SELL_STOP ||
              tp_ord == ORDER_TYPE_BUY_LIMIT || tp_ord == ORDER_TYPE_SELL_LIMIT)
           Amount_Orders++;  
          }
       }
 
tol64:

Provate qualcosa del genere. Non l'ho fatto veramente a livello globale. Ma conta giusto.

Il mio problema è che il valore scritto nella variabile globale viene perso, cioè non completamente (come quando si cancella per timeout mensile), ma il vecchio valore rimane. Ricalcolare gli ordini è ovviamente possibile, ma anche il mio modo dovrebbe funzionare.
 
papaklass:

Agli sviluppatori:

Si intende che se un ordine si chiude entro la sua scadenza, questo non è in alcun modo tracciato da OnTrade?

PS: Lo scopo del gestore degli eventi commerciali OnTrade non è affatto chiaro: se uno stop loss o take non viene catturato, se un ordine pendente viene chiuso entro la sua scadenza, non viene catturato. Dobbiamo ricontrollare tutto durante l'esecuzione dell'algoritmo. Questo approccio causa confusione perché ci basiamo sul gestore dell'evento commerciale ma dobbiamo ricontrollare. Tanto più che dopo il doppio controllo catturiamo gli eventi che non sono gestiti da OnTrade(). Perché è necessario? Ma ora possiamo giocare a tetris e disegnare ogni sorta di assurdità sui grafici. Gli sviluppatori, per favore, portano la parte di trading della piattaforma alla sua logica conclusione.

Non posso dire nulla sugli ordini in sospeso, non ho ancora lavorato con loro.

Per esempio, è il gestore OnTrade che emette queste righe nel log:

2011.08.08 09:03:05 ChTestExp (EURUSD,H1) Posizione lunga di EURAUD da chiudere di stop-loss
2011.08.08:09:03:05 ChTestExp (EURUSD,H1) -----------------Deal #5263582 [sl 1.37819]
2011.08.08 09:03:05 ChTestExp (EURUSD,H1) oldDealsTotal=558 newDealsTotal=559
 
papaklass:

Mettere la funzione Print(__FUNCTION__) nella funzione OnTrade(). E quando lo avrete nel vostro registro

stop loss attivato comprare 0,10 AUDUSD 0,89783 sl: 0,89544 tp: 0,90024 [#15 vendere 0,10 AUDUSD a 0,89544]
affare #7 vendere 0.10 AUDUSD a 0.89544 fatto (basato sull'ordine #15)
operazione eseguita [#7 vendere 0,10 AUDUSD a 0,89544]
ordine eseguito vendere 0,10 a 0,89544 [#15 vendere 0,10 AUDUSD a 0,89544]

Puoi controllare se OnTrade() ha funzionato?

Per me tutto funziona anche senza il tuo inserimento, perché tutte le operazioni, i loro volumi, i profitti sono calcolati, il tutto viene sommato e visualizzato in OnDeinite per ogni simbolo separatamente. Poiché tutti i parametri sommati (numero di compravendite, profitto) coincidono esattamente con il rapporto del tester, non ho motivo di dubitare di OnTrade().

L'unica cosa che non viene processata in OnTrade(), sono le transazioni di chiusura delle posizioni alla fine del test (con il commento 'fine del test') e la chiusura per uno stop out nel tester (commento 'so ...'), nel modo test, dobbiamo ulteriormente processarle in OnDeinit. Estratto dal registro del tester:

2011.08.09 00:06:43 Core 1 file di log "E:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110809.log" scritto
2011.08.09 00:06:43 Core 1 EURUSD,H1: 888296 ticks (275 barre) generati entro 13962 ms (barre totali nella storia 6479, tempo totale 16177 ms)
2011.08.09 00:06:43 Core 1 stop out si è verificato sull'8% dell'intervallo di test
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Deinit end
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Tutti i profitti = -9072.04
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Totale scambi: 17
.....
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 ----------------------------------------
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Profitto totale EURGBP = -4738.97
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Profitto della settimana EURGBP = 319.68
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Totale profitto GBPUSD = -3775.86
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Profitto della settimana GBPUSD = -1798.83
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Profitto totale EURUSD = -557.21
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Profitto della settimana EURUSD = 65.85
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Balance=927.96 Equite=927.96 Profit=0.00 MarginLevel=0.00
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 ---------------Report-------------------
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Balance=10000.00 Equite=927.96 Profit=0.00 MarginLevel=0.00
2011.08.09 00:06:43 2011.01.18 10:11:00 Core 1 Errori di apertura: 1 Errori di chiusura: 0 Errori di modifica: 0 Richieste: 1
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Tempo di esecuzione: 0 min. 14 sec.
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 ChTestExp Expert Advisor ha finito di lavorare sul grafico EURUSD, periodo H1
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 Deinit Execution
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 OnDeinit_UninitReason = Un altro motivo
2011.08.09 00:06:43 Core 1 OnTester risultato 0
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 order buy 1.65 at 1.59804 [#69 buy 1.65 GBPUSD at 1.59804]
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 operazione eseguita [#68 comprare 1,65 GBPUSD a 1,59804]
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 affare #68 comprare 1,65 GBPUSD a 1,59804 fatto (basato sull'ordine #69)
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 posizione chiusa per fine test a 1,59804 [vendere 1,65 GBPUSD 1,57341182 tp: 1,57247]
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 ordine comprare 0,45 a 0,83931 [#68 comprare 0,45 EURGBP a 0,83931]
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 ordine eseguito [#67 comprare 0,45 EURGBP a 0,83931]
2011.08.09 00:06:43 2011.01.18 10:11:00 affare #67 comprare 0,45 EURGBP a 0,83931 fatto (basato sull'ordine #68)
2011.08.09 00:06:43 Core 1 2011.01.18 10:11:00 posizione stop attivata al 29,09% [vendere 0,45 EURGBP 0,83930333 tp: 0,80463]
2011.08.09 00:06:43 Core 1 2011.01.17 14:39:39 Posizione lunga di EURUSD da chiudere di stop-loss
2011.08.09 00:06:43 Core 1 2011.01.17 14:39:39 -----------------Deal #66 sl 1.32900

2011.08.09 00:06:43 Core 1 2011.01.17 14:39:39 oldDealsTotal=65 newDealsTotal=66

Dal rapporto del tester:

Risultati
Qualità della storia: 100%
Bar: 275 Tiki: 888296
Utile netto: -9 072.04 Profitto totale: 1 652.29 Perdita totale: -10 724.33
Redditività: 0.15 Payoff previsto: -533.65
Fattore di recupero: -0.92 Rapporto di Sharpe: -0.35

Prelievo di bilancio:
Assoluta riduzione del bilancio: 9 072.04 Prelievo massimo in bilancio: 10 392.34 (91.80%) Prelievo relativo per bilancio: 91.80% (10 392.34)
Prelievo di fondi:
Assoluto prelievo nei fondi: 9 072.04 Prelievo massimo di fondi: 9 852.02 (91.39%) Prelievo relativo di fondi: 91.39% (9 852.02)

Totale scambi: 17 Scambi brevi (% dei vincitori): 10 (70.00%) Scambi lunghi (% di vittorie): 7 (85.71%)
Totale scambi: 67 Operazioni redditizie (% di tutte le operazioni): 13 (76.47%) Scambi in perdita (% di tutti): 4 (23.53%)

Il più grande commercio redditizio: 263.25 Il più grande scambio in perdita: -5 036.39

Commercio medio redditizio: 127.10 Commercio medio perdente: -2 681.08

Numero massimo di vittorie continue (profitto): 10 (1 320.30) Numero massimo di perdite continue (perdita): 2 (-4 084.59)

Numero massimo di profitti continui (numero di vittorie): 1 320.30 (10) Massima perdita continua (numero di perdite): -5 036.39 (1)

Vincite medie continue: 4 Media delle perdite continue: 1


Come potete vedere, i valori totali calcolati indipendentemente sono gli stessi, significa che tutto è corretto. Ho preso l'esempio dello stop di proposito.