エラー番号6 - ページ 5

 
今、ターミナルを見てみると、昨日、いくつかの問題が発生しました。<br /> translate="no">です。
2005.08.11 11:15:00 ****l EURUSD,H1: エラー#139でOrderSendに失敗しました。
2005.08.11 11:07:12 TradeDispatcher: 全てのトレードコンテキストはビジー状態です。

このEAを抜いたので、この先どうなるのか見てみます。


これです。これがそうです。さあ、どうぞ。139はロックされています。誰が、なぜ、そうするのか、それはわからない。その後、2、6、...と続きます。

一番残念なのは、このEAには他と差別化できるものがないことです。つまり、この「何か」が見えないのか、それともExpert Advisorに不具合があって、毎時間発動しないだけで、そのため誰もがそれに気づいていないのか、どちらかだと思います。

その結果、皆さんに質問ですが、ログにそのようなエントリーがあるのでしょうか?

Roshさんはアルパリを使っているのですか?その場合、アルパリに質問ですが、サーバーはちゃんと動いているのでしょうか?

今夜わかったこと :(

1.Expert Advisorはそれ自体で動作し、ONE、エラーを出さないか、一晩では足りないほど稀にエラーを出します。

2.他のいくつかのExpert Advisor(正確には1つで6通貨分)と組み合わせても、1時間ではなく4時間でエラーが再現されました。

このことから、何が分かるでしょうか。
1.MTに(あるいは私のExpert Advisorに)何らかのバグがあり、時々取引を開始できないことがあります。ちなみに、それらも閉じてください。
もちろん、迂回することも可能です。

while(nResult == -1) { nResult = OrderSend(...); }.



これはVERY BADなプログラミングスタイルで、ブローカーを怒らせるかもしれないのは言うまでもないことですが...。

2.今回、Expert Advisorをよりシンプルにするために書き直したのですが、同時にエラーも発生しました。数時間後に掲載する予定です。もし、このエラーが2つのExpert Advisorを必要とするようであれば、どうすればいいでしょうか、私は2つを投稿します :)






 
2.現在、Expert Advisorをよりシンプルにすると同時に、エラーを発生させるように書き換えているところです。数時間後に掲載する予定です。もし、このエラーが2つのExpert Advisorを必要とすることが判明した場合、どうしたらいいでしょうか。

を確認します。
 
クオーク、診断してみました!EAのせいですね。EAからAlertが 出るとすぐに(私は全く使っていません) - 私はすぐに
2005.08.11 13:01:19 TradeDispatcher: all trade context is busy
.


アラートとブロックの時間は同じです。EAのコードは全く見ていません。

 
まあね。ここで、たった一人でエラーを出す新スーパーエキスパートが登場します。今のところ、エラー139から先に進んでいないので、テストを続けてみることにします。

使用方法:各通貨(EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD)1時間チャートを開いてください。
各チャートにはExpert Advisorが搭載されています。それぞれ異なるチャートを持っているため、相互作用はありません。

ポジションは、1つのチャートにつき1つ、すぐに開設 されます。次の時間の始まりには、そのポジションを逆転させなければならない、というように。

一度に2つのエラーが出たことがあるので、原理的には2時間待たされる可能性があります。

取引サーバーと特別な関係がある場合は、通常のアカウントでテストしたほうがいいかもしれません。私はアルパリを使っています。

また、(これは独立したバグだと思いますが)ポジション開閉の矢印の位置にも注意してください。理論的には、新しいバーでポジションが開くので、矢印は同じバー上にあるはずです。

最後に、1時間も待てないという方は、分足チャートを開いてみてください。このエラーは再現可能です。

もう一度、エラー139の話をします。同時に、この方法ではまだエラー2と6を出すことはできていません。そして、彼らはほとんど以前からそうでした。ということで、投稿が増えるのでしょうね。

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;

//////////////////
int init ()
{
	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;

	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]) 
		bIsBarEnd = true;
	timePrev = Time[0];
	
	if(!bIsBarEnd)
		return(0);

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

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

	for(int nCnt = 0; nCnt < OrdersTotal(); 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);
			}
		}
	}

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

// ------
 
クオーク、診断してみました!EAのせいですね。EAからAlertが出るとすぐに(私は全く使っていません)- <br/ translate="no">
2005.08.11 13:01:19 TradeDispatcher: 全てのトレードコンテキストはビジーです


アラートとブロックの時間は同じです。EAのコードは全く見ていません。



それでもいいのですが、トレードが成立していないことに気づいてアラートを導入しました。また、アラートはOrderSendの 直後のコードにあります。今度はPrintに変えてみようと思っていますが、どうでしょう・・・。
 
ところで、これは面白いですね。EAを再コンパイルすると、bIsBarEndの計算に使っている変数がリセットされます。従って、エディターでF5を押すと、すべてのEAが古いポジションをクローズして新しいポジションを開くはずです。F5を押した。12種類の通貨(とExpert Advisor)があります。3つのアップデートがあります。ん?

Roshの仮定を確認するためにAlertの代わりにPrintを置く。残念ながら、エラーメッセージ 139が画面上ではなく、ログに表示されるようになったことが、全ての違いです。
 
わからない、コードを見たが、何も不具合はない。ここは開店時間ではなく、Barsで決めたいと思います。
	bool bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd = true; timePrev = Time[0].0; if(timePrev != Time[0]) bIsBarEnd = true; if(timePrev != Time[0]) timePrev !



そして、そのことは明確ではありません。
2005.08.11 13:08:12 '18708' : close order #680413 buy 0.10 EURUSD at 1.2385 sl: 0.0000 tp: 0.0000 at price 1.2408
そして

2005.08.11 13:08:13 '18708': 注文 #680413 買い 0.10 EURUSD at 1.2385 sl: 1.2275 tp: 0.0000 価格 1.2408 でクローズしました。

つまり、最初はストップもテイクプロフィットもない状態で注文が進み、突然ストップロスが注文に現れるというものです

 
わからない、コードを見たが、何も不具合はない。この場所は、開店時間ではなく、Barsで判断します<br / translate="no">
bool bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd = true; timePrev = Time[0]
.Bars = false; if
(timePrev != Time[0]) bIsBarEnd = false; if(timePrev != Time[0]) bIsBarEnd
?



そして、そのことは明確ではありません。
2005.08.11 13:08:12 '18708' : close order #680413 buy 0.10 EURUSD at 1.2385 sl: 0.0000 tp: 0.0000 at price 1.2408
そして

2005.08.11 13:08:13 '18708': 注文 #680413 買い 0.10 EURUSD at 1.2385 sl: 1.2275 tp: 0.0000 価格 1.2408 でクローズしました。

つまり、最初はストップもテイクプロフィットもない状態で注文が進み、突然ストップロスが注文に表示され



もしテスト済みのコードがあれば、"via Bars" を見てみたいですね :)

ゼロストップについては......initで割り当てたので、他では変えていません。虫かな。C++を捨てて以来、昆虫学を再びやることになるとは思わなかったよ。

実は......専門家なんです、よーく。しかし、あまりにも単純なので、他のEAが同じような動作をする危険性はないのだろうかという疑問が湧いてくる。Expert Advisorがたくさんあるときだけバグが発生し、しかも異なるエラーが発生することを考慮すると、このバグが発生する可能性があります。

例えば、MACD+ADX+ストキャスティックを使ったExpert Advisorを持っています。テスターでテストして、(定義上サーバーエラーがないところ)プログラマーはただ座って、「ここですべての条件が満たされているが、取引は終了していない」という質問をチェックするのでしょうか?たぶん無理だろうけど...。危険なバグ
 
<br /> translate="no">。
もしテスト済みのコードがあれば、"via Bars" を見てみたいですね :)



例えば、こんな風に。
int start() { int total,ticket,totalExpert; //---- SetTrace(); if (Bars>b) { b=Bars.Bars.Bars.Bars.Bars.Bars.Bars.Bars.Bars.Bars.Bars.Bars.Bars.Bars;
 
悪くはないが、本質的には同じことだ :)
SetTraceとは?