Come codificare? - pagina 304

 

...

1. In generale, no, non ha senso controllarlo, poiché nella maggior parte dei casi avrete molte più barre di quelle necessarie a una media mobile per "stabilizzarsi". Non è un vecchio bug, ma è un semplice controllo di quante barre ci sono nella storia

2. 2. Sì. Tieni solo a mente che iClose() (e le simili iOpen(), iHigh() e iLow()) sono funzioni mentre Close[],Open,High[],Low[] sono semplici array con un accesso molto, molto più veloce ai valori, quindi devi valutare se hai davvero bisogno della flessibilità della funzione rispetto alla velocità e semplicità dell'accesso agli array

zzz:
Ciao, sono nuovo nella programmazione ma non nuovo nel trading. Non ho postato nulla per un po' e ora, da quando ho iniziato a sviluppare il mio EA, ho un sacco di domande. Ho iniziato con la costruzione di un indicatore prima, e una volta che fa quello che voglio andrò oltre. Ho letto tutti i manuali che ho potuto trovare, quindi ora è il momento di andare avanti con la codifica.

Scusa, se è un thread sbagliato - per favore fammi sapere dove dovrei postare tali domande allora.

Ho 2, probabilmente, domande di base per ora, per favore:

1. In molti indicatori che usano MAs vedo linee che controllano quante barre ci sono sul grafico. Quindi, se ho bisogno di MA200 e il grafico ha solo, diciamo, 100 barre, iMA200 funzionerebbe allora? Penso di sì - ho controllato e qualsiasi MA viene disegnata senza problemi su qualsiasi grafico, quindi penso che questo sia un vecchio bug che Metaquotes ha risolto ora. Quindi, ha senso controllare quante barre ci sono sul grafico per disegnare la MA o usare la funzione iMA?

2. Qual è la differenza tra Close e iClose? La mia comprensione è che Close può restituire una chiusura delle barre solo sul grafico corrente, e iClose può restituire qualsiasi chiusura di qualsiasi coppia di valute e qualsiasi timeframe. E in entrambi i casi, per ottenere l'ultima barra chiusa devo usare l'indice [1]. Ho capito bene?

Grazie.
 

DoubleStochastic per MT4, vero DoubleStochastic

Ciao ragazzi - nuovo utente MT4.

Sto lottando per trovare l'indicatore DoubleStochastic per MT4. Era il mio indicatore preferito sulla piattaforma VTT. E intendo DoubleStochastic REALE - non Bressert Double Stochastic che dà un'indicazione completamente diversa da DoubleStochastic originale. Vedere il file allegato - Double da VTT dà indicazioni un po' diverse da Double da MT4:

Qualcuno è in grado di aiutarmi a codificare il VTT'2 DoubleStochastic in MT4? Ecco il codice e la logica del VTT:

Fast %K = ((chiusura di oggi - minimo più basso in %K periodi) / (massimo più alto in %K periodi - minimo più basso in %K periodi)) * 100

Slowing %K = media mobile di N periodi del Fast %K

Double %K = ((Oggi %K rallentamento - %K rallentamento più basso in %K periodi) / (%K rallentamento più alto in %K periodi - %K rallentamento più basso in %K periodi)) * 100

Doppio rallentamento %K = media mobile di N periodi di Doppio %K

%D = media mobile semplice di 3 periodi di Double Slowing %K

e il codice stesso:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

C'è qualcuno che conosce bene MT4?

Mi sono talmente abituato alla versione di VTT che non riesco a usare altro.

 

...

gmailer

Inviato un doppio stocastico qui: https: //www.mql5.com/en/forum/177239/page28 (al fine di mantenere tutte le versioni di stocastico in un unico luogo)

Penso che sia quello che stai cercando

gmailer:
Ciao ragazzi - nuovo utente MT4.

Sto lottando per trovare l'indicatore DoubleStochastic per MT4. Era il mio indicatore preferito sulla piattaforma VTT. E intendo DoubleStochastic REALE - non Bressert Double Stochastic che dà un'indicazione totalmente diversa che DoubleStochastic originale. Vedere il file allegato - Double da VTT dà indicazioni un po' diverse dal Double da MT4:

Qualcuno è in grado di aiutarmi a codificare il VTT'2 DoubleStochastic in MT4? Ecco il codice e la logica del VTT:

Fast %K = ((chiusura di oggi - minimo più basso in %K periodi) / (massimo più alto in %K periodi - minimo più basso in %K periodi)) * 100

Slowing %K = media mobile di N periodi del Fast %K

Double %K = ((Oggi %K rallentamento - %K rallentamento più basso in %K periodi) / (%K rallentamento più alto in %K periodi - %K rallentamento più basso in %K periodi)) * 100

Doppio rallentamento %K = media mobile di N periodi di Doppio %K

%D = media mobile semplice di 3 periodi di Double Slowing %K

e il codice stesso:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

C'è qualcuno che conosce bene MT4?

Mi sono talmente abituato alla versione di VTT che non posso usare altro.
 

Grazie - potrebbe essere quello. Sai come sbarazzarsi di quei "punti verdi e rosa" nella parte inferiore e superiore?

 

Grazie mladen, ha senso.

 

Ciao a tutti,

Sto lottando per trovare un modo per innescare un trade quando la mia linea stocastica attraversa la regione di iperbollo (80) o ipervenduto (20). Sono in grado di innescare un trade quando la mia linea attraversa, tuttavia non sono in grado di impostarla per innescare un trade SOLO quando è nella regione di iperbollo o ipervenduto. Qualcuno ha qualche idea su come posso fare questo o c'è qualche altro posto dove posso fare riferimento?

Mi sono imbattuto in alcuni siti che dicevano qualcosa sull'impostazione di alcuni valori a 20.1 e 80.1 ma niente di più.

Per favore aiutatemi a fare un po' di luce. Grazie.

Saluti

Terrance

 

...

Terrance,

Qui c'è un thread con del codice pratico che potrebbe essere usato come esempio per quello che ti serve: https: //www.mql5.com/en/forum/179114

tkuan77:
Ciao a tutti,

Sto lottando per trovare un modo per far scattare il trade quando la mia linea stocastica incrocia all'interno della regione di ipervenduto(80) o iperbollo(20). Sono in grado di innescare un trade quando la mia linea attraversa, tuttavia non sono in grado di impostarla per innescare un trade SOLO quando è nella regione di iperbollo o ipervenduto. Qualcuno ha qualche idea su come posso fare questo o c'è qualche altro posto dove posso fare riferimento?

Mi sono imbattuto in alcuni siti che dicevano qualcosa sull'impostazione di alcuni valori a 20.1 e 80.1 ma niente di più.

Per favore aiutatemi a fare un po' di luce. Grazie.

Saluti

Terrance
 

Ciao, ho corretto le funzioni e sono contento ora. Sembra buono. Tuttavia il registro dei risultati di trading quando faccio il backtest contiene solo 1 ordine di acquisto. Penso che potrebbe avere a che fare con la mia funzione GetLots ma non sono al 100% nonostante l'abbia esaminata diverse volte - ti dispiacerebbe darci un'occhiata e farmi sapere se trovi qualcosa che non va? Grazie.

//--- Funzione per calcolare i lotti per le posizioni lunghe

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

doppio MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // I lotti devono essere normalizzati per ospitare LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // La normalizzazione non arrotonda, ma taglia qualsiasi porzione di lotto che è più grande di LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // In questo modo il rischio è un po' minore.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

se (LotStep == 1.00) LotDigit = 0;

se (LotStep == 0.10) LotDigit = 1;

se (LotStep == 0.01) LotDigit = 2;

se (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

se (SaldoConto() > MargineLiberoConto())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

ritorno (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

se (SaldoConto() > MargineLiberoConto())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}

 

...

GetLots() nella forma che ho postato è testato e funziona come dovrebbe. Non c'è bisogno di cambiarla. Usatelo come una funzione che determinerà la dimensione del lotto al momento dell'apertura dell'ordine. Tenete fuori il resto della logica (quella funzione dovrebbe fare solo questo: trovare la dimensione dell'ordine in funzione del rischio, dello stop loss e dello stato attuale del conto )

Senza il resto del codice non posso aiutarti. Sarebbe come se potessi guardare attraverso un piccolo buco e vedere il mondo intero. Impossibile. Se volete mantenere il resto del codice segreto, tutto ciò che posso aiutarvi è il codice che postate qui, e ripeto: state tranquilli che GetLots() nella forma originale funziona come dovrebbe e dovrebbe essere usato nella sua forma originale.

Se volete usarla con risultati variabili, cambiate il rischio o lo stop loss in modo dinamico ("decidete" il rischio o lo stop loss nel codice prima di GetLots() e poi chiamatelo con il rischio o lo stop loss modificati - la funzione calcolerà correttamente per i dati immessi) Non è necessario cambiare il codice della funzione

crsnape@btinternet.com:
Ciao, ho corretto le funzioni e ora sono soddisfatto. Sembra buono. Tuttavia il log dei risultati del trade quando faccio il backtest contiene solo 1 ordine di acquisto. Penso che potrebbe avere a che fare con la mia funzione GetLots ma non sono al 100% nonostante l'abbia esaminata più volte - ti dispiacerebbe dare un'occhiata e farmi sapere se trovi qualcosa che non va? Grazie.

//--- Funzione per il calcolo dei lotti per le posizioni lunghe

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

doppio MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // I lotti devono essere normalizzati per ospitare LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // La normalizzazione non arrotonda, ma taglia qualsiasi porzione di lotto che è più grande di LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // In questo modo il rischio è un po' minore.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

se (LotStep == 1.00) LotDigit = 0;

se (LotStep == 0.10) LotDigit = 1;

se (LotStep == 0.01) LotDigit = 2;

se (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

se (SaldoConto() > MargineLiberoConto())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

ritorno (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

se (SaldoConto() > MargineLiberoConto())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

ritorno (LotsLong);

}
 

Ciao mladen sono completamente d'accordo con te, la funzione GetLots che hai fornito funziona come dovrebbe; l'ho testata come parte del mio codice e ha funzionato.

Ho apportato delle modifiche semplicemente perché voglio cambiare il mio perametro di rischio a seconda se sto vincendo o perdendo. Ho fondamentalmente elaborato il codice esistente (o comunque ci ho provato) incorporando ulteriori regole di gestione del denaro.

Posso dire onestamente che il mio codice non è segreto; sono sicuro che molti altri hanno considerato e implementato nel codice quello che sto cercando di fare; ma suppongo che ci sia un elemento di privacy perché io personalmente ho speso così tanto tempo per svilupparlo.

Continuerò a rivedere il mio codice, ovviamente voglio provare a risolvere qualsiasi problema da solo, perché sono orgoglioso di imparare e fare le cose da zero.

Ma capisco il tuo paragrafo finale; userò una variabile 'Risk' e cambierò questo rischio di conseguenza sull'output di una funzione.

Comunque grazie per aver risposto ancora una volta, questo forum onestamente non sarebbe lo stesso senza di voi; mi avete aiutato innumerevoli volte.

Grazie :-)