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).
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ù.
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)...
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
Non è corretto usare la condizione == per variabili di tipo double. Si raccomanda di confrontare in questo modo:
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ì:
Di tanto in tanto ricevo questi messaggi nel registro
2010.06.15 14:48:09 MemoryException 4915200 byte non disponibili
Non so cosa fare?
I seguenti messaggi appariranno periodicamente nel registro
2010.06.15 14:48:09 MemoryException 4915200 byte non disponibili
Non so cosa fare?
Non è corretto usare la condizione == per variabili di tipo double. Si raccomanda di confrontare in questo modo:
Non c'è abbastanza memoria operativa. Controllate la dimensione degli array dinamici, molto probabilmente un tentativo di allocare più memoria di quella disponibile.
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ù.
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 (se una delle condizioni If funziona)...
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.