Zero Divide (Trovato il problema - ma perché?) - pagina 3

 
double loss_for_1_lot = pips_to_bsl/ ts * tv ;

NON è tv che risulta in un div 0. Può essere solo ts. Su un broker a 5 cifre ts potrebbe stampare zero (4 cifre)

Mi sembra che tu non abbia mai aperto quella coppia per ottenere le informazioni di mercato dal tuo broker prima di scaricare la cronologia da qualche altra parte.

 

Trovo difficile credere che lo zero divide sia generato dal codice postato.

DomGilberto compila questo script e allegalo al grafico che credi stia restituendo uno zero ticksize.

int start()
  {
//----
   int i = Bars-1;
   int cnt;
   int tscnt = 0;
   int tvcnt = 0;
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   while(i >=0)
   {if(ts < 0.00001) tscnt++;
    if(tv < 0.00001) tvcnt++;
    i--;
   }
   Alert("TickSize returned an erroneous value ",tscnt," times.");
   Alert("TickValue returned an erroneous value ",tvcnt," times.");
//----
   return(0);
  }
 
DomGilberto:

Spero che questo video che ho fatto (40 secondi circa) illustri ciò di cui sto parlando (dato che non sono sicuro di essere chiaro o meno).

Video: http://screencast.com/t/uMHY5DpM

Vedrete che nella prima parte, quando faccio cadere lo script sul grafico live (conto reale), il valore di tick e la dimensione di tick restituiscono "0" su quel "conto nozionale", che illustro nella finestra dei lotti (unità).

La seconda parte è con lo stesso broker ma su un feed basato sui lotti e questa volta restituisce un valore di tick e una dimensione di tick. Di nuovo, illustro che si fa trading usando lotti....

Quindi, per quanto riguarda il tester della strategia, non ho idea del perché abbia funzionato e a volte no. Il conto è stato collegato mentre eseguo i back-test (su un conto demo fittizio alimentato (unità)).

La mia prossima domanda sarebbe, se questa è la risposta tipica che otterrò dal conto alimentato nozionale, siete in grado di suggerirmi come correggere il mio calcolo di dimensionamento della posizione in questa circostanza? Funziona perfettamente per un'alimentazione basata sul lotto... Spero che questo spieghi un po' meglio?

Se stai usando un codice diverso nel tuo codice di "test" allora cosa dimostra?

Sei consapevole che TICKVALUE restituisce il valore corrente da adesso... anche durante l'esecuzione di un test di strategia? Quindi per qualsiasi coppia in cui la valuta di base non è la valuta di deposito sarà errato e i tuoi calcoli del lotto saranno sbagliati...

 

Nel tuo video, usi GBPUSD nel primo caso e poi GBPJPY nel secondo.

Penso che se tu avessi collegato il tuo script a un grafico con lotto normale GBPUSD, avresti ottenuto un valore per tickvalue, ma anche ticksize sarebbe stato zero.

Questo perché i tuoi avvisi di script stanno usando dei doppi e quindi 0.00001 verrà stampato come 0.

Usa inveceDoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8)

 

Ok, prima di tutto, grazie per l'aiuto di tutti.

Ecco il video di "Gumrai" e "SDC" che conferma ciò che entrambi mi chiedete di fare. Ho etichettato gli script con i vostri alias MQL4, che ovviamente corrispondono al vostro codice che avete postato qui. Video: http://screencast.com/t/kglCd2hCae

Il broker e il feed corrispondente non sono stati modificati durante la pausa. Si tratta anche di un conto di alimentazione fittizia (unità).

@RaptorUK: Sì, sapevo che TICKVALUE restituisce il valore corrente da ora. Immagino che la tua seconda parte guardando ora sia piuttosto logica. Mi sto confondendo su come posso utilizzare tickvalue come parte del mio conto di alimentazione fittizia per assicurarmi che il dimensionamento della posizione sia corretto...?

 
DomGilberto:

Ok, prima di tutto, grazie per l'aiuto di tutti.

Ecco il video di "Gumrai" e "SDC" che conferma ciò che entrambi mi chiedete di fare. Ho etichettato gli script con i vostri alias MQL4, che ovviamente corrispondono al vostro codice che avete postato qui. Video: http://screencast.com/t/kglCd2hCae

Il broker e il feed corrispondente non sono stati modificati durante la pausa. Si tratta anche di un conto di alimentazione fittizia (unità).

@RaptorUK: Sì, sapevo che TICKVALUE restituisce il valore corrente da ora. Immagino che la tua seconda parte guardando ora sia abbastanza logica. Mi sto confondendo con il modo in cui sono in grado di utilizzare tickvalue come parte del mio conto di alimentazione nozionale per assicurarmi che il dimensionamento della posizione sia corretto...?


Quei video sono una rottura, sono troppo grandi per il mio schermo.

Perché non postare semplicemente il codice dello script e il risultato dell'avviso.

Non so cosa hai messo nello script che doveva essere il mio codice suggerito, ma non c'è modo che possa risultare in "08"

Usa

Alert("TICKVALUE= ",DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8));
Alert("TICKSIZE= ",DoubleToStr(MarketInfo(Symbol(),MODE_TICKSIZE),8));
 
DomGilberto:


@RaptorUK: Sì, sapevo che TICKVALUE restituisce il valore attuale da ora. Immagino che la tua seconda parte guardando ora sia abbastanza logica. Mi sto confondendo su come posso utilizzare tickvalue come parte del mio conto di alimentazione nozionale per assicurarmi che il dimensionamento della posizione sia corretto...?

Prima devi confermare che TICKVALUE sta effettivamente restituendo un risultato nullo, cosa che non hai ancora fatto.
 
GumRai:


Quei video sono un dolore, sono troppo grandi per il mio schermo.

Perché non postare semplicemente il codice dello script e il risultato dell'allarme.

Non so cosa hai messo nello script che doveva essere il mio codice suggerito, ma non c'è modo che possa risultare in "08"

Usa


Scusa - mi rendo conto ora che ho dimenticato di mettere "DoubleToStr", colpa mia!

TickSize = 0.00100000

TickValue = 0.00001026

(Sceso sul feed nozionale GBPJPY)

@SDC ho semplicemente copiato il tuo codice da qui e l'ho inserito in un nuovo script. Questo è ciò che veniva restituito.

 
Ok nuovo aggiornamento, ci ho giocato ripetendo il punto preciso in cui si verifica la divisione dello zero.

In quest'area del mio codice ho fatto stampare la formula per scomporre la matematica - dove questo accade è su un ordine di acquisto in sospeso... ma questa parte del codice "pips_to_ssl" è pips per vendere lo stop loss... Che NON viene usato per un ordine di acquisto in sospeso ....

double loss_for_1_lot1 = pips_to_ssl/  ts * tv  ;
   if( loss_for_1_lot1 == 0.0 )Print(" ERROR - loss_for_1_lot1 = 0.0 || The formula for this is: ", pips_to_ssl,"/",ts,"*",tv);


2013.10.02 11:57:19     2001.02.12 16:00  Trend Fishing - V1 - Notional Lots USDJPYnb,H1:  ERROR - loss_for_1_lot1 = 0.0 || The formula for this is: 0/0.001*0.0001

double pips_to_ssl=SellStopPrice-sellPrice;
   if(pips_to_ssl == 0)Print(" ERROR - pips_to_ssl = 0 || The formula for this is: ", SellStopPrice,"-",sellPrice); 

2013.10.02 12:08:01	2001.02.12 16:00  Trend Fishing - V1 - Notional Lots USDJPYnb,H1:  ERROR - pips_to_ssl = 0 || The formula for this is: 117.249-117.249

 
DomGilberto:
Ok nuovo aggiornamento, ci ho giocato ripetendo il punto preciso in cui avviene la divisione dello zero.

In quest'area del mio codice ho fatto stampare la formula per scomporre la matematica - dove questo accade è su un ordine di acquisto in sospeso... ma questa parte del codice "pips_to_ssl" è pips per vendere stop loss... Che NON viene usato per un ordine di acquisto in sospeso ....



Ti rimando al mio post precedente

"Si noti che

double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?

risulterà anche zero se pips_to_bsl è zero. È possibile?"

bsl o ssl, stessa codifica.