Siparişleri değiştirirken 1 numaralı hata - sayfa 2

 
borilunad :
Victor, Renat, genel olarak, sizi doğru bir şekilde kaydetti, Alexey gerekli son kontrolü gösterdi ve daha önce, anlamın belirsizliğini önlemek için ve herhangi bir koşulu kaçırmadan her parametre için gerekli tüm kontrolleri tüm nüanslarla yapın!
Ve bunun kullanımı nedir? Sonuçta her fonksiyonda _LastError değerini sıfırlıyorum. Her zaman hafızamda kalmıyor...
 
hoz :
Ve bunun kullanımı nedir? Sonuçta her fonksiyonda _LastError değerini sıfırlıyorum. Her zaman hafızamda kalmaz...
Üzgünüz, fonksiyonlarınızın ve kontrollerinizin kurbanısınız! Faiz için tablodaki bilgileri görüntüleyin, hata kontrollerini yalnızca ticaret fonksiyonlarından sonra yazdırın!
 
evillive :
3 parametreden hiçbiri değişmediyse, OrderModify'a dokunulması gerekmediği için başka bir kontrol gereklidir.

Seni anladım. Yardım etmedi. İşte benim modifikasyon yöntemimden bir kod parçası:

   ResetLastError ();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2 ];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())         \\ Если работаем в тестере...
   {
       if ((OrderOpenPrice() != fd_OpenPrice) || (OrderStopLoss() != fd_NewSL) || (OrderTakeProfit() != fd_NewTP))
      
       if (!OrderModify (fi_Ticket, fd_OpenPrice, fd_NewSL, fd_NewTP, fdt_Expiration, fc_Arrow))
      {
         CLogs.WriteLog ( StringConcatenate ( "fOrderModify(): " , CErrs.ErrorToString ( _LastError )));
         Print ( __FUNCTION__ , ": " , "После модификации тикета № " , fi_Ticket);
         Print ( __FUNCTION__ , ": " , "Тикет № " , fi_Ticket, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);
         return ( false );
      }
   }
Burada hata değerinin sıfırlandığını açıkça görebilirsiniz.

Sonra piyasa bilgilerini alır. Eğer değişiklik test cihazındaysa... o zaman... Alexey tarafından önerilen kontrolü yapıyorum ve.. eğer değişiklik başarılı değilse, o zaman... günlüğü yazıp günlüğe yazdırıyoruz..

Genel olarak ResetLastError() arasında herhangi bir hata olmadığı aşikardır.. Yanlış olacak bir durum yok.

dergi:

0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.34048 ; SL = 1.34125 ; TP = 1.33362
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вошли в функцию
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2 ; fd_NewOpenPrice = 1.34048 ; fd_NewSL = 1.34125 ; fd_NewTP = 1.33362
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: fi_Type > 2 = true
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2 ; fd_NewOpenPrice = 1.34048 ; fd_NewSL = 1.34125 ; fd_NewTP = 1.33362
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вышли из функции
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: После проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.34048 ; SL = 1.34125 ; TP = 1.33362
2        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: modify # 2 sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
3        20 : 24 : 08          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
 
hoz :

Seni anladım. Yardım etmedi. İşte benim modifikasyon yöntemimden bir kod parçası:

Burada hata değerinin sıfırlandığını açıkça görebilirsiniz.

Sonra piyasa bilgilerini alır. Eğer değişiklik test cihazında ise... o zaman... Alexey tarafından önerilen kontrolü yapıyorum ve.. eğer değişiklik başarılı değilse, o zaman... logu yazıp günlüğe yazdırıyoruz..

Genel olarak ResetLastError() arasında herhangi bir hata olmadığı aşikardır.. Yanlış olacak bir durum yok.

dergi:

OOP, SL ve TP'nin önceki değerlerini değişiklikten önce log'a çıkarmak gerekir, aniden yenileriyle çakışırlar, o zaman 1 No'lu hatanın nedeni daha net olacaktır.
 

Yani her şey...

EA'da sınıf yöntemini şöyle çağırırım:

 if (OrderType() == OP_SELLLIMIT)
      {
         if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[ 11 ]))
            New_OOP = ND (fd_MurreyLevelsValue[ 11 ]);
         else New_OOP = OrderOpenPrice();
         if (OrderStopLoss() != ND (fd_MurreyLevelsValue[ 12 ]))
            New_SL = ND (fd_MurreyLevelsValue[ 12 ]);
         else New_SL = OrderStopLoss();
         if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[ 2 ]))
            New_TP = ND (fd_MurreyLevelsValue[ 2 ]);
         else New_TP = OrderTakeProfit();
         
         Print ( __FUNCTION__ , ": " , "New_OOP = " , New_OOP, "; New_SL = " , New_SL, "; New_TP = " , New_TP);
         Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
             
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[ 11 ])
         {
             if (New_OOP < Bid) continue ;
            
             if (!CPosMan.fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
            {
               if ( _LastError != 0 )
                  CLogs.WriteLog ( StringConcatenate ( __FUNCTION__ , ". В строке " , __LINE__ , " " , CErrs.ErrorToString ( _LastError )),
                                  CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
            }
             else
            {
               Print ( __FUNCTION__ , ": " , "Модификация тикета №" , OrderTicket(), " успешно завершена!" );
               Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
            }
         }
      }

İşte sınıfın ilgilendiğimiz kısmı:

 // 1.2 Функция модифицирует выделенный ордер (установка TP и SL). =========================================================================
bool PositionsManipulations::fOrderModify ( int        fi_Ticket,             // OrderTicket()
                                           double     fd_OpenPrice,           // OpenPrice
                                           double     fd_NewSL,               // Новый StopLoss (УРОВЕНЬ !!!)
                                           double     fd_NewTP,               // Новый TakeProfit (УРОВЕНЬ !!!)
                                           datetime   fdt_Expiration = 0 ,     // Время истечения отложенного ордера
                                           color      fc_Arrow = CLR_NONE)   // Цвет стрелок модификации StopLoss и/или TakeProfit на графике
{
   Print ( __FUNCTION__ , ": " , "Вошли в функцию " );

//---- Проверяем необходимость модификации
   if (fd_NewSL == OrderStopLoss() && fd_NewTP == OrderTakeProfit())
       return ( false );
//----
   string ls_fName = "fOrderModify()" ;
   int     li_Cnt = 0 ;
   double ld_Price;
   bool    lb_InvalidSTOP = false ,
          lb_FixInvalidPrice = false ;     // Флаг первоначальной коррекции отложки

//---- Получаем актуальную информацию по символу и текущему ордеру
   CBase.GetMarkerInfo (OrderSymbol(), fi_Ticket);
   
   Print ( __FUNCTION__ , ": " , "До проверки на FREEZELEVEL и STOPLEVEL  тикета № " , fi_Ticket);
   Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
   Print ( __FUNCTION__ , ": " , "Тикет № " , fi_Ticket, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);
//---- Проверяем на условия FREEZELEVEL и STOPLEVEL
   if (!CheckLevelsBLOCK ( 3 , SPos.gs_Symbol, SPos.gi_Type, fd_OpenPrice, fd_NewSL, fd_NewTP, lb_FixInvalidPrice))
   {
       if ( StringLen (CErrs.ErrInf) > 0 )
      {
         CLogs.WriteLog (CErrs.ErrInf);
         return ( false );
      }
   }
   Print ( __FUNCTION__ , ": " , "После проверки на FREEZELEVEL и STOPLEVEL  тикета № " , fi_Ticket);
   Print ( __FUNCTION__ , ": " , "Тикет № " , fi_Ticket, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);
   
   ResetLastError ();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2 ];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())
   {
       if ((OrderOpenPrice() != fd_OpenPrice) || (OrderStopLoss() != fd_NewSL) || (OrderTakeProfit() != fd_NewTP))
      
       if (!OrderModify (fi_Ticket, fd_OpenPrice, fd_NewSL, fd_NewTP, fdt_Expiration, fc_Arrow))
      {
         CLogs.WriteLog ( StringConcatenate ( "fOrderModify(): " , CErrs.ErrorToString ( _LastError )));
         Print ( __FUNCTION__ , ": " , "После модификации тикета № " , fi_Ticket);
         Print ( __FUNCTION__ , ": " , "Тикет № " , fi_Ticket, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);
         return ( false );
      }
   }

İşte günlüğün bir kısmı:

0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Выбран тикет № 2
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 1.34125 ; OrderTakeProfit() = 1.33362
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: New_OOP = 1.3401 ; New_SL = 1.34048 ; New_TP = 1.33667
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 1.34125 ; OrderTakeProfit() = 1.33362
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 1.34125 ; OrderTakeProfit() = 1.33362
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.3401 ; SL = 1.34048 ; TP = 1.33667
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вошли в функцию
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2 ; fd_NewOpenPrice = 1.3401 ; fd_NewSL = 1.34048 ; fd_NewTP = 1.33667
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: fi_Type > 2 = true
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Ещё Чутка дальше
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2 ; fd_NewOpenPrice = 1.3401 ; fd_NewSL = 1.34048 ; fd_NewTP = 1.33667
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вышли из функции
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: После проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.3401 ; SL = 1.34048 ; TP = 1.33667
2        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: modify # 2 sell limit 0.10 EURUSD at 1.34010 sl: 1.34048 tp: 1.33667 ok
3        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
 

Açıklamama izin ver. Değişiklik, fOrderModify() yönteminde gerçekleşir. Bu fOrderModify() yöntemine girişte, gövdenin başında, order parametrelerinin mevcut değerleri ve yeni planlananlar yazdırılır. Görülebilir:

   Print ( __FUNCTION__ , ": " , "До проверки на FREEZELEVEL и STOPLEVEL  тикета № " , fi_Ticket);
   Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
   Print ( __FUNCTION__ , ": " , "Тикет № " , fi_Ticket, "; OOP = " , fd_OpenPrice, "; SL = " , fd_NewSL, "; TP = " , fd_NewTP);

Günlükteki bu parça:

 0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 1.34125 ; OrderTakeProfit() = 1.33362
0        21 : 11 : 44          2013.08 . 26 09 : 45   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; OOP = 1.3401 ; SL = 1.34048 ; TP = 1.33667
Parametrelerin farklı olduğu görülebilir. Herhangi bir sorun olmamalı.
 
hoz :

Yani her şey...

EA'da sınıf yöntemini şöyle çağırırım:

İşte sınıfın ilgilendiğimiz kısmı:

İşte günlüğün bir kısmı:

Bir şey anlamıyorum, sipariş beklemedeyse Bid'in bununla ne ilgisi var?

 if ( OrderType() == OP_SELLLIMIT )
      {
         if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[ 11 ]))
            New_OOP = ND (fd_MurreyLevelsValue[ 11 ]);
         else New_OOP = OrderOpenPrice();
         if (OrderStopLoss() != ND (fd_MurreyLevelsValue[ 12 ]))
            New_SL = ND (fd_MurreyLevelsValue[ 12 ]);
         else New_SL = OrderStopLoss();
         if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[ 2 ]))
            New_TP = ND (fd_MurreyLevelsValue[ 2 ]);
         else New_TP = OrderTakeProfit();
         
         Print ( __FUNCTION__ , ": " , "New_OOP = " , New_OOP, "; New_SL = " , New_SL, "; New_TP = " , New_TP);
         Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
             
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[ 11 ])
         {
             if ( New_OOP < Bid ) continue ;
            
             if (!CPosMan.fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
            {
               if ( _LastError != 0 )
                  CLogs.WriteLog ( StringConcatenate ( __FUNCTION__ , ". В строке " , __LINE__ , " " , CErrs.ErrorToString ( _LastError )),
                                  CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
            }
             else
            {
               Print ( __FUNCTION__ , ": " , "Модификация тикета №" , OrderTicket(), " успешно завершена!" );
               Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
            }
         }
      }


Teklif her zaman SellLimit'ten daha düşüktür, if(New_OOP < Bid) satırı asla doğru olmaz... buna göre değişiklik sorunsuz gider.

 
hoz :

Ve ayrıca bir dizi hata alabilir mi? Sonuçta, belgeler siyah beyaz olarak _LastError değişkeninin son hatanın numarasını sakladığını söylüyor. Ve sıfırlaması ResetLastError() işlevi tarafından gerçekleştirilir. _LastError çağrıları arasında daha fazla hata yoksa, _LastError son hatanın değerini depolar. Yol boyunca daha fazla hatam olmadı. Ve mesele bu değil.

Kesinlikle yanılıyorsunuz. Son hata hala birçok önemli fonksiyonda sıfırlanıyor. Bu, WinAPI'de de çalışır.

Bu nedenle, hata kodunu oluştuktan hemen sonra yerel bir değişkende saklayın ve birçok ara işlevinizde bu sistem değişkenini on kez temizledikten sonra kullanmaya çalışmayın.

 

Üzgünüz, SellLimit mesafenizi korumanızı gerektiriyor:

değil ( New_OOP <Teklif ) devam ederse ; ve ( New_OOP -dist*Point < Bid ) devam ederse ;

 
hoz :

Bu lanet hata nasıl kaldırılır? O beni çoktan yakaladı. Fonksiyonun her giriş parametresini kontrol ediyorum. Şu anda elimde şu şekilde:

Onlar. parametre değiştirilmediyse, değiştirmeye gerek yoktur. Bunu daha önce hiç yapmadım, ama...

Ardından parametrelerim şu şekilde sipariş değiştirme yöntemine iletilir:

Hv günlük çıktısı:

Günlüğün, değişiklik gibi bildirildiği ortaya çıktı: Tamam ve ardından ... bir hata. Ayarların hiçbiri değişmedi.

Sipariş beklemede. Böylece açılış fiyatını değiştirebilir, durdurabilir ve alabilirsiniz. Ve bu, anladığım kadarıyla belgelerle çelişmedi.

Kim benzerleriyle karşılaştı? Nasıl karar verilir?

Ve parametrelerden hiçbiri değiştirilmediyse gecikmeleri değiştirmeye çalışmazsınız.