エラー番号6 - ページ 9

 
Slavaさん、あなたのエキスパート版、12ウィンドウ(12通貨)用を置かせていただきました。エラーは少ないが、あるのだ。すみません。なんとか138と1が取れました。自分で試してみてください。

さらなる指導を希望する。

クオーク
 
ちなみに、コード
while(!IsStopped()) { if(GlobalVariableGet(strTradeSemaphore) == 0.0) { GlobalVariableSet(strTradeSemaphore, 1.0); bSemaphored = true; break; } Sleep(1000); }
です。



GlobalVariableGet(strTradeSemaphore) == 0.0) とGlobalVariableSet(strTradeSemaphore, 1.0) の間で、別のEAがカットインすることを認めます。実行スレッドを捕捉して抑制し(つまりリソースを待ち)、Expert Advisor に制御を戻す関数が必要です。WaitForExclusive()のようなもの . もっとも、ポイントはそこではないかもしれませんが。しかし、残念なことにエラーが出続けている。


 
そのほうがいい。しかし、エラー1のように、以前にはなかったエラーが出現しています。
何か役に立てればと思います。

ところで、この会話が始まったところで、NormalizeDoubleで 価格を何桁残すか、つまりEURUSDなら4桁、EURJPYなら2桁...と自動的に判断するにはどうしたらいいのでしょう??

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

 
138エラーは 時々出ますし(分足で12ペア動かしているので、エラーになるのに時間はかかりません)、全く正常な値段で129エラーも出ます。
 
だからエラー1ヘルプデスクから緩やかに訳すと、「何かおかしい」。分単位で12通貨ペア、5~10分に1回程度エラー。

138エラー です。1分間に数回(つまり、12個のExpert Advisorのうち数個が生成する)。

129エラーです。価格の配分をしたり、いろいろやっていたのですが......。
 
実際、NormalizeDoubleで価格を何桁残すか、つまりEURUSDなら4桁、EURJPYなら2桁...と自動的に判断するのはどうなのでしょうか??
	int _Digits = MarketInfo( Symbol(), MODE_DIGITS );




というエラーが出て、5を使ったExpert Advisorでは、6というエラーが出ました。
Expert Advisor が私の修正で動作しない。)
然う然う私の5もうまくいきません =))) さあ、どうする。

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




と、私の5を使ったExpert Advisorは、1つのエラー - 6を与えました。
Expert Advisor が私の修正で動作しない。)
然う然う私の5も動きません =))) やばいです。



コードをありがとうございます。自分で探すと時間がかかってしまうので。
Slavaが提案し、私が改良した専門家を以下に紹介します。私のように、12のウィンドウ、12の通貨で実行することができます。どの時間軸でも使えますが、分単位の方が速いです)。エラーが出続けるんだよ、クソが。 その理由がわかればいいのですが。

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


 
ちなみに、コード[skipped]<br/ translate="no"> では、if(GlobalVariableGet(strTradeSemaphore) == 0.0) と GlobalVariableSet(strTradeSemaphore, 1.0); で別のEAに切り込みを入れることができます。実行スレッドを捕捉して抑制し(つまりリソースを待ち)、Expert Advisor に制御を戻す関数が必要です。WaitForExclusive()のようなもの

. もっとも、ポイントはそこではないかもしれませんが。しかし、残念なことに、エラーが出続けている。

グローバル変数への アクセスがブロックされるため、「原子性」を与えることになる さて、関数IsStoppedについて。これは、EAが正常に停止できるように、停止フラグをチェックする(このために2.5秒ある)。この関数をループ条件の1つ、特に無限ループに使うことが推奨される。
 
<br /> そのため、私は仮説的な関数GlobalVariableSetOnConditionについて話していました。この関数は、その値が2番目のパラメータの値と等しい場合、最初のパラメータによってグローバル変数を設定できます。


スラバ、どうしてもこの文章が理解できないんだ。他の言葉で説明するか、見せてください。できれば

ところで、私が書き直したコードのどこがおかしいのでしょうか?というか、動かないから何かがおかしいのは明らかなんだけど、エラーが出ないんだよなぁ。私の勘では、これで独占的にアクセスできたはずなのですが......。

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

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


スラバ、どうしてもこの文章が理解できないんだ。他の言葉で説明するか、意味を示してください。できれば、 。

GlobalVariableGet と GlobalVariableSet関数の 呼び出しの間のウェッジングの可能性を防ぐことについて話しています。別の Expert Advisor によるウェッジングは、エラーがまだ観察されるので、現実です。これが、私が原子アクセスについて話している理由です。あなたと私は、同じ問題を解決しようとしていますが、異なる言葉で話しています。 .

ところで、私が手直ししたコードの一部には、何か問題があるのでしょうか?というか、動かないので何かがおかしいのは明らかなのですが、エラーが表示されないのです。私の勘では、これで独占的にアクセスできたはずなのですが......。

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



あなたの例の方が良い