そのため、アドバイザーがお金を稼ぐことができなくなります。 - ページ 4

 
FAQ:

...をお願いします。

グローバル変数もローカル変数も半分は初期化されていないものがほとんどです。いつの間にかゴミがたくさん入っているんでしょうね。

OrderSelect()で注文が選択されているかどうかを確認することはなく、オープンかクローズかを確認する話も全くしていません。

取引機能の前に相場が更新されていることに気づいていない...。

GetLastErrorはオープン/クローズ前にリセットされませんが、チェックされます - 再び、変数にゴミが入るケースがあります。

決算時に価格を確認し、正常化させない

続けますか?

どうぞ。

とても便利です。

 

こちらhttps://www.mql5.com/ru/forum/137651/page3 私のクロージング機能を掲載しました。

GetInfo()をprintに置き換え、Fun_Error() = ErrorDescription()とする。

 
FAQ:

OrderSelect()で注文が選択されているかどうかを確認することはありません。


正直なところ、注文が選択さ れたときに値 - false - が返された場合、どうすればいいのかよくわかりません。

falseは、MODE_TRADESの中で100%無いという意味ですか?

お勧めの方法に従って、注文の開始コードを書き直しました。率直に言って、Expert Advisorの設定には手をつけていませんので、気になるところです...。 売り切れるのか、それとももう一儲けするのか。

 
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) Expert Advisorのコードにバグがあるため。

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:

そこで補足しておきました。

そして、何回選べばいいのか?

BEFOREループで選択されるまで

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がクローズした)。

この2つだけなのか、それとも他に理由があるのか?