打开相反的订单 - 页 3

 
RaptorUK:

如果它有一个与MagicNumber 不同的Magic Number,或者它是针对EA运行的符号以外的符号,或者如果它是一个OP_SELLLIMIT或OP_BUYLIMIT.......另外,你需要检查你的OrderDelete()调用的返回值。

你为什么需要调用RefreshRates()? 我并不是说要把它们去掉,但你能解释一下你为什么要在这里调用RefreshRates()吗?


什么是函数的返回值?我如何使用它们?


嗨,RaptorUK。

据我所知,MagicNumber是相同的,OP_SELLSTOP和OP_BUYSTOP也是如此。

OrderDelete()的调用,我恐怕不明白你的意思....。

RefreshRates()我只是在出现平仓问题后放在那里的。

现在我在里斯本(葡萄牙)。

路易斯

 
luisneves:


嗨,RaptorUK。

据我所知,MagicNumber是一样的,都是OP_SELLSTOP和OP_BUYSTOP。

OrderDelete()的调用,我恐怕不明白你的意思....。

当你调用OrderDelete()时(通过使用OrderDelete()函数),它返回一个值,它返回一个bool值,如果该值为真,OrderDelete()成功,如果为假,OrderDelete()失败。.所以要检查返回值,如果是假的,就用Print()把错误报告给日志,或者用Comment() 或Alert(),这样你就知道有问题了,可以进行调查。

基于你的代码,我会做这些修改 ... ...如果是我的代码,我会做额外的修改,在出现错误时打印更多的信息,如Bid、Ask、FreezeLevel、StopLevel,等等。

void CloseAll()
   {
   int OrdType, GLError;
   
   RefreshRates();
                    
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)
      if( OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber() == MagicNumber 
         && OrderSymbol() == Symbol())
         {
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
            {
            if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), UseSlippage, Yellow))
               GLError = GetLastError();
            }

         if(OrdType == OP_SELLSTOP || OrdType == OP_BUYSTOP || OrdType == OP_BUYLIMIT || OrdType == OP_SELLLIMIT)
            {
            if(!OrderDelete(OrderTicket())
               GLError = GetLastError();
            }

         if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());         
         }
   } 
 
RaptorUK:

当你调用OrderDelete()时(通过使用OrderDelete()函数),它返回一个值,它返回一个bool值,如果该值为真,OrderDelete()成功,如果为假,OrderDelete()失败。.所以要检查返回值,如果是假的,就用Print()把错误报告给日志,或者用Comment()或Alert(),这样你就知道有问题了,可以进行调查。

基于你的代码,我会做这些修改 ... ...如果是我的代码,我会做额外的修改,在出现错误时打印更多的信息,如Bid、Ask、FreezeLevel、StopLevel,等等。


嗨,RaptorUK。

挂单没有被删除的原因是获利太低,在这种情况下是5点。我的困惑来自于这样一个事实,即如果我有一个例行程序,将止损、开盘价和获利 放在冻结区之外,为什么这没有用。好吧,但现在是在工作。

顺便说一下,我想在其他订单被触发后关闭相反的订单。为此,我输入了额外的代码,但(你可以开始笑了......)但没有....。

有什么帮助吗?

 while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();
         Ticket=OrderSend(Symbol(),OP_BUYSTOP,LotSize,BuyLevel,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Stop Order",MagicNumber,0,Green);
         if(Ticket>0)
         
          int o=OrderType();
          if (o==OP_BUY)
          OrderDelete(OrderTicket());        
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY Stop Order Opened : ",OrderOpenPrice());
           }
         //else Print("Error opening BUY Stop Order : ",GetLastError());
 
luisneves:


嗨,RaptorUK。

1. 挂单没有被删除的原因与获利过低有关,在这种情况下是5点。我的困惑来自于这样一个事实:如果我有一个例行程序,将止损、开盘价和止盈放在冻结区外,为什么没有作用呢?好吧,但现在是在工作。

2.顺便说 一下,我想在其他订单被触发后关闭相反的订单。为此,我写了这个额外的代码,但(你可以开始笑了......)但没有....。

有什么帮助吗?


你需要确保任何订单上的任何交易行为都符合这里的信息:做交易的要求和限制

你必须等待订单的类型从OP_BUYSTOP变为OP_BUY,这可能需要一些时间,所以你需要不断检查。一旦它变成了OP_BUY,那么你就可以关闭相反的订单,要做到这一点,你必须找到正确的订单来关闭。你应该阅读我最近与WhooDoo22 的对话,该对话涉及一个类似的话题。

 

嗨,RaptorUk。

我跟踪了你提供的链接,但主题尽管很有趣,但太长了,有很多不同的意见,我已经把自己遗忘在其中。

所以,我引入了一个代码来关闭相反的待定,但还是没有结果,在日志中也没有看到任何帮助.....,我在这里错过了什么......。

谢谢你的帮助.....

路易斯

//Sell Pending Stop Loss & Take Profit Calculation     
     
   if(StopLoss>0)SellStopLoss=PendingSellPrice+(StopLoss*pt);
   if(TakeProfit>0)SellTakeProfit=PendingSellPrice-(TakeProfit*pt);
   
//Place Sell Pending Order
        
         while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();       
         Ticket=OrderSend(Symbol(),OP_SELLSTOP,LotSize,SellLevel,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Stop Order",MagicNumber,0,Red);
         if(Ticket>0)OppositePendindDel();          
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL Stop Order Opened : ",OrderOpenPrice());
           }
        //else Print("Error opening SELL Stop Order : ",GetLastError());
         } 
//+---------------------------------------------------------------------------+
int OppositePendindDel()
{
 int c,d,GLError;
 int e=OrdersTotal();
 
 for(c=e-1;c>=0;c--)
 {  
   OrderSelect(c,SELECT_BY_POS,MODE_TRADES);
   if(OrderType()==OP_BUY||OrderType()==OP_SELL)
   {
    for(d=e-1;d>=0;d--)
    {
     OrderSelect(d,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderType()==OP_SELLSTOP)
     {
      if(!OrderDelete(OrderTicket()))
            GLError = GetLastError();
      
      return(1);
      }
      if(OrderType()==OP_BUYSTOP)
      {
       if(!OrderDelete(OrderTicket()))
             GLError = GetLastError();
       }
       if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());
       return(1);
       }
      }
     }
    }
 
luisneves:

嗨,RaptorUk。

我跟踪了你提供的链接,但主题尽管很有趣,但太长了,有很多不同的意见,我已经把自己遗忘在其中。

所以,我引入了一个代码来关闭相反的待定,但还是没有结果,在日志中也没有看到任何帮助.....,我在这里错过了什么......。

RaptorUK:

你必须等待 订单的类型从OP_BUYSTOP变成OP_BUY,这可能需要一些时间,所以你需要不断检查......一旦它变成OP_BUY,你就可以关闭相反的订单,要做到这一点,你必须找到正确的订单来关闭。

 
RaptorUK:



你好,RaptorUK。

好吧,现在看来,在一个挂单被触发后,正在删除相反的挂单。但现在有些订单是双倍的,也就是说,EA在同一时间发出了卖出和买入的订单,而这两个订单的手数是相同的,当它必须一次发出一个订单。我开始变得疯狂.....

任何帮助,请!!!!

附加的文件:
 
luisneves:


嗨,RaptorUK ,

好吧,现在看来,在一个挂单被触发后,正在删除相反的挂单。但现在有些订单是双倍的,也就是说,EA在同一时间发出了卖出和买入的订单,而这两个订单的手数是相同的,当它必须一次发出一个订单。我开始变得疯狂.....

任何帮助,请!!!!

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

GoToClose()函数的作用是什么?如果你在函数的开始部分做一些注释,描述它应该做什么,那么我可以看到它是否真的在做它应该做的事情,目前它所做的是调用一个函数,CloseAll();如果任何你的 符号和魔法号码相匹配的单一交易有任何 金额的利润,或者如果你有超过7个交易的任何 符号和任何 魔法号码。CloseAll()只关闭你的 符号和魔法号码的交易,所以如果你有7笔不同的符号或魔法号码的交易,GoToClose()将继续调用CloseAll(),而不会发生其他事情。


如果你在你的模拟账户 上进行手动交易,然后运行你的EA,它不会做任何事情......它会看到交易,但不会忽略它,它会计算它,结果是它不会进行自己的交易,也不会关闭这个开放的交易。 在这种情况下,你的EA应该怎么做? 如果有另一个EA用不同的魔法号码进行交易,会怎样?

你需要清楚地了解你想做什么,注释你的start()函数,这样流程和过程就清楚了,注释每个函数,这样就清楚了每个函数的作用。 当你这样做了,你就会明白你的问题出在哪里 ......

 
RaptorUK:

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

GoToClose()这个函数是用来做什么的?如果你在函数的开始部分做一些注释,描述它应该做什么,那么我可以看到它是否真的在做它应该做的事情,目前它所做的是调用一个函数,CloseAll();如果任何你的 符号和魔法号码相匹配的单一交易有任何 金额的利润,或者如果你有超过7个交易的任何 符号和任何 魔法号码。CloseAll()只关闭你的 符号和魔法号码的交易,所以如果你有7笔不同的符号或魔法号码的交易,GoToClose()将继续调用CloseAll(),而不会发生其他事情。


如果你在你的模拟账户上进行手动交易,然后运行你的EA,它不会做任何事情......它会看到交易,但不会忽略它,它会计算它,结果是它不会自己进行交易,也不会关闭这个未完成的交易。 在这种情况下,你的EA应该怎么做? 如果有一个交易是由另一个EA用不同的魔法号码进行的,会怎么样?

你需要清楚地了解你想做什么,注释你的start()函数,这样流程和过程就清楚了,注释每个函数,这样就清楚了每个函数的作用。 当你这样做了,你可能会明白你的问题所在 ... .


嗨,RaptorUK。

很抱歉造成了这样的混乱。目前看来,除了这个问题,EA正在做人们所期望的事情。

EA应该在每次前一个订单没有以手数递增和相同的止盈额的情况下开出一个相反的订单,而且它确实这样做了。看一下报告,你可以看到订单6和7都是卖出,订单7应该是买入。

现在我已经把代码按功能写出来了。我有所有这些无效调用的原因是我想有一个完整的独立的工作区块,在这里我知道我在安排这个问题上有问题。...)我使用符号和魔法数字来保证EA只处理自己的订单。

主要的策略是(和块是由这个命令)。

1- 两个挂单在价格上方和下方。一旦价格触发了其中一个,相反的挂单就被删除。这是在工作。

2- 如果价格达到止盈点,那么订单就会被关闭,EA会重新启动两个挂单,这个过程会重新开始。这是在工作

2- 如果价格没有选择止盈,并且在止盈金额下降后反弹(对于买入订单),那么相反的卖出订单 应该以相同的止盈金额开仓,并且手数大于前者。这是在工作,除了它放了一个以上的订单,从报告中可以看出,订单6和7都是卖出订单,应该只有一个,7应该是买入。

3- 一旦最后一个订单获利,所有未结订单都应关闭。这个过程就开始了。这就是工作。

4-在这个乒乓游戏中,人们应该期望最多有7次订单选择获利,如果没有,这些订单将被关闭。

例如,如果我们想获得2个点的利润,那么我们要等待价格达到3个点,然后在2个点的水平上设置一个止损线,这两个功能之一,即平衡或最低利润的跟踪止损。如果价格上涨(买入),那么止损线也会跟着上涨,一旦价格反弹1个点,订单就会关闭,因为它有利润,所有未结订单都会关闭。在这里我不确定这是否能正常工作。

谢谢

路易斯

附加的文件:
 
luisneves:


嗨,RaptorUK。

很抱歉造成这样的混乱。目前看来,除了这个问题,EA正在做人们所期望的事情。

EA应该在每次前一个订单没有以手数递增和相同的获利额的情况下开一个相反的订单,而它确实这样做了。问题是它一次只能下一个订单,而它却下了多个。看一下报告,你可以看到订单6和7都是卖出,订单7应该是买入。

现在我已经把代码按功能写出来了。我有所有这些无效调用的原因是我想有一个完整的独立的工作区块,在这里我知道我在安排这个问题上有问题。...)我使用符号和魔法数字来保证EA只处理自己的订单。

主要的策略是(和块是由这个命令)。

1- 两个挂单在价格上方和下方。一旦价格触发了其中一个,相反的挂单就被删除。这是在工作。

2- 如果价格达到止盈点,那么订单就会被关闭,EA会重新启动两个挂单,这个过程会重新开始。这是在工作

2- 如果价格没有选择止盈,并且在止盈金额下降后反弹(对于买入订单),那么相反的卖出订单应该以相同的止盈金额开仓,并且手数大于前者。这是在工作,除了它放了一个以上的订单,从报告中可以看出,订单6和7都是卖出订单,应该只有一个,7应该是买入。

3- 一旦最后一个订单获利,所有未结订单都应关闭。这个过程就开始了。这就是工作。

4-在这个乒乓游戏中,人们应该期望最多有7次订单选择获利,如果没有,这些订单将被关闭。

例如,如果我们想获得2个点的利润,那么我们要等待价格达到3个点,然后在2个点的水平上设置一个止损线,这两个功能之一,即平衡或最低利润的跟踪止损。如果价格上涨(买入),那么止损线也会跟着上涨,一旦价格反弹1个点,订单就会关闭,因为它有利润,所有未结订单都会关闭。在这里我不确定这是否能正常工作。

谢谢

路易斯

好的,我想我找到了几个订单开仓的问题所在。我不得不在代码中加入这些内容(Negrito Italic)。

Open Opposite Order
 
   double  MartingaleBuyPrice = Ask+StopLevel;
   if(MartingaleBuyPrice<UpperStopLevel)MartingaleBuyPrice=UpperStopLevel+MinStop*pt;
   
   double MartingaleSellPrice= Bid-StopLevel;
   if(MartingaleSellPrice>LowerStopLevel)MartingaleSellPrice=LowerStopLevel-MinStop*pt;
   
   int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && ((OrderOpenPrice()-OrderClosePrice())/pt)> ReturnDist && SellTicket==0)
               {                
               Sell Ticket = OrderSend(Symbol(), OP_SELL, mlots, MartingaleSellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Sell Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && (OrderClosePrice()-OrderOpenPrice()/pt)> ReturnDist && BuyTicket==0)
               {               
               Buy Ticket = OrderSend(Symbol(), OP_BUY, mlots, MartingaleBuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Buy Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }
         }
      }
   }
//+------------------------------------------------------------------+  
void AddLimitsBuy()
                  {
                  OrderSelect(Buy Ticket,SELECT_BY_TICKET);
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                       RefreshRates();  
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) BuyStopLoss   = OpenPrice - (StopLoss * pt);
                  if(TakeProfit > 0)BuyTakeProfit = OpenPrice + (TakeProfit * pt);
                                      
                                      if(BuyStopLoss > 0 && BuyStopLoss > LowerStopLevel) 
                                              {                                 
                                                    BuyStopLoss = LowerStopLevel - MinStop*pt;
                                              }
                                      
                                      if(BuyTakeProfit > 0 && BuyTakeProfit < UpperStopLevel) 
                                              {
                                                     BuyTakeProfit = UpperStopLevel + MinStop*pt;
                                              }

                                      if(IsTradeContextBusy())Sleep(10);        

                  if(BuyStopLoss > 0 || BuyTakeProfit > 0) 
                     {          
                      OrderModify(Ticket,OP_BUY,BuyStopLoss,BuyTakeProfit,0);                            
                     }
                    } 
//+------------------------------------------------------------------+
void AddLimitsSell()
                  {
                  OrderSelect(Sell Ticket,SELECT_BY_TICKET);                 
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                      RefreshRates();   
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) SellStopLoss = OpenPrice + (StopLoss*pt);
                                      if(TakeProfit > 0) SellTakeProfit = OpenPrice - (TakeProfit*pt);
                                    
                                      if(SellStopLoss > 0 && SellStopLoss < UpperStopLevel) 
                                              {                                 
                                                    SellStopLoss = UpperStopLevel + MinStop*pt;
                                              }
                                      if(SellTakeProfit> 0 && SellTakeProfit > LowerStopLevel) 
                                              {
                                                    SellTakeProfit = LowerStopLevel - MinStop*pt;
                                              }
                                            
                                      if(IsTradeContextBusy()) Sleep(10);       

                  if(SellStopLoss > 0 || SellTakeProfit > 0) 
                    {           
                      OrderModify(Ticket,OP_SELL,SellStopLoss,SellTakeProfit,0);
                    }                    
                   }  


缺少报告文件