Chi vuole una strategia? Molto e gratis) - pagina 59

 
Stellarator >> :

ci sono mai state discrepanze tra i valori originali e quelli "successivamente distribuiti"? ancora doppio...)

non ancora.... tutti i problemi vengono dalla sciatteria :)

Costretto a dissuadere! La sfumatura chiave - "il limite di un'iterazione dell'EA". Bene, entro questi limiti l'indicatore viene calcolato UNA volta (alla sua prima chiamata)! Lo dichiaro con il 100% di fiducia. Tutte le chiamate successive non lo avviano affatto, ma prendono solo i valori necessari dai buffer necessari. La condizione è 100% se i parametri di ingresso rimangono invariati (tranne il buffer e l'offset). La regola è valida per i calcoli entro i limiti di uno strumento. Ma penso che il principio sia valido anche quando iCustom si riferisce ad altri TF e strumenti.

Uno dovrebbe essere "forzato" ..... tutto in una volta. Grazie per un'altra caratteristica non documentata :)


 

FSB__Bar_Opening_Bar_Closing.mql4 v0 .0.2 Beta


Ingresso al mercato all'apertura del bar;

Esci alla chiusura della barra (10 sec. fino alla chiusura o all'apertura successiva)


** Questa è solo una demo per testare i punti di entrata/uscita. **


Frammenti di codice:


bool bIsFirstTick;// It is used to catch the Bar Opening.
datetime dtCurrentBarOpeningTime;

int init()
{
   bIsFirstTick = false;
   dtCurrentBarOpeningTime = Time[0];
   return(0);
}

int start()
{
   // Is this the first tick for the bar
   bIsFirstTick = ( dtCurrentBarOpeningTime != Time[0]);
   if( bIsFirstTick)
   {
      dtCurrentBarOpeningTime = Time[0];
   }

...
...



///
/// Exit at a Bar Closing price (almost).
///
/// MetaTrader does not provide an onBarClose event so we are not able to close a position
/// exactly at Bar Closing. We workaround the problem by closing the position within a time span
/// near to the bar closing time. In the cases when there is no any ticks within this period,
/// we close the position att he next bar opening price.
///
int ClosePositionsAtBarClosing(bool bCloseLong, bool bCloseShort, datetime dtClosingTimeSpan)
{
   int  iOrders = OrdersTotal();
   bool bIsOpen = false;

   for(int iOrder = 0; iOrder < iOrders; iOrder++)
   {
      OrderSelect( iOrder, SELECT_BY_POS, MODE_TRADES);
      
      if((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
      {  // There is an open position for this symbol.

         datetime dtOpeningTime     = Time[0] - TimeSeconds(Time[0]); // The opening time of current bar
         datetime dtClosingTime     = dtOpeningTime + Period() * 60;  // The closing time of current bars
         datetime dtCurrentTickTime = TimeCurrent() ;                 // The time of current tick
         
         if( dtCurrentTickTime > dtClosingTime - dtClosingTimeSpan ||  bIsFirstTick)
         {  // The current tick is within the closing time span or this is the first tick of the bar.

            // Code

         }
       }
    }
}
 

1. Per quanto riguarda le prestazioni:

Per lo più non abbiamo bisogno di ricalcolare un indicatore per ogni tick. (Riferimento - "Usa il valore della barra precedente".) Un indicatore deve essere calcolato o all'"Apertura della barra" o alla "Chiusura della barra".


2. fMicron:

Io uso fMicron = Point/2 quando confronto i prezzi per le decisioni di trading. Ma questo non è applicabile agli indicatori. Eg. per USDJPY punto = 0,01; fMicron = 0,005.

0,000075 è il risultato di molti test nel corso degli anni. Ho iniziato a lavorare su FSB nel 2001 :) Naturalmente non significa nulla. Ho cambiato idea molte volte al riguardo.

**edit: MT dà questo nelle mani degli utenti. Probabilmente i guru degli EA possono dire cosa usano nei loro EA.

**edit2: Metterò questo parametro nel file di configurazione per gli esperimenti.


3. Inizierò a fornire il codice sorgente originale da scaricare per ogni versione di FSB. Non avrò bisogno di aggiornare il sito web per ogni piccolo cambiamento in questo caso.


Ho iniziato a cambiare il float con il doppio. Pubblicherò presto questa versione stasera o domani. Dopo di che dobbiamo testarlo a fondo. Dobbiamo passare per ogni indicatore per risolvere alcuni problemi / caratteristiche prima di scriverli in MQL.

 

1. Sì, nella maggior parte dei casi (dato l'approccio generale di FSB all'apertura/chiusura delle posizioni (all'apertura/chiusura del bar)) - Questo non è necessario. Ma, diciamo - le regole di buona educazione - sono obbligatorie. Calcolo dell'indicatore "da zero" ogni volta (anche una volta a Bar) - in generale (sono d'accordo) non critico nei limiti dei grandi periodi... Ma cosa succede se il periodo è di minuti? E se l'indicatore ha ancora bisogno (o vuole) di essere calcolato ogni barra (qualche punto sofisticato della posizione, che non può (o non può più, perché il prezzo di apertura è inferiore al livello degli stop) essere catturato da un ordine?)

La conversione non è complicata da molto, infatti - sì, c'è un po' di codice "nel wrapper" e il principio della camminata della barra è invertito. In realtà, questo è tutto, in linea di massima. La cosa principale è mantenere l'algoritmo (in modo che possa essere facilmente letto e identificato all'interno del codice sorgente) e mantenere la compatibilità parametrica con FSB. Creare un meccanismo conveniente per l'estrazione del segnale. E per renderlo utilizzabile per i puri visual designer (che non si preoccupano di EA). Secondo me.


2. Beh, non ho suggerito di usare la variante Point/2 per confrontare (ugualmente) i valori degli indicatori :). - Stavo solo suggerendo una costante. La questione è nel suo valore e dimensione (0,000075 - non male, non l'ho detto - non capisco perché proprio 75 e non "di solito" 50:)? L'esperienza "dal 2001" è abbastanza rivelatrice (argomento!) e sono abbastanza disposto ad accettare questo valore. Ma come ultima osservazione - per le citazioni con una dimensione di 0.12345 questo non sarà sufficiente (voglio dire - molto :))). Il numero dovrebbe essere spostato di almeno un fotogramma a destra (0,0000075). Nella mia società di intermediazione, per esempio, tali quotazioni sono già una pratica comune... Suggerirei di regolarlo per lo strumento e di usare "10", non "75" :):

fMicron = Punto * 0.1f

In breve, sì - propongo di renderlo parametricamente - impostato (penso che dopo qualche esperimento amichevole tutto andrà a posto (anche se... se il punto è cambiato molte volte ;)...). E aspettare le opinioni di altre persone...


3. Sono riuscito a scaricare i sorgenti postati :-P. Così ci sarà "qualcosa da confrontare" (in termini di codice risultante). E per quanto non voglia più disturbarti - buona fortuna con la conversione da float a doppio!


(com'è il test con RSI? ;), se riesci a farlo?)

 

Ho scoperto che il migliore è 100 > Micron > 50. Ecco perché ho preso 75. Era per il mio broker: Punto = 0,0001.

Ma hai ragione che i broker hanno iniziato a quotare a 0,00001.

Facciamo: Micron = Math.Min(Punto * 0.75, 0.000075)

Spero di finire la conversione tra 3 ore. Metto qui il programma per i test.

Caricherò anche i codici sorgente degli indicatori convertiti.

 

Tutti gli indicatori e i parametri sono numeri doppi .

Micron = 0,000075


Metti l'exe nella cartella insieme all'ultimo FSB v2.8.3.3 Beta. Entrambi i programmi condivideranno gli stessi dati e strategie. È conveniente per il confronto. Fate attenzione ai valori degli indicatori. Praticamente tutti gli indicatori e la metà degli altri file sono stati cambiati.

Per vedere la precisione completa, premere F12 nel grafico o usare Command Console (ind ####).


Si prega di segnalare qualsiasi problema. Ora è il momento di richiedere cambiamenti sugli indicatori. Dobbiamo fissarli prima di continuare il lavoro sull'integrazione di MT.



 

Buongiorno!

Miroslav, tempo molto limitato ora... quindi è veloce:

1. Grazie per la pronta traduzione (float to double)! Grande!

2. Finora tutto sembra funzionare (per quanto sono riuscito a controllare), potete vedere le differenze (al volo), sia nei valori degli indicatori che nei risultati della strategia :)

3. MA - le differenze non erano quelle che ci aspettavamo! (Ho fatto un esperimento interno ieri sera, e le mie "paure" sono state confermate - la conversione aumenterà la precisione del calcolo - MA non cambierà catastroficamente il risultato! Qualcosa dall'area delle differenze nella quarta-quinta cifra... ma abbiamo divergenze già dalla seconda cifra! (lo stesso RSI, per esempio))


LA RAGIONE È UN'ALTRA!!!


Cosa sono riuscito a controllare:

1. All'inizio ho pensato se c'erano dei link difficili sul tema delle cifre (ho degli strumenti con 5 cifre, attenzione)... Forzare la specificazione di 4 cifre nelle proprietà dello strumento - non ha aiutato (a proposito - ma funziona!)

2. Il codice degli indicatori stessi ... hmm... ... beh, non c'è niente di cui lamentarsi! Ora è doppio ovunque, il codice stesso (come lo vedo io) non è cambiato... Il codice è abbastanza semplice (molto spesso opera solo con l'addizione e la sottrazione) - un tale errore potrebbe NON essersi accumulato lì!!! (Non ne sono così sicuro... ma... ;))

3. Il mio ultimo pensiero (che non sarò in grado di controllare) - QUESTO È COSA :)!:



Valori di chiusura/apertura bar (???) (e altri, potenzialmente?)


Da dove vengono questi numeri? :))) (che tipo di "additivi" sono :D?)

Lo prendo da qualche parte qui (Bar Closing.cs):

            // Saving the components
            component = new IndicatorComp[1];

            component[0] = new IndicatorComp();
            component[0]. CompName  = "Closing price of the bar";
            component[0]. DataType  = ( parameters. SlotType == SlotTypes.Open) ? IndComponentType. OpenPrice : IndComponentType. ClosePrice;
            component[0]. ChartType = IndChartType. NoChart;
            component[0]. FirstBar  = 2;
            component[0].Value     = Data.Close;

Di conseguenza, la mia prima ipotesi di lavoro è che (forse) si tratta di questo? ("sbagliato" (o "giusto", ma perché proprio così?) dare via valori di citazione nella funzione?)

In parte, apparentemente, alla questione dei valori ottenuti (per riempire i buffer operati durante il calcolo dell'indicatore) dalla funzione protected static float[] Price(BasePrice price)


In generale, Miroslav - "la palla è nel tuo campo" :). Per ora ho notato il nuovo codice dei TUOI indicatori, che è perfettamente compatibile con gli indicatori MT (sono persistente :D, finirò l'argomento RSI):



Stessa barra, primo indicatore - conversione, secondo - nativo da MT.


Qualche pensiero, suggerimenti? (Sarò lì tra 6 ore)

 

Частично, видимо, заодно к вопросу получаемых значений (для заполнения оперируемых буферов при расчете индикатора) из искомой функции protected static float[] Price(BasePrice price)

Tutte le classi base, i metodi e le proprietà restituiscono ora valori doppi, così come tutte le funzioni di trading (ho cambiato le ultime 6 mesi fa).

Sembra che ci sia una differenza nella formula della RSI. Non può essere nel secondo segno "ma abbiamo già una differenza nel secondo segno! :) Cercherò di adottare la formula MT RSI esistente in FSB.



**Modifica:

Già risolto:

Parametri predefiniti: RSI(close, 14, smoothed) == MT RSI

            for (int iBar = 1; iBar < Bars; iBar++)
            {
                if ( adBasePrice[ iBar] > adBasePrice[ iBar - 1]) adPos[ iBar] = adBasePrice[ iBar] - adBasePrice[ iBar - 1];
                if ( adBasePrice[ iBar] < adBasePrice[ iBar - 1]) adNeg[ iBar] = adBasePrice[ iBar - 1] - adBasePrice[ iBar];
            }

            double[] adPosMA = MovingAverage( iPeriod, 0, maMethod, adPos);
            double[] adNegMA = MovingAverage( iPeriod, 0, maMethod, adNeg);

            for (int iBar = iFirstBar; iBar < Bars; iBar++)
            {
                if ( adNegMA[ iBar] == 0)
                    adRSI[ iBar] = 100;
                else
                    adRSI[ iBar] = 100 - (100 / (1 + adPosMA[ iBar] / adNegMA[ iBar]));
            }


Programma da scaricare presto.


 

Miroslav - non ci sono differenze nelle formule. Come ho detto all'inizio della discussione su RSI - hai solo un ALTRO ciclo di mediazione (che forzatamente fa Smoothed da qualsiasi risultato di funzioni MovingAverage correttamente funzionanti) :), ECCO il primo valore (che rimane dall'esecuzione di MovingAverage :).

Comunque, a giudicare dall'ultimo codice citato - tutto è andato a posto (e RSI ora leggerà altre modalità di mediazione normalmente) :)! Yahoo!


(il codice dell'indicatore, che ho salvato prima, contiene già questa modifica ;) - basta chiamare fsbRSI con i seguenti parametri per esserne sicuri:

indLogic = non importante

maMethod = 2 (! importante MODE_SMMA in termini di MT)

basePrice = 0 (PRICE_CLOSE in termini di MT)

iPeriodo = 14

fLevel = non importante

iPrvs = non importante

E ottenere una corrispondenza esatta dei risultati con il Relative Strength Index nativo (che viene fornito con MT)

Tranne che sia fsbRSI che iRSI NON sono uguali a FSB :(


Quindi torniamo al problema principale:


"Tutte le classi base, i metodi e le proprietà restituiscono ora valori doppi, così come tutte le funzioni di trading (ho cambiato le ultime 6 mesi fa)".


Beh, è fantastico! Non capisco proprio come questa tesi dovrebbe influenzare

Prezzo di apertura della barra e prezzo di chiusura della barra? Nell'esempio precedente.


Per ripetere la domanda: perché i prezzi richiesti sono DIVERSI dalle quotazioni? (Intendo 6,7,8, ... cifre)


Ildoppio non c'entra assolutamente nulla! I valori tra virgolette sono normalizzati e dovrebbero essere conservati (essere completamente identici) quando vengono semplicemente copiati tra le variabili.

Se valori simili cominciano ad apparire nel calcolo degli indicatori (quando i buffer per il calcolo sono riempiti sulla base dei valori delle quotazioni, il protected static float[] Price(BasePrice price)), allora siamo BELLI (per quanto strano possa sembrare), cioè è come un'altra fonte (oltre al precedente float), dati "leggermente" denormalizzati :)

 

Ho cambiato leggermente alcuni degli indicatori per assomigliare a quelli standard di MT.


Cambiati gli indicatori FSB:

RSI

Oscillatore di RSI

Oscillatore RSI MA

Bande di Bollinger

Deviazione standard

Stocastico


Ci sono differenze nei seguenti indicatori:

Momentum

Indice di facilitazione del mercato


Altro:

MT Moving Average Oscillator == FSB MACD Histogram

MT Momentum == FSB Rate of Change

Indice di vigore relativo - non incluso in FSB


Ora gli indicatori FSB e MT dovrebbero essere più o meno uguali.


TODO:

Stocastico - revisione dei segnali;

Market Facilitation Index - revisione della formula;

Una Momentum come quella della MT da includere nel FSB - chiamata "Momentum MT"

Incluso il "Relative Vigor Index" in FSB.