Caratteristiche utili da KimIV - pagina 85

 

Di conseguenza, un conteggio di posizione personalizzato è stato aggiunto al blocco di chiusura, che ha portato a una chiusura "corretta", ma l'errore 131 compare ancora un paio di volte nel log:

È normale un tale inserimento di un conteggio di ordini in un ciclo, considerando che c'è già un controllo di ordini e

Potresti correggere il codice per evitare l'errore 131?

Grazie mille.

File:
codz2.mq4  5 kb
 
hope писал(а) >>

Potresti modificare il codice per evitare l'errore 131?

Grazie mille.

E chi normalizzerà la dimensione del lotto per voi dopo la divisione? Da qui l'errore.

 

Alex, prima di passare il lotto alla funzione di chiusura, normalizza la sua dimensione con NormalizeLot().

 

Grazie Igor, Alexander,

Infatti, ho controllato i lotti sostituendo Lot/3 (Lot/2, Lot) con 0,01 nella funzione SELLCLOSED_1=OrderClose( OrderTicket(), Lot/3, Ask, 0, Red ); e ho evitato l'errore 131. Potremmo lasciarlo così (0,01), ma, prima, chiudere nella forma Lot è più corretto. In secondo luogo, non avevo mai incontrato prima le funzioni utente e la loro chiamata nel programma, il che si è rivelato piuttosto interessante. Mi sembra di aver attaccato tutto correttamente nel codice e tutto funziona, ma l'errore 131 rimane ancora. Date un'occhiata al codice, per favore. Forse ho sbagliato qualcosa nella funzione di chiamata NormalizeLot.

File:
cod3.mq4  6 kb
 

Scuse. Nel codice originale, la linea

RefreshRates();
BUYCLOSED_1=OrderClose( OrderTicket(), CloseLot, Bid, 0, Red );

è il LotClose corretto, come da condizione.

Lot =OrderLots(); // NUMERO DI LOTTI
LotClose =NormalizeLot(Lot); // il valore del lotto normalizzato viene assegnato al lotto chiuso

sbagliato quando si posta........

 
hope писал(а) >>

Date un'occhiata al codice, per favore. Forse hai sbagliato qualcosa nella funzione di chiamata NormalizeLot.

Prova a sostituire

  if ( ro) l=MathCeil( lo* k)/ k; else l=MathFloor( lo* k)/ k;

a

  if ( ro) l=NormalizeDouble(MathCeil( lo* k)/ k,2); else l=NormalizeDouble(MathFloor( lo* k)/ k,2);
 

Buongiorno Alexander,

Sfortunatamente, il tuo consiglio non ha aiutato. Ho analizzato il log e ho scoperto che l'errore si verifica in due casi, quando la chiusura di una parte di un lotto, quasi coincide con la chiusura di un'altra parte del lotto.

Nel caso in cui non ci sia coincidenza di tempo, allora una parte del lotto viene chiusa senza errore.

Ho provato a normalizzare separatamente i lotti per l'acquisto in chiusura e i lotti per la vendita in chiusura, ma senza successo:

doppio
Lotto, // Numero di lotti nell'ordine selezionato
LotCloseBuy,
LotCloseSell,

............................

Lotto =OrderLots();
LotCloseBuy =NormalizeLot(Lot);

LotCloseSell =NormalizeLot(Lot);

............................

BUYCLOSED_3=OrderClose( OrderTicket(), LotCloseBuy, Bid, 0, Red )

...........................

SELLCLOSED_3=OrderClose( OrderTicket(), LotCloseSell, Ask, 0, Red );

...................

La funzione di Igor

NormalizeLot.........

Hai qualche idea?

 

Sono una pecora! Ugh - è disgustoso....

Normalizzati i lotti nel ciclo dell'ordine

//--------------------------------------------------------------- 4 --
// Conteggio degli ordini
Symb=Symbol(); // Nome dello strumento finanziario.
BuyTotal=0; // Numero di ordini Buy
SellTotal=0; // Numero di ordini Sell
for(int i=1; i<=OrdersTotal(); i++) // Order loop
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Se segue
{ // Analisi degli ordini:
if (OrderSymbol()!=Symb)continue; // Non è il nostro strumento finanziario
if (OrderType()>1) // Pending
{
Alert(" Pending order detected. Expert Advisor not working.");
return; // Exit start()
}
if (OrderType()==OP_BUY)
{
BuyTotal++; // Contatore ordini di acquisto
BuyOrdOpPrice=OrderOpenPrice(); // Prezzo di acquisto aperto
}
if (OrderType()==OP_SELL)
{
SellTotal++; // Contatore ordini di vendita
SellOrdOpPrice=OrderOpenPrice(); // Prezzo di vendita aperto
}
Ticket=OrderTicket(); // Numero ordine selezionato.
Tip =OrderType(); // Tipo di ordine selezionato.
Lotto =OrderLots();

LotCloseBuy =NormalizeLot(Lot);

LotCloseSell =NormalizeLot(Lot);
}
}

.... e ho creato un ciclo separato per contabilizzare gli ordini aperti, dove ho dovuto normalizzare i lotti per chiuderli!!!

//--------------------------------------------------------------- 6 --

// Controllo degli ordini aperti
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
int z;


//---- passare attraverso tutte le posizioni aperte
for ( z = _OrdersTotal-1 ; z >=0; z -- )
{
//Il ciclo per - passare attraverso tutti gli ordini aperti
//---- se si verifica un errore durante la selezione della posizione, procedere al prossimo
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError();
Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
//Finito
//Binding to Currency e Majik
//---- se la posizione è aperta non per lo strumento corrente, saltala
if ( OrderSymbol() != Symbol() ) continue; // ERROR
//Finito

//---- se MagicNumber non è uguale a Expert_ID, salta questa posizione
if ( OrderMagicNumber() != Expert_ID ) continue; // ERROR
//Finished
if (OrderType()==OP_BUY)
{
BuyClot=OrderLots();
}
if (OrderType()==OP_SELL)
{
SellClLot=OrderLots();
}
OpenedLots=OrderLots();
LotCloseBuy =NormalizeLot(OpenedLots); // Numero di lotti
LotCloseSell =NormalizeLot(OpenedLots); // Numero di lotti

//Controlla se è stata aperta una posizione Buy,

........................................

Grazie Igor, Alexander. Senza la funzione di normalizzazione dei lotti, sarebbe ancora in un deadlock....

 

Buona sera,

E il primo errore che si verifica:

2009.07.08 21:05:45 TestGenerator: unmatched data error (volume limit 651 at 2009.07.08 19:00 exceeded)
è critico o è solo un errore del tester?

Grazie.

 
Igor - per favore guarda il 'GAP Indicator' qui