Come codificare? - pagina 305

 
gmailer:
Grazie - potrebbe essere quello. Sai come sbarazzarsi di quei "punti verdi e rosa" in basso e in alto?

Scusa - in realtà stavo guardando il mio altro Stoch dove questi punti sono presenti. Quello suggerito in risposta al mio primo post era OK. Grazie!

 

Forse solo un consiglio:

Quando avete un "mattone" (una funzione, uno snippet, una parte di codice) che funziona bene, non alteratelo. Le funzioni sono buone perché si possono cambiare i loro input e funzionano in base agli input. E, una volta che avete testato le funzioni in tutti i tipi di situazioni, non dovete pensare se funziona bene. In questo modo si può restringere il codice che si deve guardare quando si cercano gli errori (e questo può accelerare immensamente il tempo di sviluppo)

crsnape@btinternet.com:
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 risk peramter 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 te; mi hai aiutato innumerevoli volte.

Grazie :-)
 

Una cosa di cui non sono sicuro è la parentesi di funzione e cosa ci va dentro.

Se scrivo una funzione all'interno di una funzione, devo mettere il nome della funzione tra le parentesi?

Per esempio, se ho una funzione LastOpenTicket() e questa viene chiamata all'interno di una funzione chiamata GetLots, devo mettere LastOpenTicket() tra le parentesi, come GetLots (LastOpenTicket())?

Inoltre devo mettere anche il ()? E se è LastOpenTicket (int number, int digit, int anotherone), tutto questo viene messo anche nella parentesi della funzione GetLots in questo caso, ad esempio GetLots (int number, int digit, int anotherone... e qualsiasi altra variabile nella funzione ecc?)

 

...

1. Immaginate la coppia di parentesi {} come "inizio" e "fine"

2. Non è possibile scrivere funzioni annidate in mql (pascal lo permette, ma mql no - le funzioni annidate sarebbero dichiarare una funzione all'interno del corpo di altre funzioni. Vedi qui : Funzione annidata - Wikipedia, l'enciclopedia libera). Puoi mettere una chiamata a qualsiasi funzione in qualsiasi parte del tuo codice

3. puoi usare quella forma di chiamata (una chiamata diretta, come il tuo esempio GetLots (LastOpenTicket()) o puoi assegnare il ritorno di LastOpenTicket() a qualche variabile e poi usarlo come argomento in una chiamata a GetLots()

crsnape@btinternet.com:
Una cosa di cui non sono sicuro è la parentesi della funzione e cosa ci va dentro.

Se scrivo una funzione all'interno di una funzione, devo mettere il nome della funzione tra le parentesi?

Per esempio, se ho una funzione LastOpenTicket() e questa viene chiamata all'interno di una funzione chiamata GetLots, devo mettere LastOpenTicket() tra le parentesi, come GetLots (LastOpenTicket())?

Devo anche metterci dentro il ()? Che dire se il suo LastOpenTicket (int number, int digit, int anotherone), tutto questo viene messo nella parentesi della funzione GetLots anche in questo caso, ad esempio GetLots (int number, int digit, int anotherone.. e qualsiasi altra variabile nella funzione ecc?)
 

Qual è la differenza tra questi due? Ce n'è qualcuna?

double GetLots (int number, int call, int specialcall, int order)

{

e..

doppio GetLots ()

{

int numero;

int call;

int specialcall;

int order;

?

 

...

La prima è una funzione che accetta argomenti

La seconda è una funzione senza argomenti, quindi non puoi cambiare i valori "number", "call", "specialcall" e "order" fuori dal corpo della funzione

Alcune informazioni più utili sulla dichiarazione delle funzioni possono essere trovate in questo thread: https: //www.mql5.com/en/forum/173005

crsnape@btinternet.com:
Qual è la differenza tra questi due? Ce n'è qualcuna?

double GetLots (int number, int call, int specialcall, int order)

{

e..

doppio GetLots ()

{

int numero;

int call;

int specialcall;

int order;

?
 

Ho giocato con le mie funzioni negli ultimi due giorni e sto ancora ottenendo risultati vuoti. Mi sto letteralmente strappando i capelli.

Ho cambiato la funzione per calcolare RiskSize come hai suggerito tu (sono d'accordo che è un sistema migliore ora) e l'ho usato nella mia funzione GetLots. Questo è quanto:

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

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 sia più grande del 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 (SaldoConto() > MargineLiberoConto())

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

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

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

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

return (LotsLong);

}

Si lamenta anche RiskLong - variabile non definita. Ma questo è definito sotto la funzione GetRiskLong che chiama.

Se è difficile da aiutare solo con il codice che ho postato, potrei mandartelo?

 

...

Prima di tutto non c'è bisogno di fare lotti separati per un long e per un short. Usa una funzione (che ti è già stata fornita) per entrambi i tipi di ordini (il calcolo della dimensione del lotto per entrambi, short e long, deve essere esattamente lo stesso). Cambia solo il rischio o la distanza dello stop loss se desideri un calcolo diverso

L'errore che stai ottenendo è perché le variabili dichiarate all'interno delle funzioni sono "visibili" solo all'interno delle funzioni. Non importa che stai chiamando la funzione che ha una variabile chiamata con il nome che stai dicendo: è locale solo alla funzione chiamata, le altre parti di codice non la "conoscono" e non possono accedervi

crsnape@btinternet.com:
Ho giocato con le mie funzioni per l'ultimo paio di giorni e sto ancora ottenendo risultati vuoti. Mi sto letteralmente strappando i capelli.

Ho cambiato la funzione per calcolare RiskSize come hai suggerito (sono d'accordo che è un sistema migliore ora) e l'ho usato nella mia funzione GetLots. Questo è quanto:

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

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 sia più grande del 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 (SaldoConto() > MargineLiberoConto())

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

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

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

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

return (LotsLong);

}

Si lamenta anche RiskLong - variabile non definita. Ma questo è definito sotto la funzione GetRiskLong che chiama.

Se è difficile da aiutare solo con il codice che ho postato, potrei mandartelo?
 
mladen:
Prima è una funzione che accetta argomenti

La seconda è una funzione senza argomenti quindi non puoi cambiare i valori "number", "call", "specialcall" e "order" al di fuori del corpo della funzione

Altre informazioni utili sulla dichiarazione delle funzioni si trovano in questo thread: https: //www.mql5.com/en/forum/173005

Grazie per questo. Quindi se chiamo una funzione chiamata GetRisk dall'interno di una funzione chiamata GetLots, dovrei mettere le variabili della funzione GetRisk nelle parentesi (...) di GetLots perché i valori sono calcolati al di fuori della funzione GetLots?

 

...

Lasciatemi provare in questo modo:

2 domande (supponendo di conoscere lo stato attuale del conto $):

domanda 1 : Sono disposto a rischiare (non so) % con (non so) pips di stop loss. Quale dovrebbe essere la mia dimensione dei lotti?

Domanda 2: Sono disposto a rischiare l'1% con 100 pips di stop loss. Quale dovrebbe essere la mia dimensione dei lotti?

E' ovvio che la risposta alla prima domanda è impossibile poiché non si conosce la percentuale di rischio che sono disposto a rischiare né lo stop loss che userò. Ma nel secondo esempio è possibile calcolare la dimensione dei lotti poiché si conoscono tutte queste cose. Ora questi sono argomenti: poiché prevediamo che rsik% e stop loss possano variare, li forniamo al calcolo della dimensione del lotto come argomenti variabili che verranno "detti" alla funzione ogni volta che la funzione viene chiamata

Spero che questo chiarisca a cosa servono gli argomenti (parametri) nelle funzioni. Ogni funzione funziona secondo lo stesso principio: se prevedete che una parte del calcolo possa falsarsi, mettetela come argomento della funzione

Ecco altri esempi di codifica di funzioni: https: //en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
Grazie per questo. Quindi se sto chiamando una funzione chiamata GetRisk dall'interno di una funzione chiamata GetLots, avrei bisogno di mettere le variabili della funzione GetRisk nelle parentesi (...) di GetLots perché i valori sono calcolati al di fuori della funzione GetLots?
Motivazione: