Errori, bug, domande - pagina 9

 
DC2008:

Non è corretto usare la condizione == per variabili di tipo double. Si raccomanda di confrontare in questo modo:


Posso aggiungere che, anche se con un certo ritardo, abbiamo ancora scritto un articolo su questo argomento - Caratteristiche di lavorare con numeri di tipo doppio in MQL4. Tutto ciò che è menzionato lì sarà ancora rilevante per qualsiasi linguaggio di programmazione quando si tratta di operazioni con numeri reali (doppio e float in MQL5).
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008:

Non è corretto usare la condizione == per variabili di tipo double. Si raccomanda di confrontare in questo modo:


Abbastanza ragionevole, e soprattutto un approccio sensato. Ma mi sembra che almeno la prima riga avrebbe dovuto essere così:

if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2));
 

Di tanto in tanto ricevo questi messaggi nel registro

2010.06.15 14:48:09 MemoryException 4915200 byte non disponibili

Non so cosa fare?

 
Prival:

I seguenti messaggi appariranno periodicamente nel registro

2010.06.15 14:48:09 MemoryException 4915200 byte non disponibili

Non so cosa fare?

Non abbastanza RAM. Controlla la dimensione degli array dinamici, molto probabilmente un tentativo di allocare più memoria di quella disponibile.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008:

Non è corretto usare la condizione == per variabili di tipo double. Si raccomanda di confrontare in questo modo:


Non è questo il punto della domanda, se ho capito bene, si dovrebbe sempre mettere l'operatore di ritorno alla fine di una funzione utente
 
joo:
Non c'è abbastanza memoria operativa. Controllate la dimensione degli array dinamici, molto probabilmente un tentativo di allocare più memoria di quella disponibile.
No, non è questo. probabilmente è qualcosa con i server. probabilmente ci sono dei lavori in corso. è apparso un buco nei dati. la connessione al server è spesso persa. la storia non viene scaricata. questo probabilmente ha causato l'errore.
 
sergey1294:
Non è questo il punto della domanda. Se ho capito bene, l'operatore di ritorno deve essere sempre posto alla fine della funzione utente

Penso che la risposta su == sia stata essenzialmente. Ci dovrebbe davvero essere un return(...) da qualche parte in una funzione di tipo double. Non necessariamente alla fine. L'uso dell'operatore == in if() return(); può causare un output falso se avete il tipo LotStep 0.1000000000000000001. In questo caso nessuno dei ritorni funzionerà e la funzione non restituirà nulla. Anche se nel tuo caso il ritorno probabilmente non ama NormalizeDouble al suo interno. Nella tua versione che funziona, fissa la fine a return(NormilizeDouble(lot,2)) e vedi se funziona. Anch'io sono curioso di saperne di più.

 
gpwr:

Penso che la risposta su == sia stata essenzialmente. Ci dovrebbe davvero essere un return(...) da qualche parte in una funzione di tipo double. Non necessariamente alla fine. L'uso dell'operatore == in if() return(); può causare un output falso se avete il tipo LotStep 0.1000000000000000001. In questo caso nessuno dei ritorni funzionerà e la funzione non restituirà nulla. Anche se nel tuo caso il ritorno probabilmente non ama NormalizeDouble al suo interno. Nella tua versione che funziona, fissa la fine a return(NormilizeDouble(lot,2)) e vedi se funziona. Anch'io sono curioso di saperne di più.

Ci deve essere return(...) alla fine, ma potrebbe non arrivarci mai (se una delle condizioni If funziona)...
 
Interesting:
Ci deve essere return(...) alla fine, ma potrebbe non arrivarci (se una delle condizioni If funziona)...
Questo è quello che mi interessava, in 4 non era necessario metterlo alla fine.
 

double volMin     =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
long   Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);
if(vol<volMin) vol=volMin;
if(vol*LotRqdMgn>FreeMargin) vol=0.0;
Print(LotRqdMgn," ",FreeMargin);
return(vol);
Renat
:

L'errore è che hai dimenticato la valuta del margine nei tuoi calcoli. Saldo = 100 USD e margine richiesto = 100 EUR (119 USD).

Ecco perché l'operazione non può essere eseguita - tutto è corretto.

Voglio tornare alla mia domanda sul calcolo corretto del margine. Come Renat ha notato nei miei calcoli, LotRqdMgn (margine richiesto per comprare 1 lotto) non tiene conto del prezzo della valuta. Ricordo di aver visto questo tavolo

Identificatore

Descrizione

Formula

SIMBOLO_CALC_MODO_FOREX

Modalità Forex - calcolo del profitto e del margine per il Forex

Margine: Lotti*dimensione del contratto/leva

Profitto: (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_FUTURES

ModalitàFutures- calcolo del margine e del profitto per i futures

Margine: Lotti *InitialMargin*Percentage/100

Profitto: (close_price-open_price)*TickPrice/TickSize*Lots

SYMBOL_CALC_MODE_CFD

Modalità CFD - calcolo del margine e del profitto per CFD

Margine: Lots *ContractSize*MarketPrice*Percentage/100

Profitto: (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_CFDINDEX

Modalità indice CFD - calcolo del margine e del profitto per CFD tramite indici

Margine: (Lotti*Dimensione contratto*Prezzo di mercato)*TickPrice/TickSize

Profitto: (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_CFDLEVERAGE

CFD Leverage mode - calcolo del margine e del profitto per il trading di CFD a leva

Margine: (Lotti*Dimensione contratto*Prezzo di mercato*Percentuale)/Leva

Profitto: (close_price-open_price)*Contract_Size*Lots

Così si scopre che c'è un errore nella tabella: invece di Lots*Contract_Size/Leverage, deve essere Price*Lots*Contract_Size/Leverage.

Motivazione: