多个订单问题

 

大家好。

我的代码有一个问题。当一个订单(买入或卖出)打开时,其他的订单会连续出现。

我想做的是。

如果最后一个订单是卖出,那么当价格高于订单Openprice加上一些点数(ReturnDist)时,打开一个买入订单。

如果最后一笔订单是买入,那么当价格低于Openprice减去一些点数时,就开出一个卖出订单

谁能提供帮助?

谢谢

路易斯

附加的文件:
 
luisneves:

大家好。

我的代码有一个问题。当一个订单(买入或卖出)打开时,其他的订单会连续出现。

我想做的是。

如果最后一个订单是卖出,那么当价格高于订单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()的部分,现在出现了一些错误。

全局范围的表达式不允许,等等。

如果我没有占用你太多时间,你能帮我一下吗?

谢谢

路易斯



 
luisneves:

嗨,克罗尼。

首先感谢您的及时回复。

很抱歉,我想做的是让代码块独立工作。

所以,我已经清理了你标记的那一行 和上面写着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开启一个以上的(相反)订单。

 
luisneves:

大家好。

我的代码有一个问题。当一个订单(买入或卖出)打开时,其他订单就会连续出现。

为什么你需要一个关于同一段代码的第二个主题?

RaptorUK:

看了你的代码,我发现很难理解你想做什么,我看到很少有评论可以帮助我,你的start()函数没有告诉我你在每个tick上想做什么,你没有一致的缩进布局。


从这个主题 https://www.mql5.com/en/forum/142629 第3页

 
RaptorUK:

看了你的代码,我发现很难理解你想做什么,我看到很少有注释可以帮助我,你的start()函数没有向我显示你在每个tick上想做什么,你没有一致的缩进布局。

同意这一点。除了多单问题,我还没有检查其他的东西,因为代码不容易读懂。看起来部分代码是从别人写的其他代码中复制和粘贴过来的。最好是用你自己的(一致的)风格来写你自己的函数

 
kronin:

我没有说你必须清理什么。我只是想知道,你在哪里尝试限制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

完整的代码附在后面,如果你需要看到我试图解释的东西。

请注意,我还在解决一些其他问题,有些代码可能会显得很奇怪,这是我用来开单的方式,因为我还在学习如何根据出价加减距离开单。

如果你能在这里帮助我,我真的很感激。


问候
路易斯

附加的文件:
 
你知道Volume[0]给你带来了什么吗? 给它加上一个Point值有 什么意义?
 

嗨,猛禽。

你是对的!

我还在学习和尝试几种方法来获得我需要的东西,有些时候会出现愚蠢的事情。

我试着利用一个对象,把它放在Bid级别,然后让这个位置开出订单,似乎比这个更好。其中一个主要问题是如何在未平仓的订单中限制新的开仓。

我知道有很多东西需要学习,通过错误的尝试是我发现的一种方法,可以更好地理解在实践中如何运行。当我尽最大努力去理解书本和文件中的信息时,有些时候我会感到迷茫,并试图从其他人那里获得帮助。在葡萄牙,围绕这个问题很难获得学费,所以我完全依赖别人的善意、耐心和自信来获得帮助和建议。当这种帮助到来时,我尽我所能去理解,但有时我无法应对。

总之,感谢你告诉我,数量并不是获得这种指标的方法。

致以最崇高的敬意

路易斯

 
luisneves:

嗨,猛禽。

你是对的!

我还在学习和尝试几种方法来获得我需要的东西,有些时候会出现愚蠢的事情。

我很欣赏你的努力和学习,也许你应该首先尝试创建一个更简单的EA,并使用它,直到你明白如何让它做你需要的事情,尝试一些事情,添加一些打印语句,看看会发生什么,这样你会学习和理解,然后当你学到更多,你可以添加更多到你的EA。在编写代码之前,你需要对你的EA要做的事情有一个清晰的概念,一下子有太多的功能 不会让这个清晰的思考过程变得更容易。

还有一件事会有帮助,尝试将任务分解成可以在其他EA中重复使用的模块,然后你可以将该模块作为一个用户定义的函数进行编码,作为脚本或简单EA的一部分进行测试,确保它的工作和稳健性......然后你可以在EA中自信地使用该函数,知道它的工作。
 

嗨,RaptorUK。

谢谢你诚实的回答。我已经尝试打破任务,其他类型的问题开始出现,这就是为什么开始把所有的东西放在一起(和其他问题开始....)。

我已经尝试过做另一个EA,效果很好,但现在使用这种方法而不使用指标(标准指标),事情就变得复杂了。

现在的问题是我完全迷失了方向。我认为我所看到的代码工作方式在理论上应该是可行的,然后试图获得限制以避免多次开仓,这使事情变得更糟。

所以现在有一些代码块工作得很好,另一些需要注意改进性能,还有一些(两个)不工作,在这里我不知道如何从这里得到......就这么简单,我完全被那些知道如何处理的人的帮助所困扰。你是为我的问题投入更多时间的人之一,但即便如此,我仍然无法应对一些问题。如果我有时间学习所有的mql代码,然后开始基于大量的理论和过去获得的经验进行编写,也许我就不会在这里了。

我看到了一个EA(附件),然后试着理解它的部分代码是如何工作的,应该能给我带来我想要的东西,但是没有成功。 我看到的是它利用了一个代码,根据价格加减一些距离来获得开盘。在这里,当我试图得到这个时,出现了一个限制的问题,然后就没有了......不能纯粹地把这个工作......然后不能看到为什么备用订单不能像理论上那样工作(至少是我看到的方式)。纯粹的耻辱.......

无论如何,这些都是一个有限的人的一些只言片语......

致以最美好的祝愿

路易斯

附加的文件: