这使顾问无法赚钱。 - 页 4

 
FAQ:

...请 :

全局变量和局部变量中的大多数一半都是未初始化的--我确信它们在某些时候包含了很多垃圾。

你从来没有通过OrderSelect()检查过一个订单是否被选中,我们甚至根本没有说要检查它是否打开或关闭。

我没有注意到交易功能前的任何报价更新...

GetLastError在打开/关闭前没有被重置,但它被检查过--同样,变量中会有垃圾的情况。

关闭时你不检查和规范价格

你想继续吗?

请讲。

非常有用。

 

在这里https://www.mql5.com/ru/forum/137651/page3,我发布了我的关闭功能

用print代替GetInfo(), Fun_Error() = ErrorDescription()

 
FAQ:

你从不检查订单是否被OrderSelect()选中。


说实话,我不太明白,如果在选择订单 时返回一个值--false--该怎么做。

假的是否意味着在MODE_TRADES中100%没有?

我根据你的建议重新绘制了开单代码,坦率地说,我没有碰过专家顾问的配置,所以我很好奇,让我们看看... 它是会卖出去还是会再获利?

 
valenok2003:


说实话,我不太明白如果在选择订单时返回false该怎么办。

假的是否意味着在MODE_TRADES中100%没有?


这意味着100%不能对订单做任何事情,因为它没有被选中。
 
PapaYozh:

这意味着100%不能对它[订单]做什么,因为它没有被选中。



对... 哦,伙计...但如果没有被选中,那就是一个错误,不是吗?必须采取一些措施...

例如,请看这个函数。

//+-------
//+------------------------------------------------------------------+
//|   valenok2003@mail.ru                                05.07.2011
//+------------------------------------------------------------------+
//| check_open_order() ПРОВЕРКА реального открытия рыночного ордера по тикету
//| Требует:
//| - тикет ордера 
//| Возвращает тикет открытого ордера или -1
//+------------------------------------------------------------------+
int check_open_order(int _Ticket)
{  string _Function = "check_open_order(): ";
//-----------------
   if(_Ticket > 0) {  
      OrderSelect(_Ticket,SELECT_BY_TICKET);             
      if(OrderType() <= 1) {  
         output_mov_string(order_type_in_txt(OrderType())+ " успешно открыт!", Clr_Report);
         output_sound(Name_Sound_Open);
         OrderPrint();
//-----------------         
         for(int _n = 0; _n < MAX_ORDERS; _n++)  {
            // Если место свободно
            if(Arr_Tickets[_n] == 0)   {
               // Создаём запись об ордере
               Arr_Tickets[_n] = OrderTicket();
               break;
            }
         }
      }
      else _Ticket = -1;
   }
//-----------------
   return(_Ticket);
}
//+-------------------------------------------------------------------
//+-------
如果订单没有被选中,我应该返回-1。而如果因为其他原因没有被选中--例如,某种故障,但订单是开放的,那么我应该怎么做?
 
valenok2003:


对...哦,伙计...但如果没有被选中,那就是某种错误,不是吗?必须采取一些措施...


它可能不会被选中。

1)因为专家顾问的代码有错误。

2)由于EA无法控制的情况而关闭(触发SL/TP,手动关闭,由EA关闭)。

 
valenok2003:


对...哦,伙计...但如果没有选择,就会出现错误,不是吗?必须采取一些措施...

你是在跟我开玩笑还是认真的?

暂停并再次选择。我是这样组织的,它在网上运行。

// ------------------------------------------------Ищем наш ордер---------------------------------
   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber)) continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL)) continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера          
          if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера   
...
...
...
                  
 
Roman.:

你是在跟我开玩笑还是认真的?

暂停并再次选择。我是这样组织的,它在网上运行。

我在那里补充了我的帖子。

你要选择多少次?

 
valenok2003:

我在那里补充了我的帖子。

那么要选择多少次呢?

在这之前。直到它在一个循环中被选中。

if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера                     
                if (orderType == OP_BUY) 
                   {                
                     
                   }
            
                if (orderType == OP_SELL) 
                   {        
                   
                   }   
                            
              }
 
PapaYozh:


它可能不会被选中。

1)因为EA代码中的一个错误。

这是很清楚的

2)由于EA无法控制的情况而关闭(SL/TP被触发,手动关闭,由EA关闭)。

只有这两个原因,还是有其他原因?