Errori, bug, domande - pagina 4

 
Interesting:

MarketInfo(Symbol(),MODE_MARGININIT) = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL)

Cosa corrisponde allora a MODE_MARGINREQUIRED? O altrimenti, come faccio a sapere quanti soldi liberi mi servono per aprire 1 lotto per comprare?

In Moving Average.mq5 Expert Advisor dei creatori di mql5, i lotti sono calcolati in questo modo

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift
//---
int   ExtHandle=0;
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
//--- select lot size
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

Perché MaximumRisk è così piccolo (0,02%) e diviso per 1000 nel calcolo dei lotti? Cosa rappresenta questo 1000? Forse 1000 = fondi disponibili necessari per comprare 1 lotto moltiplicato per 100% (per convertire lo 0,02% in una frazione di 0,0002)? Cioè, i fondi disponibili per l'acquisto di 1 lotto sono $10 ($10x100%=1000). Penso che sia nella giusta direzione?

E un'altra domanda. C'è un limite al numero massimo di ordini aperti?

 
gpwr:

Cosa corrisponde allora a MODE_MARGINREQUIRED? O altrimenti come faccio a sapere la quantità di fondi disponibili necessari per aprire 1 lotto per comprare?

E un'altra domanda. C'è un limite al numero massimo di ordini aperti?


Mi sono posto questa domanda.


Ecco la risposta degli sviluppatori:

Rashid Umarov:

Vedere

SIMBOLO_SCAMBIO_DIMENSIONE_CONTRATTO

Dimensione del contratto commerciale

doppio

и

MARGINE_DI_VALUTA DEL SIMBOLO

Valuta in cui viene calcolato il margine

stringa


Da quanto ho capito, dovrete calcolarlo voi stessi

 

gpwr:

In Moving Average.mq5 Expert Advisor dei creatori di mql5, i lotti sono calcolati in questo modo

Perché MaximumRisk è così piccolo (0,02%) e diviso per 1000 nel calcolo dei lotti? Cosa rappresenta questo 1000? Forse 1000 = fondi disponibili necessari per comprare 1 lotto moltiplicato per 100% (per convertire lo 0,02% in una frazione di 0,0002)? Cioè, i fondi disponibili per l'acquisto di 1 lotto sono $10 ($10x100%=1000). Penso che sia nella giusta direzione?

E un'altra domanda. C'è un limite al numero massimo di ordini aperti?


AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk

Questa linea calcola il rischio come il 2% dei fondi disponibili, se ho capito bene. Perché dividono questo importo per 1000?


Ma se ho capito bene, allora con un deposito (fondi liberi) di $20.000, l'Expert Advisor raccomanda di aprire non più del 2% di questo importo ($400).

Dividendo questo importo per 1.000 otterremo logicamente 0,4 lotto...

 

gpwr:

C'è un limite al numero massimo di ordini aperti?

Mi stavo chiedendo la stessa cosa. C'è un suggerimento a cui gli sviluppatori stanno ancora pensando (per loro, a proposito - applicazione 15802).
 
Interesting:

Questa linea calcola il rischio come il 2% della quantità di fondi disponibili, se ho capito bene. Il motivo per cui questo importo è diviso per 1.000 è a discrezione degli sviluppatori.

Ma se ho capito bene, allora con un deposito (fondi liberi) di $ 20.000, l'Expert Advisor raccomanda di aprire non più del 2% di questo importo ($ 400).

Dividendo questo importo per 1.000 otterremo logicamente 0,4 lotto...

Ora ho capito. C'è un errore in Moving Average.mq5. Invece di

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

Dovrebbe essere

input double MaximumRisk        = 0.02;    // Maximum Risk as a fraction  of a free margin

Allora la divisione per 1000 nel calcolo dei lotti è chiara: $100.000(dimensione del lotto)/100(leva) = 1000. Tuttavia, gli sviluppatori di mql5 non devono mostrare un tale esempio di Expert Advisor. Dovrebbe essere cambiato

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

A

double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(FreeMargin*MaximumRisk/LotRqdMgn,2);

O meglio ancora

double Step       =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(MathFloor(FreeMargin*MaximumRisk/LotRqdMgn/Step)*Step,2);

È un peccato che MODE_MARGINREQUIRED sia stato perso, però. Forse gli sviluppatori ripristineranno questo parametro per ridurre il numero di calcoli.

 
Interesting:
stringo:
I nomi brevi sono sempre stati usati solo per la visualizzazione nella sottofinestra dell'indicatore
Quindi non viene visualizzato lì, o è un errore o non capisco qualcosa...
Trovato l'errore e risolto, il 16051 può essere chiuso.
 

Non so se sto mettendo le mie segnalazioni di bug nel posto giusto. Se non è così, per favore correggetemi.

Quando ho testato il mio EA, ho creato appositamente una situazione del genere per vedere se il tester determina correttamente il margine. Quindi, il deposito di 100 dollari. Facciamo trading su EURUSD. La dimensione minima del lotto è 0,1. Il seguente codice per il calcolo dei lotti si trova nell'Expert Advisor

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);

Il tester genera questi errori

2010.06.08 22:28:57 Core 1 no enough money [instant buy 0.10 EURUSD at 1.19242]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.24, NewFreeMargin: -19.24
2010.06.08 22:28:57 Core 1 1000 100
2010.06.08 22:28:57 Core 1 no enough money [instant buy 0.10 EURUSD at 1.19180]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.18, NewFreeMargin: -19.18
2010.06.08 22:28:57 Core 1 1000 100
2010.06.08 22:28:57 Core 1 no enough money [instant buy 0.10 EURUSD at 1.19362]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.36, NewFreeMargin: -19.36
2010.06.08 22:28:57 Core 1 1000 100

A giudicare da questi messaggi, il margine libero necessario per comprare 1 lotto, LotRqdMgn, è uguale a 1000, il che sembra essere corretto. FreeMargin=100. Moltiplica 0,1 lotto per 1000 e ottieni 100. Significa che abbiamo abbastanza fondi per aprire il 1° lotto. Ma il tester riferisce che non abbiamo abbastanza fondi. Dov'è l'errore?

 
gpwr:

Sulla base di questi messaggi, il margine libero richiesto per comprare 1 lotto, LotRqdMgn, è 1000, che sembra corretto. FreeMargin=100. Moltiplica 0,1 lotto per 1000 e ottieni 100. Significa che abbiamo abbastanza fondi per aprire il 1° lotto. Ma il tester riferisce che non abbiamo abbastanza fondi. Dov'è l'errore?

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

Ecco perché non si può fare una transazione - tutto è corretto.

 
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é non è possibile fare una transazione - tutto è corretto.

Grazie Renat. Ho capito il mio errore. Ho cambiato la formula per il calcolo di LotRqdMgn e ora tutto funziona correttamente.

 

Una nuova parola in biblioteconomia, o l'incredibile accanto ad essa...


Allora, ho creato un Expert Advisor che usa la libreria, l'ho controllato e tutto funziona. Ho fatto un archivio con l'Expert Advisor, questa libreria e alcuni file MQL5 e MQH. Ho dato l'archivio all'applicatore/sviluppatore per i test.


Questo andrebbe bene, ma ho deciso di eseguire i test su un altro terminale. Così ho spacchettato l'archivio e ho deciso di allegare l'Expert Advisor al grafico.


E nel diario terminale sono scritte queste due righe:

2010.06.10 09:54:51 PM Esperti MechanicalTrading-Infinity-2010 (EURUSD,Daily)
2010.06.10 09:54:51 Esperti Caricamento di MechanicalTrading-Infinity-2010 (EURUSD,Daily) fallito


Ho iniziato a cercare cosa e come funziona (o meglio, non funziona) e ho trovato un fatto sorprendente - Terminal vede la libreria compilata nella directory (come *.ex5), ma persistentemente la "affonda", il che non è molto buono, come si capisce...

Dopo aver provato molte possibili ragioni per tale comportamento, ho deciso di mettere il file originale (come *.mq5) nella cartella con la libreria. Ho provato ad aggiungere un EA al grafico - oh mio Dio, tutto funziona.


Nel corso del gioco, sono sorte diverse domande:

1. Perché l'Expert Advisor non funziona se la libreria è rappresentata solo come .ex5?

2. Perché il terminale si ostina a cancellare questo file dalla directory?

3. Perché il log del terminale non ha un commento chiaro su tutto questo?

4. Perché la documentazione non dice che questo comportamento è possibile?


E infine la quinta e ultima domanda - come faccio ad affrontare tutto questo e cosa sto facendo di sbagliato (forse il terminale manca un file EX5 e cerca qualcosa, per esempio un file header o la libreria stessa)?


PS

A proposito, ho lo stesso bug con Expert Advisors, cancellazione ostinata del file *.ex5... :(

Motivazione: