Errore numero 6 - pagina 10

 
[citazione
Il tuo esempio è migliore.
[/quote]

Questo esempio non funziona. Dà errori. Potresti, come sviluppatore più esperto, aiutare a farlo funzionare?
Con rispetto,
Quark
 
<br/ translate="no"> Domanda: come fa while(!IsStopped()) ? Non è molto chiaro dalla guida, pensavo fosse un controllo su Allow Live Trading.

questo è un controllo per vedere se vogliono chiudere l'Expert Advisor esternamente

Domanda: questi while e Sleep non rallentano il sistema?

il sistema non sarà rallentato. solo il singolo Expert Advisor

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

lo slittamento non è gestito nei test, è semplicemente saltato. è più complicato nei test. gli EA attivi reali possono competere per questo semaforo. non abbiamo affatto bisogno di semafori nei test, poiché solo un EA è testato - non possiamo organizzare test simultanei di esperti che interagiscono. per escludere la gestione del semaforo nei test, usare la funzione IsTesting

Anche per quanto riguarda la logica. Tra l'impostazione e la rimozione del semaforo abbiamo due (massimo) possibilità di gestire gli ordini. Prima Buy() o Sell() e poi, di seguito, 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 arriverà a CloseOrder() fino al ritorno di Buy()?

Queste attività non saranno in competizione l'una con l'altra poiché le operazioni di scambio sono ora sincrone, cioè l'esperto aspetta che l'operazione di scambio sia completata. "il processo è garantito essere lineare"
 
Questo esempio non funziona. Dà errori. Potresti, come sviluppatore più esperto, aiutare a farlo funzionare? <br/ translate="no">

Non lo forzerò. Aspettate un paio di giorni per la funzione GlobalVariableSetOnCondition, poi tutti i problemi di controllo degli accessi saranno risolti
 
Этот пример не работает. Дает ошибки. Не могли бы Вы, как более опытный разработчик, помочь заставить его работать?

Non lo forzerò. aspettate un paio di giorni per la funzione GlobalVariableSetOnCondition, poi tutti i problemi di delimitazione di accesso saranno risolti


Se intendi dire che hai intenzione di introdurre la funzione GlobalVariableSetOnCondition in MT, potresti dire qualche parola in anticipo al riguardo?

Compreso come proponi di usarlo in questa situazione?

Un paio di giorni - contando i fine settimana?
 
Slava, oltre agli utili consigli, per i quali ti ringrazio molto, mi è venuta un'idea :) O meglio, un suggerimento. L'ho già menzionato.

Perché non fai una coda di ordini in MT. Cioè, si può scrivere in modo asincrono una richiesta per lavorare su una posizione lì, e MT in un thread separato elaborerà quella richiesta quando c'è tempo, e con la garanzia che nessun altro ci arriverà.

Quark
 
Se intendi dire che hai intenzione di introdurre la funzione GlobalVariableSetOnCondition in MT, potresti dire qualcosa al riguardo prima? <br/ translate="no">
Compreso come proponi di usarlo in questa situazione?

Un paio di giorni - contando i fine settimana?

Ho già mostrato un esempio
if(GlobalVariableSetOnCondition(SemaphoreName, 1.0, 0.0)==true) { bSemaphored=true; break; }


se una variabile globale ha un valore di 0,0, allora impostate il valore a 1,0 e restituite true. altrimenti, non impostate nulla. controllate e cambiate il valore in una chiamata di funzione.

"un paio di giorni" - l'ho detto per sicurezza. speriamo di pubblicarlo oggi

 
Volete avere una coda di ordini in MT. Cioè, si può scrivere asincronicamente una richiesta per lavorare su una posizione lì, e MT elaborerà quella richiesta in un thread separato quando c'è tempo, e con la garanzia che nessun altro ci arriverà. <br / translate="no">.

Non faremo una coda di ordini
 
<br / translate="no"> Ho già mostrato un esempio


Solo che non ha detto cos'è :) Pensavo che la funzione fosse suggerita per scrivermi.


Ho detto "un paio di giorni" per sicurezza. Speriamo di pubblicarlo oggi.


Grazie.
 
Opzionale.

1. In questi 100 post ci sono stati diversi bug trovati mentre si lavorava sull'Expert Advisor, e non direttamente collegati ad esso. Per esempio, ho notato che gli Expert Advisors continuano a fare trading anche dopo la rimozione della casella di controllo Allow Live Trading. Spero che non vi dimenticherete di loro.

2. Qui sotto c'è di nuovo il codice del mio Expert Advisor. Genera gli errori 1, 129, 138. Potresti a) dirmi cos'è il 138(requote), perché si verifica, se è collegato ai semafori e come risolverlo? b) Perché il 129? I prezzi sono stampati insieme all'errore, sembrano essere corretti. c) Circa 1, anche.

Vi ricordo il metodo di test: finestre di 12 minuti per 12 valute.

Con rispetto,
Quark

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;
int nBars;
int nDelaySeconds = 3;

int nSlip = 50;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	nBars = Bars;

	if(!IsTesting() && !GlobalVariableCheck(strTradeSemaphore)) 
		GlobalVariableSet(strTradeSemaphore, 0.0);
	
	dStopLoss = 110 * Point;
	nHoursToHold = 1;

	nDigits = MarketInfo( Symbol(), MODE_DIGITS );
	
	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] + nMagic) 
		bIsBarEnd = true;
	timePrev = Time[0] + nMagic;
*/

	bool bIsBarEnd = false;
	if(nBars != Bars)
	{
		if(IsTesting() || (!IsTesting() && CurTime() > Time[0] + nMagic * nDelaySeconds))
		{
			bIsBarEnd = true;
			nBars = Bars;
		}
	}
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	if(!IsTesting())
	{
		while(!IsStopped())
		{
			if(GlobalVariableGet(strTradeSemaphore) == 0.0)
				GlobalVariableSet(strTradeSemaphore, nMagic);

			if(GlobalVariableGet(strTradeSemaphore) == nMagic)
				break;
		
			Sleep(1000);
		}
	}
	
	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);
			}
		}
	}

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

	if(!IsTesting())
		GlobalVariableSet(strTradeSemaphore, 0.0);	
	
	return(0);
}
// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dBid = Bid;//MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = Bid + dStopLoss;//MathFloor((Bid + dStopLoss) * dNormalizer) / dNormalizer; //NormalizeDouble(Bid + dStopLoss, nDigits);

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, dBid, 
		nSlip, dStop, 0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", sell: " + dBid + ", Stop: " + dStop + ", error: " + nError);
	}
}

// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dAsk = Ask;//MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = Ask - dStopLoss;//MathFloor((Ask - dStopLoss) * dNormalizer) / dNormalizer; //NormalizeDouble(Bid + dStopLoss, nDigits);

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, dAsk, 
		nSlip, dStop, 0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", buy: " + dAsk + 
			", Stop: " + dStop + ", error: " + 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);
}
 
L'errore 138 requote può verificarsi facilmente. potenzialmente con 10 EAs funzionanti il tempo di attesa per il rilascio del semaforo può essere di 30 secondi o più. durante questo tempo il prezzo può facilmente cambiare. in questo caso utilizzare la funzione RefreshRates e prendere un nuovo valore di bid o ask. o chiedere a MarketInfo un nuovo prezzo. 129 è lo stesso errore, prezzo sbagliato - il prezzo è andato troppo lontano e ci sono stati diversi cambiamenti di prezzo durante l'attesa. 1 - questo non è affatto un errore. appare quando si cerca di modificare un ordine con gli stessi valori che sono già stati impostati. è strano che si verifichi quando si conferma manualmente un trade sul rifiuto