Errore numero 6 - pagina 8

 
l'autopsia ha rivelato l'uso scorretto del codice di errore 139. infatti è "trade context is busy", per il quale non esiste un codice speciale per qualche motivo. un problema simile è stato discusso oggi nel forum inglese "Trade Dispatcher: all trade context is busy".
c'è solo un contesto di trading per tutti gli EA. la soluzione corretta è quella di costruire il proprio sistema di semafori sulle variabili globali.
Ho eseguito 4 EAs su 4 minuti. in 10 minuti l'errore 139 si è verificato 7 volte
 
l'autopsia ha rivelato un uso scorretto del codice di errore 139. infatti è "trade context is busy", per il quale non esiste un codice speciale per qualche motivo. un problema simile è stato discusso oggi sul forum inglese "Trade Dispatcher: all trade context is busy"
c'è solo un contesto di trading per tutti gli EA. la soluzione corretta è quella di costruire il proprio sistema di semafori su variabili globali.
Ho eseguito 4 EAs su 4 min. in 10 min. 7 volte errore 139


Potreste dirmi, almeno in termini generali, quale dovrebbe essere questo sistema di semafori?
1. In particolare, come dovrebbe essere fatto uno scambio per non interferire con gli altri.
2. Scivolamenti, controlli, timeout (che sono stati promessi essere assenti in MT multithreaded, ma andiamo)

E infine. Non prenderlo come un rimprovero. Hai un libro di testo. In esso l'esperto è dato. Mostrami quei semafori lì.

Ecco il mio esperto. Semplice come i pantaloni per un rublo e venti. Cambia una posizione ogni ora. Se ti importa davvero dei trader e dei profitti dei broker (non so la gente, ma io voglio prima ottenere un EA stabile e funzionante, e poi passare dalla demo alla reale), allora per favore, sull'esempio di questo mio EA, mostrami come dovrei farlo bene.

Sinceramente,
Quark

P.S. La questione dell'origine degli errori 2, 6, 138 e 4109, che a volte appaiono, rimane aperta.
 
<br / translate="no"> discusso un problema simile oggi sul forum inglese "Trade Dispatcher: tutto il contesto commerciale è occupato"


Ho letto il thread sulla lingua inglese. Già... Questi ragazzi devono imparare urgentemente il russo.
Non è simile, è lo stesso problema. È vero, non hanno ancora gli errori 2, 6, 138 e 4109. Parlavano solo di 139.

Non vedo il senso di IsTradeAllowed, ad essere onesti. Slava stesso ha spiegato come dieci Expert Advisors sono autorizzati ad usare questa funzione e poi improvvisamente iniziano a fare trading e tutti tranne il primo rimangono delusi.

Sarebbe molto meglio mettere in coda le richieste dove si accumulano, vivono per un po' di tempo e vengono eseguite o cancellate. Ma tutto questo è un sogno.

Piuttosto, dovremmo creare una variabile globale nTrading, per esempio, e memorizzare lì il nome dell'Expert Advisor. E cosa dovrebbero fare gli altri EA? Torna a MT3 con i suoi ordini pendenti O ci sono altre idee?

A proposito, possiamo fare a meno della variabile globale, qualcosa come

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



dove Buy() e Sell() restituiscono OP_BUY / OP_SELL in caso di fallimento e -1 in caso di successo.

Gli svantaggi sono ovvi - il broker riceverà dieci ordini da aprire (chiudere) invece di uno. Se è automatico, tutto va bene. Se è un umano - si offenderà. Peggio ancora, se l'automa e l'uomo agiscono secondo una logica diversa. Per esempio, un automa non ha una coda (come ci ha spiegato Slava, un filo, e gli ordini competono invece di formare una coda), e un umano sì. Poi il trader inizia a fare trading sul reale, e non capirà nemmeno perché, perché gli è stato assicurato (a me - al seminario-presentazione in Alpari) che non c'è differenza tra demo e reale.

La seconda opzione - ad ogni esperto e valuta viene assegnato il proprio Mn, in modo che la combinazione Expert Advisor + valuta sia unica. Poi scriviamo il codice in modo tale che l'EA con IM1 negozierà nel primo secondo, con IM7 - nel settimo secondo, ecc. dopo l'apertura della barra. Questo darà al sistema un secondo per scambiare.

Domanda a Slava - è sufficiente un secondo per evitare il problema?

Gli svantaggi sono ovvi, gli scalper - pipser ve ne parleranno :)

Cari sviluppatori (e tutti quanti). Grazie per i chiarimenti. Ci sono ancora alcune domande senza risposta in questo e nei post precedenti. In attesa di una risposta.

Quark




 
E un'altra domanda. La situazione in discussione si riferisce agli ordini di arresto? Gli esperti competono per la loro esecuzione?
 
//+------------------------------------------------------------------+
//|                                                    TestQuark.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;
string SemaphoreName="TradeSemaphore";

//////////////////
int init ()
{
   if(!GlobalVariableCheck(SemaphoreName)) GlobalVariableSet(SemaphoreName,0.0);
	
	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] + nMagic) 
		bIsBarEnd = true;
	timePrev = Time[0] + nMagic;
	
	if(!bIsBarEnd)
		return(0);

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

	bool bSemaphored=false;
   while(!IsStopped())
     {
      if(GlobalVariableGet(SemaphoreName)==0.0)
        {
         GlobalVariableSet(SemaphoreName,1.0);
         bSemaphored=true;
         break;
        }
      Sleep(1000);
     }

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

	if(bSemaphored) GlobalVariableSet(SemaphoreName,0.0);	

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

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

//+------------------------------------------------------------------+


se fare una funzione per impostare il valore di una variabile globale a condizione che questa variabile abbia un certo valore, in modo che non ci sia un costrutto

      if(GlobalVariableGet(SemaphoreName)==0.0) { GlobalVariableSet(SemaphoreName,1.0); bSemaphored=true; break; }


allora sarà affidabile al 100%
qualcosa come

      if(GlobalVariableSetOnCondition(SemaphoreName,1.0,0)==true) { bSemaphored=true; break; }




 
E un'altra domanda. La situazione in discussione si riferisce agli ordini di arresto? Gli Expert Advisors competono per la loro esecuzione?

No. Gli arresti vengono eseguiti sul server.
 
Piuttosto, dovremmo fare una variabile globale nTrading, per esempio, e scriverci il nome dell'Expert Advisor attualmente in commercio. E cosa dovrebbero fare gli altri EA? Torna a MT3 con i suoi ordini pendenti o ci sono altre idee?
Per me personalmente c'è una pausa obbligatoria tra i trade (regolabile, ora è di 30 sec). Non è certo un ostacolo per un trading redditizio, ma protegge da situazioni simili. È implementato attraverso una variabile globale. Semaforo e pausa - 2 in uno =)

E riguardo alla coda - ho avuto un'idea per fare un EA che esegue gli ordini scritti in un file. E tutti gli altri esperti scrivono semplicemente gli ordini in questo file.
Ma non è molto facile per me (nel senso di implementazione competente)... Ma è possibile provare. Per sforzo comune =))
 
Grazie :)

Questo è il passaggio che non ho capito:

<br/ translate="no"> se fare una funzione per impostare il valore di una variabile globale a condizione che ci sia un certo valore in quella variabile, quindi non c'è nessun costrutto

if(GlobalVariableGet(SemaphoreName)==0.0)
{
GlobalVariableSet(SemaphoreName,1.0);
bSemaphored=true;
break;
}


Ora la logica di questo caso. Scusa se ti tormento, ma...

Se ho capito bene, siamo seduti in un ciclo while finché non riusciamo a impostare il semaforo. Giusto? Poi scambiamo, sapendo che nessuno scambia tranne noi. Poi restituiamo il semaforo al suo stato originale.

Domanda: come funziona while(!IsStopped())? ? Pensavo fosse un controllo per Permettere il Live Trading.

Domanda: questi while e sleep non causeranno dei lag nel sistema?

Domanda: Sleep e semaforo saranno processati correttamente in modalità test?

Ancora un po' di logica. Tra l'impostazione e la rimozione del semaforo abbiamo due (massimo) possibilità di gestire gli ordini. Prima Buy() o Sell() e poi, sotto, CloseOrder(). Queste due "attività" non saranno in concorrenza tra loro, anche se all'interno dell'EA, come se ci fossero due Expert Advisors? O il processo è garantito essere lineare e non raggiungerà CloseOrder() fino al ritorno di Buy()?

Grazie in anticipo.
Quark
 
И еще один вопрос. Относится ли обсуждаемая ситуация к стоп ордерам? Конкурируют ли эксперты за их исполнение?

No. Gli stop sono gestiti sul server. e nel nostro caso c'è concorrenza per il flusso di trading esperto del cliente


Mi sono espresso male. Se OrderSend(OP_BUYSTOP... anche circondarlo con del codice che imposta e rimuove i semafori? Domanda sciocca. Certo, dovresti.
 
Ho allegato l'Expert Advisor, postato nel 1° post della 4° pagina, all'eur - m15.
Rielaborato le funzioni commerciali (inserito nella mia libreria) e collegato ad un altro euram - m15. Meijic, naturalmente, è stato cambiato.

Ti dirò cosa ho più tardi in serata ;)