Errore numero 6 - pagina 9

 
Slava, ho messo la tua versione expert, per 12 finestre (12 valute). Ci sono meno errori, ma ci sono. Mi dispiace. Sono riuscito a ottenere 138 e 1. Provate voi stessi.

Spero in un'ulteriore guida.

Quark
 
A proposito, il codice
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) { GlobalVariableSet(strTradeSemaphore, 1.0); bSemaphored = true; break; } Sleep(1000); }



ammette che tra (GlobalVariableGet(strTradeSemaphore) == 0,0) e GlobalVariableSet(strTradeSemaphore, 1,0); un altro EA si inserisce. Abbiamo bisogno di una funzione che catturi e inibisca il thread di esecuzione (cioè aspetti la risorsa) e poi restituisca il controllo all'Expert Advisor. Qualcosa come WaitForExclusive()

. Anche se forse non è questo il punto. Ma gli errori continuano a comparire, ahimè.

 
Così va meglio. Ma sono apparsi errori che prima non c'erano, come l'errore 1.
Spero di ricevere aiuto.

A proposito, ora che questa conversazione è iniziata, come posso determinare automaticamente quante cifre lasciare per il prezzo usando NormalizeDouble, cioè 4 per EURUSD, 2 per EURJPY... ♪

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits = 4;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	if(!GlobalVariableCheck(strTradeSemaphore)) 
		GlobalVariableSet(strTradeSemaphore, 0.0);
	
	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
	{
		nMagic = 2;
		nDigits = 2;
	}
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
	{
		nMagic = 5;
		nDigits = 2;
	}
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
	{
		nMagic = 7;
		nDigits = 2;
	}
	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;
	
	if(!bIsBarEnd)
		return(0);

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

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

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

	GlobalVariableSet(strTradeSemaphore, 0.0);	

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

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

	dLotSize = GetLotSize();

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

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", sell: " + NormalizeDouble(Bid, nDigits) + ", Stop: " + 
			NormalizeDouble(Bid + dStopLoss, nDigits) + ", error: " + nError);
	}
}

// ------

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

	dLotSize = GetLotSize();

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

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", buy: " + NormalizeDouble(Ask, nDigits) + 
			", Stop: " + NormalizeDouble(Ask - dStopLoss, nDigits) + ", 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 a volte appare (faccio girare 12 coppie a minuti, quindi non ci vuole molto per avere un errore), e anche l'errore 129 a un prezzo perfettamente normale.
 
Quindi. Errore 1. Tradotto vagamente dall'helpdesk "qualcosa non va". 12 coppie di valute al minuto, errore circa una volta ogni 5-10 minuti.

Errore 138. Più volte al minuto (cioè lo generano diversi dei 12 Expert Advisors).

Errore 129. Stavo razionando i prezzi e facendo un sacco di altre cose...
 
Infatti, ora che ne stiamo parlando, come si fa a determinare automaticamente quante cifre lasciare per il prezzo con NormalizeDouble, cioè 4 per EURUSD, 2 per EURJPY...? ?
	int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




e il vostro Expert Advisor con il mio 5 mi ha dato un errore - 6.
il mio Expert Advisor non funziona nella mia correzione - hanno fatto un casino in questa build =)
oh sì... anche il mio 5 non funziona =)))) oh amico...

 
стати, раз уж этот разговор возник, как автоматически определить, сколько знаков оставлять для цены при помощи NormalizeDouble, то есть, 4 для EURUSD, 2 для EURJPY... ?
	int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




e il vostro Expert Advisor con il mio 5 ha dato un errore - 6.
il mio Expert Advisor non funziona nella mia correzione - hanno fatto un casino in questa build =)
oh sì... anche il mio 5 non funziona =)))) oh amico...



Grazie per il codice, mi ci sarebbe voluto molto tempo per trovarlo da solo.
L'esperto suggerito da Slava e migliorato :) da me è dato qui sotto. Puoi farlo funzionare come me - in 12 finestre, con 12 valute. Funziona per qualsiasi periodo di tempo, ma è più veloce sui minuti). Continuo a ricevere errori, dannazione. Vorrei sapere perché.

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 50;

double dLotSize = 0.1;

int nMagic = 0;
int nDigits;

string strTradeSemaphore = "TradeSemaphore";

//////////////////
int init ()
{
	if(!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;
	
	if(!bIsBarEnd)
		return(0);

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

	Sleep(500);

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

	Sleep(500);
	
	GlobalVariableSet(strTradeSemaphore, 0.0);	
	
	return(0);
}
// ------

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

	dLotSize = GetLotSize();

	double dNormalizer = MathPow(10, nDigits);
	double dBid = MathFloor(Bid * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = 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 = MathFloor(Ask * dNormalizer) / dNormalizer; //NormalizeDouble(Bid, nDigits);
	double dStop = 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);
}


 
A proposito, il codice [skipped]<br/ translate="no"> permette ad un altro EA di tagliare tra if(GlobalVariableGet(strTradeSemaphore) == 0.0) e GlobalVariableSet(strTradeSemaphore, 1.0);. Abbiamo bisogno di una funzione che catturi e inibisca il thread di esecuzione (cioè aspetti la risorsa) e poi restituisca il controllo all'Expert Advisor. Qualcosa come WaitForExclusive()

. Anche se forse non è questo il punto. Ma ahimè, gli errori continuano ad apparire.

Questo è esattamente ciò che intendevo con l'ipotetica funzione GlobalVariableSetOnCondition, che potrebbe impostare la variabile globale come primo parametro, a condizione che il suo valore sia uguale al valore del secondo parametro. poiché l'accesso alle variabili globali è bloccato, darà "atomicità"

ora sulla funzione IsStopped. controlla il flag Stop, in modo che l'EA possa normalmente fermarsi (ha 2,5 secondi per questo). si raccomanda di utilizzare questa funzione come una delle condizioni del ciclo, specialmente per il ciclo infinito
 
<br / translate="no"> ecco perché stavo parlando di un'ipotetica funzione GlobalVariableSetOnCondition, che potrebbe impostare una variabile globale dal primo parametro, purché il suo valore sia uguale al valore del secondo parametro. poiché l'accesso alle variabili globali è bloccato, questo darebbe "atomicità"


Slava, per quanto mi riguarda, non capisco questo testo. Per favore, spiegatelo in altre parole o mostratemi cosa intendete. Se puoi.

A proposito, cosa c'è di sbagliato nel codice che ho riscritto? Cioè, è chiaro che qualcosa non va perché non funziona, ma non vedo l'errore. Secondo il mio intuito, questo è ciò che avrebbe dovuto fornire un accesso esclusivo...

while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0,0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }
 

именно так. я поэтому и говорил про гипотетическую функцию GlobalVariableSetOnCondition, которая могла бы устанавливать глобальную переменную первым параметром при условии, что значение её равно значению второго параметра. так как доступ к глобальным переменным блокируется, то это даст "атомарность"


Slava, per quanto mi riguarda, non capisco questo testo. O lo spieghi in altre parole, o mi mostri cosa intendi. Se puoi.

Stiamo parlando di prevenire la possibilità di incuneamento tra le chiamate delle funzioni GlobalVariableGet e GlobalVariableSet. l'incuneamento da parte di un altro Expert Advisor è reale poiché gli errori sono ancora osservati. ecco perché sto parlando di accesso atomico. stiamo parlando di risolvere uno e lo stesso problema ma con parole diverse
.

A proposito, cosa c'è di sbagliato nel pezzo di codice che ho rielaborato? Cioè, è chiaro che c'è qualcosa che non va perché non funziona, ma non vedo l'errore. Secondo il mio intuito, questo è ciò che avrebbe dovuto fornire un accesso esclusivo...

while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0,0) GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; Sleep(1000); }



Il tuo esempio è migliore
Motivazione: