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

 

hata 1 normal hata ..

kural olarak, test cihazında gerçekleşmez (eğri kodu değişmeyen sipariş parametrelerini değiştirmedikçe veya test cihazı kayma üretebilirse).

gerçek piyasada, bu (doğru emir değiştirme koduyla), özellikle kayma kullanıldığında, stoplar piyasaya yakın değiştirildiğinde mümkündür - emir artıya geçtiğinde ve bunun nedeni ile stop loss'u fiyatın hemen arkasına taşırız. kayma ve fiyat hareketi kullanımı, hata sıklıkla oluşur ve nedeni anlaşılır.. iyi hata..

 
borilunad :

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

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

Boris , benim fOrderModify () yöntemimde, hem STOPLEVEL hem de FRIZLEVEL üzerindeki tüm kontroller dikkate alınır. Dolayısıyla, bu koşullardan herhangi birine uyulmazsa, değişiklik gelmeyecektir.

Renat :

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.

Bir seçenek olarak, hatanın üzerine yazmış olsam bile. Bu sonuncusu benim durumumda hala 1'dir. Değil mi?

Hatalarla çalışmasam bile. Ne demek istediğinizi bir örnekle gösterebilir misiniz?

İşte tüm baskılarla birlikte değişiklik işlevim. şu anda hata ayıklıyorum. ( İçinde kullanılan diğer yöntemlere dikkat etmeyin ).

 // 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, "; New_OOP = " , fd_OpenPrice, "; New_SL = " , fd_NewSL, "; New_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, "; New_OOP = " , fd_OpenPrice, "; New_SL = " , fd_NewSL, "; New_TP = " , fd_NewTP);
   
   ResetLastError ();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2 ];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())
   {
       static int i = 0 ;
      
       if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP)) {
       ResetLastError ();
      
       Print ( __FUNCTION__ , ": " , " i = [" , IToS (i), "] Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
       Print ( __FUNCTION__ , ": " , "Тикет № " , fi_Ticket, "; New_OOP = " , fd_OpenPrice, "; New_SL = " , fd_NewSL, "; New_TP = " , fd_NewTP);
      
      i++;
      
       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, "; New_OOP = " , fd_OpenPrice, "; New_SL = " , fd_NewSL, "; New_TP = " , fd_NewTP);
         return ( false );
      }
      }
   }
   
//---- Выполняем модификацию в on-line торговле
   while (IsTradeAllowed() == true )
   {
       if (!IsExpertEnabled() || IsStopped () || li_Cnt > 200 )
      {
         CLogs.WriteLog ( StringConcatenate ( "Error: Trying to modify ticket #" , fi_Ticket, ", which is " , GetNameOP (SPos.gi_Type), " NOT IsTradeContextBusy" ));
 
         if (!IsExpertEnabled()) {CLogs.WriteLog ( "Permit ExpertEnabled !!!" );}
             return ( false );
      }
   
       if (OrderModify (fi_Ticket, fd_OpenPrice, fd_NewSL, fd_NewTP, fdt_Expiration, fc_Arrow))
      {
         break ;
      }
   
       if (CErrs.ErrorHandling ( _LastError , lb_InvalidSTOP))
         break ;
 
      CLogs.WriteLog ( StringConcatenate ( "Error Occured : " , CErrs.ErrorToString ( _LastError )));
      CLogs.WriteLog ( StringConcatenate ( "fOrderModify(): " , SPos.gs_Symbol, "# " , fi_Ticket, "/" , GetNameOP (SPos.gi_Type), " | Price = " , DToS (fd_OpenPrice), " | SL = " , DToS (fd_NewSL), " | TP = " , DToS (fd_NewTP)));
   
       if (lb_InvalidSTOP)
      {
         RefreshRates();
 
         ld_Price = CBase.GetTradePrice (SPos.gi_Type % 2 , true , SPos.gs_Symbol);
 
         if (SPos.gi_Type < 2 )
         {
            CheckValidStops (ld_Price, SPos.gi_Type, fd_NewSL, fd_NewTP, false );
         }
         else
         {
            CheckValidOOP (SPos.gs_Symbol, SPos.gi_Type, fd_OpenPrice, fd_NewSL, fd_NewTP, ld_Price, lb_FixInvalidPrice);
         }
      }
      li_Cnt++;
   
       if (NumberOfTry < li_Cnt)
           return ( false );
   }
//---- Контролируем возможные ошибки
   if ( _LastError > 0 )
       CLogs.Printing ( StringConcatenate ( "ls_fName => " , CErrs.ErrorToString ( _LastError )));
//----
   return ( true );
}
 
Victor, ilk mesajın zaten gerekli tüm bilgileri içeriyordu. Bu siparişin parametreleri için herhangi bir yeni değer içermeyen bir siparişi değiştirmek için siparişleri göndermeniz yeterlidir.
 

Sunucu yanıt verir: Neye ihtiyacın var, yaşlı adam?

Ya da: Bana neye ihtiyacın olduğunu söyle, belki sana istediğini veririm.

 

Herhangi bir eleştiri ya da sade Rus "merci"sini beklemedim. Yazık kızlar...

 
tara :

Herhangi bir eleştiri ya da sade Rus "merci"sini beklemedim. Yazık kızlar...

ama ne için?
 
Evet...
 
borilunad :

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

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

Boris, hiç bir formanın içine bekleyen bir emir verme fırsatı gördün mü? Ve neden buraya bağladığınız bu dist'in New_OOP'u içermediğine karar verdiniz?
 
tara :
Victor, ilk mesajın zaten gerekli tüm bilgileri içeriyordu. Bu siparişin parametreleri için herhangi bir yeni değer içermeyen bir siparişi değiştirmek için siparişleri göndermeniz yeterlidir.

Boris, bunun böyle olduğunu varsayalım... Varsayalım. Ancak, fonksiyon bir emir değiştirme emrini yeniden gönderirse, değiştirilmesi gerekir. Ve hiç değiştirmiyorum. Logdaki loga baksak bile şunu göreceğiz:

modify # 2 sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1
Sipariş neden gönderiliyor? Eğer doğru parametrelere sahip değilse, fonksiyon lanetleyecektir... Ve sonra OK... gönderilmiş gibidir. Sonra bir hata olduğu ortaya çıktı.. Mantık nedir?
 

Ve hatalar nerede? Buraya, düzeltme işlevinden hemen önce hataların çıktısını koydum:

 //---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())
   {
       if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP)) {
       ResetLastError ();
      
       Print ( __FUNCTION__ , ": " , " i = [" , IToS (i), "] Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
       Print ( __FUNCTION__ , ": " , "Тикет № " , fi_Ticket, "; New_OOP = " , fd_OpenPrice, "; New_SL = " , fd_NewSL, "; New_TP = " , fd_NewTP);
       Print ( __FUNCTION__ , ": " , "_LastError = " , _LastError );                    \\ ВОТ ТУТ Я ПРОВЕРЯЮ НАЛИЧИЕ ОШИБКИ ПЕРЕД СЛЕДУЮЩЕЙ ФУНКЦИЕЙ МОДИФИКАЦИИ!!!
      
       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, "; New_OOP = " , fd_OpenPrice, "; New_SL = " , fd_NewSL, "; New_TP = " , fd_NewTP);
         return ( false );
      }
      }
   }

Ve işte bu kod parçasının günlüğü:

0        11 : 45 : 28          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; New_OOP = 1.34048 ; New_SL = 1.34125 ; New_TP = 1.33362
0        11 : 45 : 28          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify:  Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 0.0 ; OrderTakeProfit() = 0.0
0        11 : 45 : 28          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2 ; New_OOP = 1.34048 ; New_SL = 1.34125 ; New_TP = 1.33362
0        11 : 45 : 28          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: _LastError = 0
2        11 : 45 : 28          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        11 : 45 : 28          2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
Değişiklik fonksiyonundan önce herhangi bir hata olmadığı açıkça görülebilir! Ve işte hatalar???