每个货币对的EA - 每个货币对只开一次的代码是什么? - 页 3

 

我把关闭机制从。

for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose()

改为

for (int k = 0; k < OrdersTotal(); k ++) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

现在一切都按预期进行。尽管我不明白这是为什么。因为我真的不明白第二段代码中的附加行。但还是要谢谢你们!

 
grey.unit:

我把关闭机制从。

现在一切都按预期进行。谢谢你们!

这可能并不总是有效的 ... ...当在一个循环中关闭未结订单或删除待定 订单时,你必须 向下而不是向上计数 ...你需要改变你的循环。你需要把Symbol()的缺口放回去 ... ...否则欧元兑美元的EA最终可能会关闭英镑兑美元的订单 ... ...你需要做的是摆脱继续 . ..或者把== 变成!
 
grey.unit:

我把关闭机制从。

改为

现在一切都按预期进行。尽管我不明白这是为什么。因为我真的不明白第二段代码中的附加行。但还是要感谢你们!

你的第二段代码是正确的,但有点可笑。打开MetaEditor,导航窗口(Ctrl+D),字典标签,选择MQL4参考>标准常量>交易操作

 
RaptorUK:
这可能并不总是奏效 ......当在一个循环中关闭未结订单或删除待定订单时,你必须 向下而不是向上计数 ......你需要改变你的循环。你需要把Symbol()的缺口放回去 ... ...否则欧元兑美元的EA最终可能会关闭英镑兑美元的订单 ... ...你需要做的是摆脱继续 . ..或者把== 变成!

只是为了弄清楚你的意思。你说的是,如果我把第一段代码修改为。

for (int j = 0; j < OrdersTotal(); j --) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())       // Another security    
                 {

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

那么它也应该工作吗?因为我试过了,它又只是在每个货币对 上开一个订单。

或者,如果我把第二段代码改为(k++改为k--),它也是每个货币对只开一个交易。

for (int k = 0; k < OrdersTotal(); k --) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   
 
grey.unit:

只是为了弄清楚你的意思。你说的是,如果我把第一段代码修改为。

那么它也应该工作吗?因为我试过了,它又只是在每个货币对上开一个订单。

或者如果我把第二段代码改为(k++改为k--),它也是每个货币对只开一个交易。

我说的是第一段代码,也就是你用来关闭订单的那个循环......它必须递减。...否则你会错过订单。 我看到你已经删除了继续,并添加了 { } 大括号,非常好 :-)

每个货币对 开一个订单还是总共一个订单?

 
RaptorUK:

每个货币对开一个订单还是总共一个订单?

是的,当然是总数。好吧,第二段代码。


for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

当我们谈论循环时,我想你是指这个。

for (int j = 0; j < OrdersTotal(); j ++)

事实上,我会把它改成这样的。

for (int j = OrdersTotal()+1 ; j > OrdersTotal(); j --) 
   {

这一行对每个货币对 只打开一个订单(如所愿!)。

关于这个问题,现在的循环是否正确?

RaptorUK:

这可能并不总是奏效 ......当在一个循环中关闭未结订单或删除待定订单时,你 必须 向下而不是向上计数 ...... 你需要改变你的循环。 你需要 把Symbol()的缺口放回去 ... ...否则欧元兑美元的EA最终可能会关闭英镑兑美元的订单 ... ...你需要做的是去掉 continue . ........或者把 == 变成 !
 
grey.unit:

是的,当然是总共。好吧,第二段代码。


当我们在谈论循环时,我想你是指这个。

事实上,我会把它改成这样的。

这一行对每个货币对只打开一个订单(如所愿!)。

关于这个问题,现在的循环是否正确?

不,这样做 . .

for (int j = OrdersTotal()-1 ; j >= 0 ; j --)   // start at OrdersTotal() -1 ,  finish when j = 0

第一个订单的位置是0,所以如果你有5个 订单,位置是0,1,2,3,4 ... ...所以最后一个是OrdersTotal() - 1 ... ...所以要倒数,你从OrdersTotal()-1开始,以0结束

 
好的,非常感谢您的帮助!
 
RaptorUK:

不,这样做 ... ...

第一个订单的位置是0,所以如果你有5个 订单,位置是0,1,2,3,4 ... ...所以最后一个是OrdersTotal() - 1 ... ...所以要倒数,你从OrdersTotal()-1开始,以0结束

所以它应该是这样的。

for (int j = OrdersTotal()-1 ; j = 0 ; j --) 

因为你是这样写的。

for (int j = OrdersTotal()-1 ; j >= 0 ; j --) 

还是我错了?

 
grey.unit:

所以它应该是这样的。

因为这是你写的。

还是我错了?

你完全错了。你的代码永远不会被执行!!!。使用RaptorUK的。
原因: