第6号错误 - 页 11

 
在10分钟图表的50分钟工作中,只有2个重新报价。 没有更多的错误。让我们加入元编辑的字典,并发布变化
 
在这种情况下,使用RefreshRates函数并获取一个新的买入或卖出值,或者向MarketInfo询问一个新的价格。129是同样的错误,错误的价格--价格已经走得太远了,在等待的时间里有几次价格变化。1 - 这根本不是一个错误。它出现在你试图用你已经设定的相同数值修改一个订单时。很奇怪的是,当你手动确认一个交易时,当你拒绝它时,它就会出现。


谢谢,但是...
我发布的最后一个EA有3秒的滞后和50(!)点的滑移。价格
12张图,每张3秒--价格不会有时间跑那么远。或者我有什么误解吗?
 
为专家添加了RefreshRates(代码如下)。1号错误现在已经堆积如山。
希望你能追踪到它。"冲洗 "是指大约每2-3分钟一次。如果你不这样做--可能是服务器太近,或者电脑速度太快。我的CPU有一部分被一个神经网络包占用了,所以MT得到了50%...现在...在这里,禁用神经网络(有一个暂停按钮,与其他一些程序不同)。第一号错误并没有消失,但已经变得不那么频繁了。MT在 "吃 "55-99%的CPU。把它打开...MT获得的CPU时间减少了1.5倍。错误也变得更加频繁。

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


 
总结一下,我想。似乎任何专家,除了那些独自工作的人,都需要保护性的信号灯。我将在周一尝试开发者推出的新功能(Rosh说开发者不想改变版本!)。我应该多和他联系,这只是一百个帖子的距离)。实际上,非常感谢开发者。也感谢Rosh和作曲家。然而,我们会等到星期一 :)
 
不,肯定要到星期一才行 =)))
南方在召唤,新功能将在一周内及时测试=)))))

...也谢谢你,至少有人尝试解决了错误;)
 
总结一下,我想。似乎任何专家,除了那些独自工作的人,都需要保护性的信号灯。我将在周一尝试开发者推出的新功能(Rosh说开发者不想改变版本!)。我应该多和他联系,这只有一百个帖子的距离)。实际上,非常感谢开发者。也感谢Rosh和作曲家。然而,周一见 :)<br / translate="no">


夸克,我写的是开发者,而不是开发者。:)明白吗?在一些宗教中,它是上帝,在其他宗教中,它是一个不同的地址。
另外,我还写道,我的9个EA在一个账户上运行良好。但你很善于发现MT4在铲除一些错误时的状况 :)
 
<br / translate="no"> 不,要到星期一才行 =)))


周一见 :)


南方在召唤,新的f函数将在一周内及时测试=)))))


向南方打个招呼。


...也谢谢你,至少有人尝试解决了错误;)


有一个错误。而其中有多少人...
 
<br / translate="no"> 夸克,我写的是开发者,而不是开发商。:)


我只是在开玩笑 :)虽然这个原则在哪里都是一样的。如果你问得正确,你就会得到答案。如果你说脏话,你会被禁言 :)


而且我还写道,我的9个EA在同一个账户上运行良好。但你很善于发现MT4在铲除一些错误时的状况 :)


72个窗口与我的12名议员--也是。然后我加上了第13个,就这样了......。当然,一般来说,如果我采用这个分支中发布的最后一个EA,用它来代替分钟,并将暂停时间从3秒增加到30秒(顺便说一下,按照你的建议),就不会出现错误。因此,结果已经达到了,一个积极的结果......。

对于英语论坛的人来说,这是一个遗憾,但我不会为他们翻译我们的帖子。健康状况不佳 :(

好运。
夸克
 
尽管做了这些工作,第6号错误仍在发生。当MT使用优化器并同时开仓时就会发生这种情况。我已经抓了两次。再次运行专家顾问--如果开仓的 条件仍然有效--结果是开仓了,没有问题。
 
看来,当优化器运行时,错误6的可能性更大。重启计算机、MT等措施都不能改变情况。

这个问题发生在不同的EA上。所有这些的逻辑都被修改了,用semaphores(如Slava建议的那样)和延迟(Rosh)--所以在给定的10秒内只有一个EA在工作。我上面提到的所有错误都消失了(到目前为止),除了第6条。