大家好。
我的代码有一个问题。当一个订单(买入或卖出)打开时,其他的订单会连续出现。
我想做的是。
如果最后一个订单是卖出,那么当价格高于订单Openprice加上一些点数(ReturnDist)时,打开一个买入订单。
如果最后一笔订单是买入,那么当价格低于Openprice减去一些点数时,就开出一个卖出订单。
谁能提供帮助?
谢谢
路易斯
你有什么计划来限制它?
你初始化OpenOpposite为1。
int Ticket,total,OpenOpposite=1,UseSlippage,i;
在每个tick 上,你调用OpenOppositeOrder()。
int start() { if (OrdersTotal()==0)GoToOpen(); else GoToClose(); if(OpenOpposite>0)OpenOppositeOrder(); //<-- here if(OrdersTotal()>0)OpPendingDel(); }
我没有看到对OpenOpposite的任何其他引用。
到目前为止,我所看到的OpenOppositeOrder中的for循环没有任何限制......它应该吗?
你认为错误出在你代码的什么地方?
嗨,克罗尼。
首先感谢您的及时回复。
很抱歉,我想做的是让代码块独立工作。
所以,我已经清理了你标记的那一行和上面写着void OpenOpposite()的部分,现在出现了一些错误。
全局范围的表达式不允许,等等。
如果我没有占用你太多时间,你能帮我一下吗?
谢谢
路易斯
嗨,克罗尼。
首先感谢您的及时回复。
很抱歉,我想做的是让代码块独立工作。
所以,我已经清理了你标记的那一行 和上面写着void OpenOpposite()的部分,现在出现了一些错误。
全局范围的表达式不允许,等等。
如果我没有占用你太多时间,你能帮我一下吗?
谢谢
路易斯
我没有说你必须要清理什么。我只是想知道,你在哪里尝试限制EA开立多个订单。
试试这个(我还没测试过)。
把启动功能 改为(也许你必须只过滤未平仓的市场订单->取决于你的策略)。
int start() { if(OrdersTotal()==0){GoToOpen();OpenOpposite=0;} //<-- set OpenOpposite to 0 if no order is open (pending and market) else GoToClose(); if(OpenOpposite==0)OpenOppositeOrder(); //<-- only run OpenOpositeOrder, if OpenOpposite is 0. if(OrdersTotal()>0)OpPendingDel(); }
在OpenOppositeOrder()函数中添加一个OpenOpposite计数器。
if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber) { Op = OrderType(); if(Op == OP_BUY && Ask < (OrderOpenPrice()- ReturnDist*pt)) { Ticket = OrderSend(Symbol(), OP_SELL, mlots, SellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red); if(Ticket > 0) { Print("Opposite Sell order placed # ", Ticket); AddLimitsSell(); OpenOpposite++; } else { Print("Order Send failed, error # ", GetLastError()); } } if(Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt)) { Ticket = OrderSend(Symbol(), OP_BUY, mlots, BuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green); if(Ticket > 0) { Print("Opposite Buy order placed # ", Ticket); AddLimitsBuy(); OpenOpposite++; } else { Print("Order Send failed, error # ", GetLastError()); } } }
这应该可以解决连续打开多个订单的问题。它限制了EA开启一个以上的(相反)订单。
我没有说你必须清理什么。我只是想知道,你在哪里尝试限制EA开多个订单。
试试这个(我还没测试过)。
把启动功能改为(也许你必须只过滤开市订单->取决于你的策略)。
在OpenOppositeOrder()函数中添加一个OpenOpposite计数器。
这应该可以解决连续打开多个订单的问题。它限制了EA开启一个以上的(相反)订单。
你好,Kronin。
谢谢你对我的问题的及时回应。我想得到的是一个打开订单的条件,像这样。
首先通过指标开仓是买入(当然也可以是卖出),然后开出买入订单,如果价格反弹到低于买入订单的开仓价,就会开出卖出订单,但如果价格再次上涨,就不应该有新的买入开仓。在这里,只有当价格从卖出指令中反弹时,才会出现新的买入指令。如果卖出订单是第一个发生的,那就都一样了。
我试着用下面的代码来实现这一点,但并不奏效。这里工作的是第一个打开的订单是买入,然后和预期的一样,一个卖出订单将打开,但从这里开始没有其他订单打开......
我有两段代码,似乎第一段在做预期的工作;如果指标定义的条件存在,就打开一个买单或卖单。一旦收到订单,就会修改订单以发送订单限制。
我在代码中使用BuyTicket和SellTicket来避免打开多个订单,但似乎这不是正确的方法......
// Buy Order Condition to Open if(Volume[0] > volume_previous + OpenDistance*pt && BuyTicket == 0) {//5 while(IsTradeContextBusy()) Sleep(10); RefreshRates(); BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green); if(BuyTicket > -1) {//6 Print("Opposite Buy order placed # ",BuyTicket); AddLimitsBuy(); }//6 else {//7 Print("Order Send failed, error # ", GetLastError()); }//7 return(0); }//5 //-----------------------------------------------------------------------------+ // Sell Order Condition to Open if(Volume[0] < volume_previous - OpenDistance*pt && SellTicket == 0) {//8 while(IsTradeContextBusy()) Sleep(10); RefreshRates(); SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,RealSlippage,0,0,"Sell Order",MagicNumber,0,Red); if(SellTicket > -1) {//9 Print("Opposite Sell order placed # ", SellTicket); AddLimitsSell(); }//9 else {//10 Print("Order Send failed, error # ", GetLastError()); }//10 return(0); }//8
下面的代码可以识别未平仓的订单,并过滤它们的买入符号、神奇数字和订单类型。一旦检测到资金池中最后一个未平仓的订单,如果符合开仓条件(考虑到最后一个订单是买入)并确认不存在卖出票,那么就会开出一个卖出订单。如果最后一个订单是卖出,也是一样。这里的代码是有效的。
当有条件打开第三个订单时,问题就来了,以此类推。在这里,尽管开仓的条件是存在的,而且代码在第二次开仓时处理得很好,但为什么代码在这里不工作了呢?
int Op; for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--) {//14 if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES)) {//15 if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber) {//16 Op = OrderType(); if(Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0) {//17 SellTicket = OrderSend(Symbol(), OP_SELL, MLots, Bid, RealSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red); if(SellTicket > -1) {//18 Print("Opposite Sell order placed # ", SellTicket); AddLimitsSell(); }//18 else {//19 Print("Order Send failed, error # ", GetLastError() ); }//19 }//17 if(Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0) {//20 BuyTicket = OrderSend(Symbol(), OP_BUY, MLots, Ask, RealSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green); if(BuyTicket > -1) {//21 Print("Opposite Buy order placed # ", BuyTicket); AddLimitsBuy(); }//21 else {//22 Print("Order Send failed, error # ", GetLastError()); }//22 }//20 }//16 }//15 }//14
完整的代码附在后面,如果你需要看到我试图解释的东西。
请注意,我还在解决一些其他问题,有些代码可能会显得很奇怪,这是我用来开单的方式,因为我还在学习如何根据出价加减距离开单。
如果你能在这里帮助我,我真的很感激。
问候
路易斯
嗨,猛禽。
你是对的!
我还在学习和尝试几种方法来获得我需要的东西,有些时候会出现愚蠢的事情。
我试着利用一个对象,把它放在Bid级别,然后让这个位置开出订单,似乎比这个更好。其中一个主要问题是如何在未平仓的订单中限制新的开仓。
我知道有很多东西需要学习,通过错误的尝试是我发现的一种方法,可以更好地理解在实践中如何运行。当我尽最大努力去理解书本和文件中的信息时,有些时候我会感到迷茫,并试图从其他人那里获得帮助。在葡萄牙,围绕这个问题很难获得学费,所以我完全依赖别人的善意、耐心和自信来获得帮助和建议。当这种帮助到来时,我尽我所能去理解,但有时我无法应对。
总之,感谢你告诉我,数量并不是获得这种指标的方法。
致以最崇高的敬意
路易斯
嗨,猛禽。
你是对的!
我还在学习和尝试几种方法来获得我需要的东西,有些时候会出现愚蠢的事情。
还有一件事会有帮助,尝试将任务分解成可以在其他EA中重复使用的模块,然后你可以将该模块作为一个用户定义的函数进行编码,作为脚本或简单EA的一部分进行测试,确保它的工作和稳健性......然后你可以在EA中自信地使用该函数,知道它的工作。
嗨,RaptorUK。
谢谢你诚实的回答。我已经尝试打破任务,其他类型的问题开始出现,这就是为什么开始把所有的东西放在一起(和其他问题开始....)。
我已经尝试过做另一个EA,效果很好,但现在使用这种方法而不使用指标(标准指标),事情就变得复杂了。
现在的问题是我完全迷失了方向。我认为我所看到的代码工作方式在理论上应该是可行的,然后试图获得限制以避免多次开仓,这使事情变得更糟。
所以现在有一些代码块工作得很好,另一些需要注意改进性能,还有一些(两个)不工作,在这里我不知道如何从这里得到......就这么简单,我完全被那些知道如何处理的人的帮助所困扰。你是为我的问题投入更多时间的人之一,但即便如此,我仍然无法应对一些问题。如果我有时间学习所有的mql代码,然后开始基于大量的理论和过去获得的经验进行编写,也许我就不会在这里了。
我看到了一个EA(附件),然后试着理解它的部分代码是如何工作的,应该能给我带来我想要的东西,但是没有成功。 我看到的是它利用了一个代码,根据价格加减一些距离来获得开盘。在这里,当我试图得到这个时,出现了一个限制的问题,然后就没有了......不能纯粹地把这个工作......然后不能看到为什么备用订单不能像理论上那样工作(至少是我看到的方式)。纯粹的耻辱.......
无论如何,这些都是一个有限的人的一些只言片语......
致以最美好的祝愿
路易斯
大家好。
我的代码有一个问题。当一个订单(买入或卖出)打开时,其他的订单会连续出现。
我想做的是。
如果最后一个订单是卖出,那么当价格高于订单Openprice加上一些点数(ReturnDist)时,打开一个买入订单。
如果最后一笔订单是买入,那么当价格低于Openprice减去一些点数时,就开出一个卖出订单。
谁能提供帮助?
谢谢
路易斯