Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 485

 
-Aleks-:

Per favore, aiutatemi a capire!

Ho bisogno di trovare il drawdown massimo su ogni (sia) giorno (la scrittura sul file avviene una volta al giorno) - terminale MT4.

Il max drawdown è la distanza sul grafico dal picco all'attuale drawdown dei fondi e il drawdown dei fondi è la perdita attuale.

Ho scritto il seguente codice

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Ma è corretto in alcuni grafici e anormale in altri.

A quanto pare ho fatto un errore nel codice o nella logica, ma non riesco a capire quale.

Per quanto ne so, dovremmo contare dal picco di Equity al pozzo di Equity, non dal saldo, il che fa sembrare i drawdown molto meglio!

E per favore usa il pulsante SRC, non qualche altro pulsante, in modo che il tuo codice non venga ripetuto nella risposta, ingombrando il sito!

 
Boris:

Per quanto ne so, bisogna contare dal picco di Equity al pozzo di Equity, non dal saldo, il che ammorbidisce davvero il quadro del drawdown!

E per favore usa il pulsante SRC, non qualche altro pulsante, in modo che il tuo codice non venga ripetuto nella risposta, ingombrando il sito!

Cambiato il saldo in fondi - ancora non quadra con il tester - il valore nel tester è maggiore.ACCOUNT_PROFIT è effettivamente un delta tra saldo e fondi, forse è questo il punto...D'altra parte, il compito è quello di scoprire di quanti soldi hai bisogno perché l'EA funzioni, e non ha senso prendere in considerazione la quantità massima di fondi, mi sembra...

Non so cosa sia SRC ed è per questo che non lo uso.

 
-Aleks-:

ACCOUNT_PROFIT è in realtà un delta tra saldo e fondi, forse è questo... D'altra parte, il compito è quello di scoprire quanti soldi sono necessari perché l'EA funzioni, e non ha senso prendere in considerazione la quantità massima di fondi, mi sembra...

Non so cosa sia SRC ed è per questo che non lo uso.

Quel pulsante a sinistra della videocamera (vedi sopra) è per l'inserimento del codice!

A proposito di Equity! Se avete sostituito il saldo con l'Equity, dovete escludereACCOUNT_PROFIT, perché Equity = saldo + profitto. Tuttavia, nel terminale vediamo sempre l'Equity cambiare e il tester riporta Equity e drawdown fissi alla chiusura delle posizioni, quindi i drawdown intermedi non sono fissati dal tester. Di conseguenza, la situazione del mercato è più attraente nel tester che nella realtà. Ultimamente sto stampando nel tester, in demo e reale tutte le informazioni di cui ho bisogno per ogni azione di un EA, apertura, modifica, chiusura, ecc, per evitare le stronzate, che non posso tollerare né da me né dagli altri! Ma probabilmente l'avrete già notato. ;)

 

Buona sera, potreste dirmi, per favore, sulla classe CTrailingFixedPips della libreria standard, qual è il significato del livello TakeProfit "trailing"? Non sarà mai raggiunto, vero? O non capisco qualcosa o il codice o il significato.

Dalla documentazione:

"Se la rientranza del prezzo è superiore al livello di Stop Loss, viene suggerito un nuovo prezzo di Stop Loss della posizione.Se la condizione di modifica dello Stop Loss è soddisfatta e il livello di Take Profit non è zero, sisuggerisce di impostare un nuovo prezzo di Take Profit per la posizione. "

<Expert\Trailing\CTrailingFixedPips.mqh>

//+------------------------------------------------------------------+
//| Checking trailing stop and/or profit for long position.          |
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
...
...   
   delta=m_stop_level*m_adjusted_point;
   if(price-base>delta)
     {
      sl=price-delta;
      if(m_profit_level!=0) tp=price+m_profit_level*m_adjusted_point;
     }
...
  }
 
Hexen:

Buona sera, potreste dirmi, per favore, sulla classe CTrailingFixedPips della libreria standard, qual è il significato del livello TakeProfit "trailing"? Non sarà mai raggiunto, vero? O non capisco qualcosa o il codice o il significato.

Dalla documentazione:

"Se la rientranza del prezzo è superiore al livello di Stop Loss, viene suggerito un nuovo prezzo di Stop Loss della posizione.Se la condizione di modifica dello Stop Loss è soddisfatta e il livello di Take Profit non è zero, sisuggerisce di impostare un nuovo prezzo di Take Profit per la posizione. "

<Expert\Trailing\CTrailingFixedPips.mqh>

Questo è molto probabilmente un errore di stampa. Dovrebbe essere Stop Loss.
 
Hexen:

Buona sera, potreste dirmi, per favore, sulla classe CTrailingFixedPips della libreria standard, qual è il significato del livello TakeProfit "trailing"? Non sarà mai raggiunto, vero? O non capisco qualcosa o il codice o il significato.

Dalla documentazione:

"Se la rientranza del prezzo è superiore al livello di Stop Loss, viene suggerito un nuovo prezzo di Stop Loss della posizione.Se la condizione di modifica dello Stop Loss è soddisfatta e il livello di Take Profit non è zero, sisuggerisce di impostare un nuovo prezzo di Take Profit per la posizione. "

<Expert\Trailing\CTrailingFixedPips.mqh>

A giudicare dal codice di cui sopra, TP si muove in modo sincrono con SL. Fanculo un tale trailing stop)
 
Boris:

Questo pulsante a sinistra della videocamera (vedi sopra) serve per inserire il codice!

C'è uno stile "Codice" per il codice - si seleziona dal menu - è quello che uso io.

Boris:

A proposito di Equity! Se sostituite il saldo con l'Equity, dovete escludereACCOUNT_PROFIT, perché Equity = saldo + profitto. Tuttavia, nel terminale vediamo sempre l'Equity cambiare e il tester riporta Equity e drawdown fissi alla chiusura delle posizioni, quindi i drawdown intermedi non sono fissati dal tester. Di conseguenza, la situazione del mercato è migliore nel tester che nella realtà. Ultimamente sto stampando nel tester, in demo e reale tutte le informazioni di cui ho bisogno per ogni azione di un EA, apertura, modifica, chiusura, ecc, al fine di evitare stronzate, che non posso tollerare né da me né dagli altri! Ma probabilmente l'avrete già notato. ;)

Se il drawdown fissato nel tester per il report fosse solo alla chiusura della posizione, non ci sarebbe alcun drawdown quando si usa un ordine nel mercato, il che non è il caso ;)

ACCOUNT_PROFIT = Funds-balance, quindi non vedo ragioni per non usare questo indicatore nei calcoli...

 
-Aleks-:

Per favore, aiutatemi a capire!

Ho bisogno di trovare il drawdown massimo su ogni (sia) giorno (la scrittura sul file avviene una volta al giorno) - terminale MT4.

Il max drawdown è la distanza sul grafico dal picco all'attuale drawdown dei fondi e il drawdown dei fondi è la perdita attuale.

Ho scritto tale codice

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew== AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Ma si mostra correttamente in alcuni grafici e non in altri. Allo stesso tempo, i grafici sono visivamente uguali.

Devo aver fatto un errore nel codice o nella logica, ma non riesco a capire quale.

Ho trovato un errore nel codice - un segno di uguale in più dovrebbe essere

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

Tuttavia, anche questo non mi ha portato molto più vicino a risolvere la causa della differenza tra il calcolo potico e il risultato nel tester.

Ho controllato la teoria di Boris con i calcoli azionari e anche il risultato è stato negativo.

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

A proposito, non è chiaro come il capitale e il saldo siano fuori sincrono sul grafico nel tester quando viene scambiato un solo lotto.

 
-Aleks-:

Ho trovato un errore nel codice - un segno di uguale in più dovrebbe essere così

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

Tuttavia, anche questo non mi ha portato più vicino a risolvere la ragione della differenza tra le azioni calcolate e il risultato nel tester.

Ho controllato la teoria di Boris con i calcoli azionari e anche il risultato è stato negativo.

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

A proposito, non è chiaro come il capitale e il saldo siano desincronizzati nel tester sul grafico se viene scambiato un solo lotto.

Per capire "come l'equità e l'equilibrio sono fuori sincrono", dobbiamo capire cos'è l'equilibrio e cos'è l'equità.

Saldo - l'ammontare del patrimonio netto nel conto.

Equity - la quantità attuale e variabile di denaro sul conto.

La stessa funzione è presente nel tuo tester, corregge il drawdown, ma non nel modo che vuoi tu.

Per riassumere, per calcolare il drawdown massimo, è necessario dichiarare una variabile statica o globale per memorizzare il valore, e poi riscrivere questa variabile, proprio come nel vostro codice.

Questo è quello che hai scritto ora...

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

Dovete creare due variabili max e min e scriverci dei valori.

Ed ecco un pensiero ad alta voce: Ti conviene scrivere nel file non per il giorno, ma alla chiusura dell'ordine e riscrivere le variabili. In quel momento Equity è uguale a balance e dovremmo azzerare la variabile dove sono scritti max e min.

 
Alexey Viktorov:

Per capire "come l'equità e l'equilibrio sono fuori sincrono" bisogna capire cos'è un equilibrio e cos'è l'equità.

Il saldo è la quantità fissa di fondi nel conto.

Equity - la quantità attuale e variabile di denaro sul conto.

La stessa funzione è presente nel tester che stai scrivendo ora e risolve il drawdown, ma non nel modo in cui vuoi tu.

Per riassumere, per calcolare il drawdown massimo, è necessario dichiarare una variabile statica o globale per memorizzare il valore, e poi riscrivere questa variabile, proprio come nel vostro codice.

Questo è quello che hai scritto ora...

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

Dovete creare due variabili max e min e scriverci dei valori.

Ed ecco un pensiero ad alta voce: Ti conviene scrivere nel file non per il giorno, ma alla chiusura dell'ordine e riscrivere le variabili. In quel momento Equity è uguale a balance e dovremmo azzerare la variabile dove sono scritti max e min.

Grazie per aver risposto alla richiesta di aiuto!

La variabile globale è rilevante per l'attività reale del mercato - ho bisogno di informazioni di test, ecco perché non mi sono preoccupato.

Cos'è il capitale e il saldo - naturalmente lo so, ma non sono riuscito a calcolare il drawdown. I miei esempi di codice mostrano che ho cercato di prendere sia il saldo e i fondi come massimo che il saldo e i fondi come minimo.

Perché pensate che la disuguaglianzase (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax; non è mai soddisfatta? Solo non è soddisfatta sulla barra quando il nuovo equilibrio massimo è raggiunto (o l'equità - ancora non è vero), ma a quel punto fisso il drawdown del profittoProfitMin=ProfittoNuovo.

La registrazione del file per il giorno è più rilevante in quanto il drawdown massimo di solito non viene raggiunto al momento della chiusura di un ordine e l'obiettivo è quello di calcolare la quantità media di denaro necessaria per il lavoro dell'Expert Advisor.