第6号错误 - 页 8

 
尸检显示错误代码139的使用不正确。事实上,它是 "贸易环境繁忙",由于某种原因没有特殊代码。今天在英语论坛"贸易调度员:所有贸易环境繁忙 " 中讨论了类似的问题
所有的EA都只有一个交易环境。正确的解决方案是在全局变量上建立你自己的信号系统。
我在4分钟内运行了4个EA,在10分钟内发生了7次错误139。
 
尸检发现错误代码139被误用。事实上,它是 "贸易环境繁忙",由于某种原因,没有特殊的代码。今天在英语论坛上讨论了一个类似的问题"Trade Dispatcher: all trade context is busy"
所有的EA都只有一个交易环境。正确的解决方案是在全局变量上建立你自己的信号系统。
我在10分钟内运行了4个EA,7次错误139


你能告诉我,至少在一般情况下,这个信号系统应该是什么?
1.特别是,应该如何进行交易,以便不干扰他人。
2.滑动、检查、超时(曾承诺在多线程MT中不存在这些问题,但是拜托了)。

最后。不要把这看作是一种责备。你有一本教科书。在其中,专家被赋予了。给我看看那里的信号灯。

这是我的专家。像裤子一样简单,只需20卢布。每小时翻转一个位置。如果你真的关心交易者和经纪人的利润(我不知道大家怎么想的,但我想先得到一个稳定工作的EA,然后再从模拟转为真实),那么请以我的这个EA为例,告诉我应该怎么做才对。

真诚的。
夸克

P.S.错误2、6、138和4109的起源问题仍未解决,这些错误有时也会出现。
 
<br / translate="no">今天在英文论坛"Trade Dispatcher: all trade context is busy " 讨论了一个类似的问题。


我已经阅读了英语的主题。是啊...这些人需要紧急学习俄语。
这不是类似,是同一个问题。的确,他们还没有得到错误2、6、138和4109。他们只是在谈论139。

说实话,我不认为IsTradeAllowed有什么意义。斯拉瓦自己解释说,有十个专家顾问被允许使用这个功能,然后突然开始交易,除了第一个专家之外,其他人都会感到失望。

最好的办法是对请求进行排队,让它们堆积起来,生存一段时间,然后被执行或删除。但这都是一个梦。

相反,我们必须创建一个全局变量nTrading,例如,在那里存储专家顾问的名字。那么其他EA应该怎么做呢?回到MT3的挂单中去还是有其他的想法?

顺便说一下,我们可以不使用全局变量,比如说

如果(nPending == OP_BUY) nPending = 买入(); 否则如果(nPending == OP_SELL) nPending = 卖出()。



其中Buy()和Sell()失败时返回OP_BUY / OP_SELL,成功时返回-1。

其缺点是显而易见的 - 经纪人将收到10个订单来打开(关闭),而不是一个。如果是自动的,那就一切都好。如果是人--就会被冒犯。更糟的是,如果自动机和人按照不同的逻辑行事。例如,自动机没有队列(正如斯拉瓦向我们解释的那样,一个线程,订单竞争而不是形成一个队列),而人类有。然后交易者开始在真实的交易中,他甚至不明白为什么,因为他(我--在Alpari的研讨会上)被保证,模拟和真实之间没有区别。

第二种选择--每个专家和货币都被分配了自己的Mn,因此专家顾问+货币的组合是独一无二的。然后,我们以这样的方式编写代码:带有IM1的EA将在第一秒进行交易,带有IM7的EA将在第七秒进行交易,等等,在条形图打开后。这将使系统有一秒钟的时间进行交易。

向斯拉瓦提问--一秒钟足以避免问题吗?



亲爱的开发者(以及所有的人)。谢谢你的澄清。在这个帖子和以前的帖子中仍有一些未回答的问题。等待答案。

夸克




 
还有一个问题。所讨论的情况是否指的是止损单?专家们是否为其执行力而竞争?
 
//+------------------------------------------------------------------+
//|                                                    TestQuark.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;
string SemaphoreName="TradeSemaphore";

//////////////////
int init ()
{
   if(!GlobalVariableCheck(SemaphoreName)) GlobalVariableSet(SemaphoreName,0.0);
	
	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;
		
	timePrev += nMagic;	// Open nMagic seconds after the new bar

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

	bool bSemaphored=false;
   while(!IsStopped())
     {
      if(GlobalVariableGet(SemaphoreName)==0.0)
        {
         GlobalVariableSet(SemaphoreName,1.0);
         bSemaphored=true;
         break;
        }
      Sleep(1000);
     }

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

	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(bSemaphored) GlobalVariableSet(SemaphoreName,0.0);	

	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(Symbol() + ", " + 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(Symbol() + ", " + 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);
}

//+------------------------------------------------------------------+


如果做一个函数来设置一个全局变量的值,前提是这个变量有一定的值,这样就不会有结构 。

      如果(GlobalVariableGet(SemaphoreName)==0.0) { GlobalVariableSet(SemaphoreName,1.0); bSemaphored=true; break; }


那么它将是100%可靠的 ,如 。

      if(GlobalVariableSetOnCondition(SemaphoreName,1.0,0)==true) { bSemaphored=true; break; }




 
还有一个问题。所讨论的情况是否指的是止损单?专家顾问是否为其执行而竞争?

不,停止是在服务器上执行的。
 
相反,我们必须建立一个全局变量nTrading,比如说,把当前交易的专家顾问的名字写在里面。那么其他EA应该怎么做呢?回到MT3的挂单中去还是有其他想法?对
我个人而言,交易之间有一个强制性的停顿(可调整,现在是30秒)。这几乎不是交易获利的障碍,但它可以防止类似情况发生。它是通过一个全局变量实现的。讯号和暂停--二合一=)

关于队列--我有个想法,想做一个EA,执行写在文件中的 订单。而所有其他专家只是向这个文件写命令。
但对我来说,这并不容易(在有能力实施的意义上)......。但也可以尝试。通过共同的努力=))。
 
谢谢 :)

这是我不明白的一段话:

<br/ translate="no">如果做一个函数来设置一个全局变量的值,前提是该变量有一定的值,这样就不会有构造

if(GlobalVariableGet(SemaphoreName)==0.0)
{
GlobalVariableSet(SemaphoreName,1.0);
bSemaphored=true;
break;
}


现在说说本案的逻辑。对不起,纠缠你,但...如果我没有理解错的话,我们正坐在一个while循环中,直到我们设法设置semaphore。对吗?然后我们进行交易,知道除了我们之外没有人在交易。然后我们将信号灯返回到它的原始状态。问题: while(!IsStopped())如何工作??我以为这是一个允许现场交易的检查。问题是:那些 "同时 "和 "睡眠 "不会造成系统的滞后吗?问题:在







测试模式 下,Sleep和semaphore会被正确处理吗?另一个合乎逻辑的问题。在设置和删除信号灯之间,我们有两种(最大)的可能性来处理订单。首先是Buy()或Sell(),然后在它下面是CloseOrder()。这两个 "活动 "不会相互竞争吗?尽管在EA内部,就像有两个专家顾问一样。还是说这个过程保证是线性的,直到Buy()返回才会到达CloseOrder()?预先感谢你。夸克
 
И еще один вопрос. Относится ли обсуждаемая ситуация к стоп ордерам? Конкурируют ли эксперты за их исполнение?

不,止损是在服务器上处理的。在我们的案例中,客户的专家交易流存在竞争。


我说错话了。应该OrderSend(OP_BUYSTOP...还用设置和删除信号灯的代码包围它?愚蠢的问题。当然,你应该。
 
我把第4页第1个帖子中的专家顾问附在eur - m15上。
重做了交易功能(连接了我的库),并将其连接到另一个欧元区--M15。当然,Meijic已经被改变。

我会让你知道结果如何;)