エラー番号6 - ページ 10

 
[引用
あなたの例はもっといいものです。
[/quote]

この例ではうまくいきません。エラーが出る。もっと経験豊富な開発者の方で、うまくいくように助けていただけないでしょうか?
謹んで申し上げます。
クオーク
 
<br/ translate="no"> 質問:while(!IsStopped())はどのようにするのでしょうか??ヘルプを見てもよくわからないのですが、Allow Live Tradingにチェックが入っているのかと思いきや、

これは、Expert Advisor を外部で終了させるかどうかの確認です。

質問:これらのwhileとSleepは、システムの速度を低下させないのですか? 。

システムが遅くなることはありません。単一のExpert Advisorのみ

質問:テストモードでSleepやセマフォが正しく処理されるか? 。

実際のアクティブなEAがこのセマフォを奪い合うかもしれません。テストでは1つのEAしかテストされないので、セマフォは全く必要ありません - 相互作用するエキスパートの同時テストを組織することはできません。テストでのセマフォ処理を除外するには、関数 IsTesting を使用してください。

また、ロジックに関しても。セマフォの設定と削除の間に、命令を処理するための2つの(最大)可能性があります。まずBuy()またはSell()、そして以下、CloseOrder()となります。この2つの「活動」は、EA内部ではありますが、あたかもExpert Advisorが2つあるかのように競合しないのでしょうか?それとも、処理は線形であることが保証されており、Buy()が戻るまでCloseOrder()に到達しないのでしょうか?

トレードのオペレーションは、エキスパートがトレードのオペレーションが完了するまで待つという同期的なものになったので、これらのアクティビティが互いに競合することはありません。"プロセスは線形であることが保証されている"
 
この例ではうまくいきません。エラーが出る。もっと経験豊富な開発者の方で、うまくいくように助けていただけないでしょうか?<br/ translate="no">。

GlobalVariableSetOnCondition関数が できるまで数日待てば、アクセス制御の問題はすべて解決する。
 
Этот пример не работает. Дает ошибки. Не могли бы Вы, как более опытный разработчик, помочь заставить его работать?

GlobalVariableSetOnCondition関数を数日待てば、アクセス区切りの問題はすべて解決します。


もし、MTにGlobalVariableSetOnCondition関 数を導入する予定ということであれば、それについて事前に一言お願いします。この状況でどのように使うことを提案しているのかも含めて?数日 - 週末を含めて?
 
Slavaさん、有益なアドバイスに感謝するとともに、1つアイデアを思いつきました :)というか、提案です。すでに述べたとおりです。

MTで注文の行列を作ったらどうでしょう。つまり、あるポジションで作業するリクエストを非同期に書き込むと、別スレッドのMTが時間があるときにそのリクエストを処理し、そこに他の人が入ってこないことを保証してくれるのです。

クオーク
 
MTでGlobalVariableSetOnCondition関数を導入する予定ということであれば、事前に何か一言お願いします。<br/ translate="no">
このような状況でどのように使うことを提案しているのかを含めて教えてください。

数日 - 週末を含めて?

すでに例を示しましたが
if(GlobalVariableSetOnCondition(SemaphoreName, 1.0, 0.0)==true) { bSemaphored=true; break; }
.


グローバル 変数の値が0.0であれば、1.0に設定し、trueを返す。念のため、「2、3日後」と言ったが、今日中には掲載できるだろう。

 
MTにオーダーキューを持たせるか。つまり、そこにあるポジションで作業するリクエストを非同期に書き込めば、MTは時間があるときに別スレッドでそのリクエストを処理し、そこに他の人が入ってこないことを保証してくれるのです。<br /> translate="no">です。

注文の行列を作ることはありません
 
<br / translate="no"> すでに例を示しました。


ただ、それが何であるかは言っていない :)と書き込む機能が提案されたのかと思いました。


念のため「2〜3日」と言ったが、今日中に掲載したい。


ありがとうございます。
 
オプションです。

1.この100件の中には、Expert Advisorに直接関係しない、作業中に発見されたバグもいくつか含まれています。例えば、Expert Advisorは、Allow Live Tradingのチェックボックスを外しても、取引が継続されることに気づきました。忘れないでいてほしい。

2.以下は、私のExpert Advisorのコードをもう一度。エラー1、129、138が発生します。a) 138(requote)とは何か、なぜ起こるのか、セマフォと関係があるのか、そしてどう修正するのか、教えてください。 b) なぜ129なのですか?価格も一緒に印刷されているので、間違いはなさそうです。

テスト方法を思い出してみましょう。12通貨で12分足です。

敬称略、
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);
}
 
この場合、RefreshRates関数を使用して、新しい買値または売値を取得するか、MarketInfoに新しい価格を要求してください。129は、同じエラー、間違った価格 - 価格が行き過ぎ、待ち時間の間に何度も価格変更があった。1 - これはエラーではありません。すでに設定されている同じ値で注文を変更しようとしたときに表示されます。