Errore numero 6 - pagina 5

 
Ora ho guardato attraverso il terminale - ho avuto alcuni problemi ieri. <br / translate="no">.
2005.08.11 11:15:00 ****l EURUSD,H1: OrderSend failed with error #139
2005.08.11 11:07:12 TradeDispatcher: tutti i contesti commerciali sono occupati

Ho scollegato questa EA e vedrò cosa succede dopo.


Ecco qui. Questo è quanto. Ecco qui. 139 è bloccato. Da chi, perché - non è chiaro. Poi ci saranno 2, 6, e così via.

La cosa più deludente è che non c'è nulla in questo EA che lo distingua dagli altri. Quindi, o non riesco a vedere questo "qualcosa", o qualsiasi Expert Advisor può essere glitchato, semplicemente potrebbe non attivarsi ogni ora e, quindi, non tutti lo hanno notato.

Di conseguenza, la mia domanda a tutti: avete queste voci nei vostri registri?

Rosh, usi Alpari? Se è così, una domanda per Alpari - il vostro server funziona correttamente?

Cosa ho scoperto stasera :(

1. L'Expert Advisor funziona da solo, UNO, e o non dà errori o li dà così raramente che la notte non è sufficiente per questo.

2. In combinazione con diversi altri Expert Advisors (più precisamente, con uno, per sei valute), l'errore è stato riprodotto, anche se non in un'ora, ma in 4 ore.

Cosa ne consegue?
1. C'è qualche bug in MT (o nel mio Expert Advisor, ma è così semplice che è improbabile), che a volte non mi permette di aprire trade. E chiudeteli pure, a proposito.
Naturalmente, si può bypassare:

while(nResult == -1) { nResult = OrderSend(...); }



Non c'è bisogno di dirvi che questo è uno stile di programmazione MOLTO cattivo e può offendere il broker...

2. Ora ho riscritto l'Expert Advisor per renderlo più semplice, ma allo stesso tempo causando un errore. Lo posterò nelle prossime ore. Se sembra che l'errore richiederà due Expert Advisors, cosa posso fare, ne posterò due :)






 
2. Attualmente sto riscrivendo l'Expert Advisor per renderlo più semplice, e allo stesso tempo per causare un errore. Lo posterò nelle prossime ore. Se si scopre che l'errore richiede due Expert Advisors, cosa si può fare, ne posterò due :)<br / translate="no">

e controlleremo
 
Quark, ho fatto una diagnosi: è colpa della tua EA. Non appena Alert esce dal tuo EA (non li uso affatto) - ottengo immediatamente
2005.08.11 13:01:19 TradeDispatcher: tutti i contesti commerciali sono occupati


I tempi di allerta e di blocco sono gli stessi. Non ho guardato affatto il codice EA.

 
Bene. Ecco il nuovo superesperto, che sta producendo errori da solo. Finora non sono andato oltre l'errore 139, quindi continuerò a testare.

Come usarlo: per ogni valuta (EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD) apri un grafico orario.
Ogni grafico ha un Expert Advisor. Non interagiscono, perché hanno tutti grafici diversi.

Le posizioni saranno aperte subito, una per grafico. All'inizio dell'ora successiva, le posizioni dovranno essere invertite, e così via.

Ho avuto 2 errori alla volta, quindi in linea di principio è possibile dover aspettare 2 ore.

Se avete una relazione speciale con il server di trading, è probabilmente meglio usare un account regolare per il test. Io uso Alpari.

Notate anche (presumo che questo sia un bug indipendente) la posizione delle frecce di apertura della posizione. In teoria, poiché la posizione si apre su una nuova barra, la freccia dovrebbe essere sulla stessa barra.

Infine, se non volete aspettare un'ora, aprite i grafici a minuti. L'errore è riproducibile.

Ancora una volta, stiamo parlando dell'errore 139. Allo stesso tempo, non sono ancora riuscito ad ottenere l'errore 2 e 6 con questo metodo. E lo sono stati per lo più in passato. Quindi immagino che ci saranno altri post.

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;

//////////////////
int init ()
{
	timePrev = 0;

	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
		nMagic = 2;
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
		nMagic = 5;
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
		nMagic = 7;
	else if(Symbol() == "AUDUSD")
		nMagic = 8;
	else if(Symbol() == "EURGBP")
		nMagic = 9;
	else if(Symbol() == "USDCAD")
		nMagic = 10;
	else if(Symbol() == "EURCHF")
		nMagic = 11;
	else if(Symbol() == "EURAUD")
		nMagic = 12;

	return(0);	
}

// ------

int deinit()
{
	return(0);
}
// ------
int start()
{
	if(Bars < 5)
		return(0);
	
	// The previous bar just closed
	bool bIsBarEnd = false;
	if(timePrev != Time[0]) 
		bIsBarEnd = true;
	timePrev = Time[0];
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	int nSignal = GetSignal();

	if(nSignal == OP_BUY) 
		Buy();
	else if(nSignal == OP_SELL) 
		Sell();

	for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);

		if(OrderMagicNumber() == nMagic)
		{
			if(CurTime() - OrderOpenTime() > (nHoursToHold - 1) * 60 * 60)
			{
				if(OrderType() == OP_BUY)
					OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
				else if(OrderType() == OP_SELL)
					OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
			}
		}
	}

	return(0);
}
// ------

void Sell()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, 
		0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(nError);
	}
}
// ------
void Buy()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, 
		0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(nError);
	}
}
// ------

double GetLotSize()
{
	double dLot = 0.1;
	
	return(dLot);
}

// ------

int GetSignal()
{
	int nSignal;
	if(MathMod(Hour(), 2) == 0)
		nSignal = OP_BUY;
	else
		nSignal = OP_SELL;
		
	return(nSignal);
}

// ------
 
Quark, ho fatto una diagnosi: è colpa della tua EA. Non appena Alert esce dal tuo EA (non li uso affatto) - ottengo <br/ translate="no">
2005.08.11 13:01:19 TradeDispatcher: tutto il contesto commerciale è occupato


I tempi di allerta e di blocco sono gli stessi. Non ho guardato affatto il codice EA.



Questo andrebbe bene, ma ho introdotto gli avvisi dopo aver notato che i trade non vengono eseguiti. Inoltre, l'avviso è nel codice subito dopo OrderSend.

Ora proverò a passare a Print, ma ne dubito...
 
A proposito, questo è interessante. Quando ricompilo un EA, la variabile che uso per calcolare bIsBarEnd viene resettata. Di conseguenza, se premo F5 nell'editor, tutti gli EA dovrebbero chiudere le vecchie posizioni e aprirne di nuove. Ho premuto F5. Ci sono 12 valute (e Expert Advisors). Ci sono 3 aggiornamenti. Hm?

Metti Print invece di Alert per verificare l'ipotesi di Rosh. Ahimè, tutta la differenza è che ora il messaggio di errore 139 appare nel log e non sullo schermo.
 
Non lo so, ho guardato il codice; non c'è nulla da trovare di sbagliato. Io userei Bars per decidere questo posto, non il tempo di apertura.
	Il bool bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd = true; timePrev = Time[0];



E la cosa non è chiara:
2005.08.11 13:08:12 '18708' : chiudi ordine #680413 compra 0.10 EURUSD a 1.2385 sl: 0.0000 tp: 0.0000 al prezzo 1.2408
e poi

2005.08.11 13:08:13 '18708': ordine #680413 compra 0.10 EURUSD a 1.2385 sl: 1.2275 tp: 0.0000 chiuso al prezzo 1.2408

In altre parole, all'inizio l'ordine va senza alcuno stop e takeprofit, e poi improvvisamente uno stop loss appare nell'ordine

 
Non lo so, ho guardato il codice; non c'è nulla da trovare di sbagliato. Deciderei su questo posto attraverso le barre, non dal tempo di apertura<br / translate="no">
bool bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd = true; timePrev = Time[0]
;



E la cosa non è chiara:
2005.08.11 13:08:12 '18708' : chiudi ordine #680413 compra 0.10 EURUSD a 1.2385 sl: 0.0000 tp: 0.0000 al prezzo 1.2408
e poi

2005.08.11 13:08:13 '18708': ordine #680413 compra 0.10 EURUSD a 1.2385 sl: 1.2275 tp: 0.0000 chiuso al prezzo 1.2408

In altre parole, all'inizio l'ordine va senza alcuno stop e takeprofit, e poi improvvisamente uno stop loss appare nell'ordine



Se hai un pezzo di codice testato, mi piacerebbe vedere "via Bars" :)

Per quanto riguarda lo zero stop - l'ho assegnato in init, e non lo cambio da nessun'altra parte. Un insetto, credo. Amico, da quando ho abbandonato il C++ non pensavo di dover fare ancora entomologia.

In effetti, bene un esperto, va bene. Ma è così semplice che sorge una domanda: non c'è il pericolo che altri EA si comportino allo stesso modo? Considerando che il bug appare solo quando ci sono molti Expert Advisors, e produce diversi errori.

Per esempio, ho un Expert Advisor che usa MACD + ADX + Stocastico. Dopo averlo testato nel tester (dove non ci sono errori del server per definizione), il programmatore si siederà semplicemente a controllare la domanda "tutte le condizioni sono soddisfatte qui ma il trade non è chiuso"? Probabilmente non lo farà... Bug pericoloso.
 
<br / translate="no">
Se hai un pezzo di codice testato, mi piacerebbe vedere "via Bars" :)



Per esempio, così:
int start() { int total,ticket,totalExpert; //---- SetTrace(); if (Bars>b) { b=Bars;
 
Non male, ma essenzialmente la stessa cosa :)
Cos'è SetTrace?