[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 419

 

Forexman77:
Come posso fare in modo che il programma emetta il livello EMA come prezzo? Supponiamo che EMA1 con periodo (1), EMA2 con periodo (0), EMA1 sia uguale a 1,3321, mentre EMA2 per il periodo corrente è 1,3200. Il risultato dell'espressione (da EMA1 a EMA2) deve essere 0,0121. Quando si esegue lo script, l'avviso mostra zero, mentre abbiamo bisogno di "0.0121". Come risolvere questo problema?

double delta = iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0) - iMA(NULL,0,0,0,MODE_EMA,PRICE_CLOSE,0);

if (delta == 0.0121) Alert("Delta=0.0121"); 
 
Forexman77:
Come fare in modo che il programma emetta il livello EMA come prezzo? Supponiamo che EMA1 con periodo (1), EMA2 con periodo (0), EMA1 sia uguale a 1,3321, EMA2 per il periodo corrente 1,3200. Il risultato dell'espressione (da EMA1 a EMA2) deve essere 0,0121. Quando eseguo lo script, l'avviso mostra zero, mentre ho bisogno di "0.0121". Come risolvere questo problema?

È possibile vedere lo script stesso? - Presumibilmente avete un tipo di dati sbagliato, ad esempio interger invece di double (quindi arrotonda a zero), o qualcos'altro che causa lo zero: è difficile da capire senza il codice.

A proposito, se controlli quello che hai scritto prima con lo script, l'errore può essere sia nello script stesso (presumibilmente scritto solo per controllare il tuo indicatore), sia nel codice dell'indicatore stesso.

 
TarasBY:
Se hai filtrato correttamente i tuoi ordini, cosa che ti ho suggerito di fare, e se includi commissioni e swap nei tuoi calcoli, allora tutto funziona correttamente.


Devi aver dato un percorso molto complicato.

non funziona per me.


Ho stupidamente inserito quanto segue nel tuo esempio:

ld_Profit = fGet_ProfitLastCloseOrd (12);    
Print (ld_Profit);

Dà qualche numero, ma è molto lontano dalla realtà.

Potreste per favore DIMOSTRARMI dove devo inserire il numero 12 per farlo funzionare. Perché non so nulla di "filtraggio degli ordini" in tutto....

 
lottamer:


Devi aver dato un modo molto complicato.

non funziona per me.


Ho stupidamente inserito quanto segue nel tuo esempio:

Dà qualche numero, ma è molto lontano dalla realtà.

Potreste per favore DIMOSTRARMI dove devo inserire il numero 12 per farlo funzionare. Perché non conosco affatto il "filtraggio degli ordini" ....

Ho fatto tutti i calcoli intermedi sul grafico per avere un migliore controllo del funzionamento della funzione.

Resta solo da scrivere il codice.

Avete due modi: o capirlo da soli (con esempi - vi ho dato uno script funzionante), o trovare qualcuno che lo faccia per voi.

P.S. Se improvvisamente vuoi capirlo, puoi iniziare da qui.

 
Chiripaha:

È possibile vedere lo script stesso? - Presumibilmente avete un tipo di dati sbagliato, ad esempio interger invece di double (quindi arrotonda a zero), o qualcos'altro che causa lo zero: è difficile da capire senza il codice.

A proposito, se fai lo script che hai scritto prima, l'errore può essere o nello script stesso (presumibilmente scritto per testare il tuo indicatore) o nel codice dell'indicatore stesso.


Hai ragione, ho rimosso EMA da int a double e tutto è come dovrebbe essere.
 
TarasBY:

Per un controllo completo della funzione, tutti i calcoli intermedi sono mostrati sul grafico.

Non vi resta che scrivere il codice.

Ci sono due modi: o puoi capirlo da solo (usando esempi - ti ho dato uno script funzionante), o puoi trovare qualcuno che lo faccia per te.

P.S. Se vuoi improvvisamente capirlo, puoi iniziare da qui.


Grazie, cercherò sicuramente di capirlo
 
Forexman77:
Come posso fare in modo che il programma emetta il livello EMA come prezzo? Supponiamo che EMA1 con periodo (1), EMA2 con periodo (0), EMA1 è 1,3321 e EMA2 è 1,3200 per il periodo corrente. Il risultato dell'espressione (da EMA1 a EMA2) deve essere 0,0121. Quando eseguo lo script, l'avviso mostra zero, mentre ho bisogno di "0.0121". Come risolvere questo problema?

Usare variabili di tipo double invece di int nei calcoli;

usa NormalizeDouble(number1-number2, la precisione desiderata) quando calcola il risultato dell'espressione;

utilizzare DoubleToStr (il risultato ottenuto, la precisione desiderata) per visualizzare il risultato sullo schermo (nel diario);

Non c'è altro da suggerire senza il tuo codice...

 
Forexman77:
Hai ragione, ho rimosso l'EMA da int a double e tutto è come dovrebbe essere.

Qui, l'abbiamo già trovato... Comunque, notate che per evitare errori nascosti e imprecisioni, usate la normalizzazione quando confrontate e calcolate dati di tipo doppio
 
Chiripaha:

In conclusione: naturalmente, si potrebbe, per motivi di interesse, chiedervi di descrivere le condizioni in modo più dettagliato, dal momento che avete fornito solo una descrizione generale: quando sono stati impostati gli ordini del robot (in anticipo o no; manuale intorno allo stesso tempo del robot o no, ecc). Ma in ogni caso, anche in questo caso dovrete trattare solo con il vostro broker, perché ha il suo proprio thread che probabilmente mette in coda i trade. Supponiamo che, se l'ordine pendente manuale è stato piazzato per primo, allora il tempo della sua esecuzione sarà diverso (compresa la coda di altri clienti), quindi il prezzo può essere diverso. Se il robot ha piazzato gli ordini entro il periodo di segnali formati, allora l'arrivo degli ordini nella coda non è evidente - da qui la possibile distorsione nel prezzo di esecuzione. Inoltre, può essere influenzato dalla dimensione delle posizioni di cui non si scrive nulla... ecc...

Ma... tutto ciò può essere chiarito solo con un broker (DC). E suppongo che troverà un mucchio di ragioni che non ho menzionato. - E il consiglio era giusto: il registro nelle vostre mani e al broker, a meno che, naturalmente, si pensa ancora i vostri ordini pendenti si sono spostati. Ma basta non confondere 2 concetti diversi: un ordine in sospeso e un affare su questo ordine in sospeso. L'ordine Limit è un'istruzione per entrare nel mercato a qualsiasi prezzo più vicino con volume dichiarato. E il Deal - è il prezzo al quale è stato possibile eseguire l'ordine per il volume di denaro dichiarato (lotto). - E i prezzi di questi ordini sono probabilmente diversi (soprattutto sul mercato veloce, che è quello a cui ti è stato dato il link). Per gli ordini limite, il prezzo dell'ordine e il prezzo di esecuzione sono uguali (per definizione).

E il fatto che la demo e il broker reale non differiscono l'uno dall'altro è buono! - Questo dimostra che il broker non falsifica le transazioni per attirare i clienti (dalle tue parole). - In questo caso non c'è alcuna discrepanza.


Grazie per una risposta così dettagliata, tutto diventa chiaro. Se usiamo il sistema Instant Execution, questo problema sarà risolto?

Che dire delle condizioni che non ho menzionato:

Il robot ha piazzato gli ordini prima di quelli piazzati manualmente, ma sono stati modificati prima della notizia.

Il volume degli scambi è stato lo stesso, le distanze circa le stesse

in generale le condizioni erano quasi esattamente le stesse.

 
TarasBY:
Il giorno corrente inizia all'inizio della barra D1 corrente (iTime (NULL, PERIOD_D1, 0)), ma non state cercando modi semplici! :)))


Ecco il problema.

Tutto funziona, ma solo una volta. Cioè se imposto il periodo (iTime (NULL, PERIOD_D1, 0)) di un giorno, non funziona il giorno successivo.

ha scritto un codice di prova per testare

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_M1, 0));  

if  (GetProfitFromDateInCurrency()<1 && GetProfitFromDateInCurrency()>-1)
    { My_buy ();  My_close(); }
поставил период МИНУТКИ, так чтобы за минуту слить доллар на спреде и остановиться, ДО НАЧАЛА ВТОРОЙ МИНУТЫ. И он льет и останавливается. А вот почему на второй минуте он не открывает сделок?