Errore numero 6 - pagina 7

 
<br / translate="no"> Questo è il modo di vivere, e quello che stai facendo è testare la forza del ferro.


Vedi il post sulla nuova versione dell'EA. Il ferro è ora dato un secondo per ogni esperto. Non è andata meglio.
Poi, ci è stato promesso che le richieste sono in coda.
 
Naturalmente, la seconda variante è corretta, ma invece di restituire si dovrebbe usare Sleep() per 30 secondi e basta.


Ecco la variante proposta da Rosh. Gli errori rimangono.

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;
		
//	timePrev += nMagic;	// Open nMagic seconds after the new bar

	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 = OrdersTotal() - 1; nCnt >= 0; 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);
					
				Sleep(10);
			}
		}
	}

	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(Symbol() + ", " + nError);
	}

Sleep(10);
}
// ------
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(Symbol() + ", " + nError);
	}

Sleep(10);
}
// ------

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

// ------



 
Questo punto
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); else if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed)
;


qual è l'OrderType() se abbiamo chiuso l'ordine di acquisto (la prima condizione è stata soddisfatta)
Provare a eliminare il controllo nella seconda condizione, cioè lo scrivo sempre così:

se(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); se(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
 
Beh, come sempre, Rosh sembra avere ragione. Ho impostato Sleep(0), due esperti danno già errori. Ho messo Sleep(100), quattro esperti funzionano, gli errori appaiono quando si aggiunge il quinto (cinque finestre, cinque valute, un esperto per ciascuna).

Ho impostato Sleep(200) - cinque esperti vanno avanti (quasi, a volte danno ancora errori. Non sono riuscito a ottenere 5 Expert Advisors senza errori usando questo metodo).

Per ora, parlo solo degli errori 138 e 139.

Sto ancora aspettando qualche consiglio dagli sviluppatori.

Rosh, un ringraziamento speciale a te, anche se non mi piace il tuo approccio con slip.
 
Un tale momento<br / translate="no">
if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); else if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed)
;


Cos'è OrderType() se abbiamo chiuso un ordine di acquisto (la prima condizione è stata soddisfatta)
Provate a far cadere il controllo nella seconda condizione, cioè io lo scrivo sempre così:

se(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); se(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);



Sì, probabilmente. Anche se ho messo una pausa dopo questo se, ma chi li conosce, multitaskers.

Provato. Mi sento meglio, ma ho ancora degli errori :)
 
<br / translate="no">
Rosh, un ringraziamento speciale a te, anche se non mi piace il tuo approccio con lo slip.


Bene... Anche la vita non è la migliore che ho visto. A un certo punto c'è il rischio di morire. Non piace neanche a me, ma lo sviluppatore non cambia la versione. :)
 


Rosh, тебе отдельное спасибо, хотя твой подход со слипом мне не нравится.


Bene... La vita non è la cosa migliore che abbia mai visto. Esiste una cosa come morire ad un certo punto. Non piace neanche a me, ma lo sviluppatore non cambia la versione. :)


Sì, e l'API non mette fuori :)
Ma si può sempre trovare un workaround :)) Usando Sleep(), per esempio :)))

Ma in generale, questa è un'osservazione profonda. Dovresti fare domanda agli sviluppatori più spesso. Dicono che a volte rispondono :))))
 
Posso fare due chiacchiere con voi? =)))
Perché avete una tale discussione per 4 pagine, e io sono in silenzio (giorno di bevute =))...


A proposito degli errori:
Errore #6 - nessuna connessione con il server commerciale - può essere dovuto a una cattiva connessione. Ho una linea affittata Data Over Voice, e quando si alza il telefono, la velocità scende drasticamente. Quindi è proprio in questi momenti che si verifica questo errore.

Errore #139 - l'ordine è bloccato - penso che sia solo un problema tecnico: come se il terminale facesse qualcosa con questa posizione e l'EA non potesse lavorare con essa in quel momento. Non so, non riesco a trovare nessun'altra spiegazione (

Error #138 - requote - può essere causato anche dalla connessione. Guarda il carico del canale durante gli errori.

Tutto questo è pura speculazione, però. Ho chiesto agli sviluppatori per molto tempo una descrizione normale degli errori e istruzioni su come reagire - hanno detto che un giorno arriveranno ;)



Per quanto riguarda Sleep() - è sempre stupido usarlo. Ma è meglio fare una pausa tra le compravendite - usa LastTradeTime. Sto finendo (rifacendo) la libreria trade_lib&info_lib.mqh. Tutte queste domande sono risolte lì (parzialmente). Ci dovrebbero essere molti meno errori.


Questo è tutto quello che ho pensato finora, se mi viene in mente qualcos'altro - lo dirò ;)
 
<br/ translate="no"> Posso fare due chiacchiere con voi? =)))
Tu hai una discussione di quattro pagine, e io sono in silenzio (giorno di bevute =))...


Sì, ho fatto molto rumore... :)


A proposito degli errori:
Errore #6 - nessuna connessione con il server commerciale - può essere dovuto a una cattiva connessione. Ho una linea affittata Data Over Voice, e quando si alza il telefono, la velocità scende drasticamente. Quindi è proprio in questi momenti che si verifica questo errore.


Ho una linea affittata, di buona qualità. Di nuovo, una cattiva connessione non spiega perché un errore si verifica OGNI volta che diversi EAs fanno qualcosa simultaneamente. Con un canale megabit (in teoria)!


Errore #139 - l'ordine è bloccato - mi sembra che sia solo un'anomalia: come se il terminale facesse qualcosa con questa posizione e Expert Advisor non potesse lavorare con essa in quel momento. Non lo so, non riesco a trovare nessun'altra spiegazione (


D'accordo. Rimane solo un'inezia per capire DOVE lo fa. L'esperto è così semplice che semplicemente non esiste. Anche se, naturalmente, forse sono io che non riesco a vederlo. (vedi un alce? no. e io no. ma lui è ORA)


Errore #138 - requote può benissimo essere dovuto alla connessione. Controlla il carico dei collegamenti durante gli errori.


Non lo so. Se non puoi scambiare due EAs allo stesso tempo a Mosca su una linea affittata, non puoi scambiare affatto.

Stavo pensando alle requote. Per esempio, qual è lo slittamento minimo che si deve mettere per non far scappare il prezzo. 5 punti? 10? Ho impostato 15 - l'errore rimane.


Tutto questo è pura speculazione, però. Ho chiesto agli sviluppatori per molto tempo una descrizione normale degli errori e istruzioni su come reagire - hanno detto che un giorno arriveranno ;)


E dicono che il mercato è perfetto! Ha!


Per quanto riguarda Sleep() - è sempre stupido usarlo. Ma sarebbe meglio fare una pausa tra le compravendite - usare LastTradeTime. Sto finendo (rifacendo) la libreria trade_lib&info_lib.mqh - la posterò sul wiki e ti darò il link. Tutte queste domande sono risolte lì (parzialmente). Ci dovrebbero essere molti meno errori.


Ho già scritto che questi errori possono essere aggirati "direttamente" - inviando OrderSend in un ciclo, finché non restituisce un valore diverso da meno 1. Ma la questione è di principio: cosa succede? Ricevo errori di 5-6 tipi diversi alla volta. Se disegno un workaround per oggi, spunteranno domani dove non sono previsti. Se faccio trading in demo, è meglio che risolva questo problema. Avrò delle perdite più tardi.


Questo è tutto il mio pensiero per ora, se mi viene in mente qualcos'altro, ve lo dirò ;)


Grazie :)
Prova ad eseguire questo Expert Advisor sul tuo EA. Forse ti verrà qualche idea. Oppure - se fai trading su una demo - metti avvisi simili nei tuoi EAs... chissà... e se non aprono tutte le offerte?
 
Anch'io ricevo sempre errori del genere. E mi siedo anche in Alpari. Forse dovresti provare un'altra società di intermediazione? Forse non è colpa di MT?