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

 
hoz :

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:

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?

Sadece açıldı! Victor, eğer "tamam" ise, o zaman bazı parametreler değişmiştir ve hata 1 almak, parametrelerden birinin değiştirilmesinin istendiği, ancak değiştirilmediği anlamına gelir. Bu yüzden bu tür durumlardan kaçınmak için mantığınızı düzeltmeniz gerekiyor, ancak gerçek hayatta tüm bu yanlışlıklar tekrar alıntılara ve bir sürü hataya dönüşecek!

Her şeyin farklı yerlere dağıldığı bu tür bir programlama kullanmadığımı biliyorsunuz. Programı mantıklı bir senaryo olarak yazıyorum, tüm olaylar sırayla gelişiyor ve her şey her koşulda gözümün önünde, bir şey aramak için didinmeye gerek yok. Son eylemi gerçekleştirmek ve hataları kontrol etmek için harici işlevleri kullanıyorum.

Ve acemiler için neye sahip olduğun ve nerede kontrol edildiği belli değil, her şey gizli, git tahmin et, gerekli koşulu geçtin mi, geçmedin mi?! Her nasılsa, şu anda sahip olduğum gibi çok fazla kelime var, ancak programınız özü aktarmıyor. Açık ve net olmalı!

 

Boris, elbette, her şeyin benim için tek bir yerde olmadığını anlıyorum. Ancak, değiştirme işlevinden hemen önceki giriş parametreleri yazdırılır. ekran görüntüsü attım. Mevcut ve yeni OOP, SL ve TP var. Ve hepsi farklı. Her şey yakındaysa neden ormana tırmanalım? Yazdırılırsa ve parametrelerin farklı olduğunu görebiliyorsanız, bunlar gerçekten farklıdır. Ya da belki baskıya güvenmemek?

 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
2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify:  Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 0.0 ; OrderTakeProfit() = 0.0
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
2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: _LastError = 0
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
2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1

Ve ondan önce, yukarıda gösterdiğim gibi bir kontrol var:

 if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP))
{
 ... Ес ли какой-то из параметров отличается от нового, значит выполняется эт о условие.. .
}

Ne kadar daha spesifik? Sonra yukarıdan birkaç palyaço masal yazmaya başladı. Görünüşe göre ne sorduğumu anlamak istemiyorlar ya da anlamak istemiyorlar. Yani sebepsiz yere gülüyorlar. Ve soru ilginç.

Sonuçta, örneğin farklı türde bir parametreyi veya yanlış numarayı veya hatta diğer seçenekleri OrderModify()'a gönderirseniz, hemen hatalar oluşur. Ve burada yürütülür, Tamam gibi yazar ve sonra hiçbir parametrenin değiştirilmediği ortaya çıkar.

Soru, orada neyin yanlış olduğunu nasıl bulacağımızdır? Sonuçta, işlevimi yayınladım. Orada her şey net olmalı. İşte burada:

 // 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())
   {
       if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP))
      {
       ResetLastError ();
      
       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);
       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 );
      }
      }
   }
   

Tüm satırları özellikle yorumladım. Kodu karıştırmak kolaydır. Herhangi bir yorumunuz varsa, lütfen yardım edin.

 
hoz :

Boris, elbette, her şeyin tek bir yerde olmadığını anlıyorum. Ancak, değiştirme işlevinden hemen önceki giriş parametreleri yazdırılır. ekran görüntüsü attım. Mevcut ve yeni OOP, SL ve TP var. Ve hepsi farklı. Her şey yakındaysa neden ormana tırmanalım? Yazdırılırsa ve parametrelerin farklı olduğunu görebiliyorsanız, bunlar gerçekten farklıdır. Ya da belki baskıya güvenmemek?

Ve ondan önce, yukarıda gösterdiğim gibi, bir kontrol var:


Her şey

Maalesef bunu anlayamıyorum çünkü döngüdeki koşulları göremiyorum, bu da sipariş parametrelerinin birbiriyle karıştırılmamasını sağlıyor!

Bir hatanın varlığı, bir yerde mantıksal bir hata yaptığınızı gösterir. Ama aynı zamanda programın çalıştığını söylüyor ama biz programın kalitesiyle ilgileniyoruz!

 
borilunad :

Maalesef bunu anlayamıyorum çünkü döngüdeki koşulları göremiyorum, bu da sipariş parametrelerinin birbiriyle karıştırılmamasını sağlıyor!

Bir hatanın varlığı, bir yerde mantıksal bir hata yaptığınızı gösterir. Ama aynı zamanda programın çalıştığını söylüyor ama biz programın kalitesiyle ilgileniyoruz!


Emirli tüm işlemler bir döngüde gerçekleşir! Bu, kodunu yukarıda verdiğim fOrderModify() yönteminin çağrıldığı yerdir:

 //+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                   Перенос лимитных ордеров по сигналу                                                 |
//+---------------------------------------------------------------------------------------------------------------------------------------+
void MovingLimitPositions ( const double & fd_MurreyLevelsValue[])
{
   double New_OOP = 0.0 ,
          New_SL = 0.0 ,
          New_TP = 0.0 ;
   int     Ticket = - 1 ;
   
   for ( int i= 0 ; i< 13 ; i++)
   {
       Print ( __FUNCTION__ , ": " , "fd_MurreyLevelsValue[" +IToS (i)+ "] = " , DToS (fd_MurreyLevelsValue[i]));
   }

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
      New_OOP = 0.0 ;
      New_SL = 0.0 ;
      New_TP = 0.0 ;
      
       ResetLastError ();
      
       if (!CPosMan.CheckMyOrdersBased(i, 7 )) continue ;
       if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue ;

      Ticket = OrderTicket();

       Print ( __FUNCTION__ , ": " , "Выбран тикет № " , OrderTicket());
       Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
          
       if (OrderType() == OP_BUYLIMIT)
      {
         if (ND (OrderOpenPrice()) != ND (fd_MurreyLevelsValue[ 1 ]))
            New_OOP = ND (fd_MurreyLevelsValue[ 1 ]);
         else New_OOP = ND (OrderOpenPrice());
         if (ND (OrderStopLoss()) != ND (fd_MurreyLevelsValue[ 0 ]))
            New_SL = ND (fd_MurreyLevelsValue[ 0 ]);
         else New_SL = ND (OrderStopLoss());
         if (ND (OrderTakeProfit()) != ND (fd_MurreyLevelsValue[ 10 ]))
            New_TP = ND (fd_MurreyLevelsValue[ 10 ]);
         else New_TP = ND (OrderTakeProfit());
         
         Print ( __FUNCTION__ , ": " , "New_OOP = " , New_OOP, "; New_SL = " , New_SL, "; New_TP = " , New_TP);
         
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[ 1 ])
         {
             if (!CPosMan.fOrderModify (OrderTicket(), 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(), " успешно завершена!" );}
         }
      }
      
       if (OrderType() == OP_SELLLIMIT)
      {
         if (ND (OrderOpenPrice()) != ND (fd_MurreyLevelsValue[ 11 ]))
            New_OOP = ND (fd_MurreyLevelsValue[ 11 ]);
         else New_OOP = ND (OrderOpenPrice());
         if (ND (OrderStopLoss()) != ND (fd_MurreyLevelsValue[ 12 ]))
            New_SL = ND (fd_MurreyLevelsValue[ 12 ]);
         else New_SL = ND (OrderStopLoss());
         if (ND (OrderTakeProfit()) != ND (fd_MurreyLevelsValue[ 2 ]))
            New_TP = ND (fd_MurreyLevelsValue[ 2 ]);
         else New_TP = ND (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 (!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());
            }
         }
      }
   }
   Print ( __FUNCTION__ , ": " , "OUT OF FUNCTION" );
}

Orada her şey görülebilir... Döngünün her yinelemesinden sonra hatanın sıfırlandığı da açıktır. Bu, bir önceki siparişteki hatanın, eğer varsa, bir sonrakine atlamamasını sağlar (tabii değerini kastediyorum)

Nerede daha kolay olabilir? Burada herşey çok basit..

 

bir mesaj buldum

Aynı terminal hatası var. Hiç böyle bir şeyim olmadı. Çünkü Daha önce bekleyen emirlerin 3 parametresini (OOP, SL ve TP) aynı anda değiştirmeye çalışmadım. Bu yüzden aldı ... Ve bir hatayla karşılaştım.

Anladığım kadarıyla, örneğin açılış fiyatı ve stop loss değişmediyse ve bunların yerine aynı değerler alındıysa, ancak alım değişti. Bu da bir hataya neden oluyor mu? Sonra belgelerin çarpık olduğu ortaya çıkıyor. Ve bu an desteklenmiyor ya da ne?

 
hoz :

bir mesaj buldum

Aynı terminal hatası var. Hiç böyle bir şeyim olmadı. Çünkü Daha önce bekleyen emirlerin 3 parametresini (OOP, SL ve TP) aynı anda değiştirmeye çalışmadım. Bu yüzden aldı ... Ve bir hatayla karşılaştım.

Anladığım kadarıyla, örneğin açılış fiyatı ve stop loss değişmediyse ve bunların yerine aynı değerler alındıysa, ancak alım değişti. Bu da bir hataya neden oluyor mu? Sonra belgelerin çarpık olduğu ortaya çıkıyor. Ve bu an desteklenmiyor ya da ne?

Her tikte mesafeyi de kontrol ediyor musun?! Uzun zamandır bir TF çubuğunun açılışında emir açmayı ve sadece M1'deki bir çubuğun açılışında değiştirmeyi ve kapatmayı bir kural haline getirdim! Yukarıdaki kod bana yapılan iş için her şeyin var gibi göründüğü, ancak belirli bir şeyin olmadığı bir raporu hatırlatıyor! Tüm eylemleri belirli koşullara göre tanımladığınız bir döngü görmüyorum! Sadece bana neyin değiştirilmesi gerektiğini söyleyen bir döngü görüyorum, sonra sadece değiştirmeyin ve hiçbir hata olmayacak.

Hatalarınızın küresel düzeyde yapılması gerekenler ve yerel düzeyde neler yapılması gerektiği konusundaki kafa karışıklığından kaynaklanabileceğine ve hataların her zaman sonuncusu olduğuna, öncekilerin, işlevden çıkıldığında katılımınız olmadan sıfırlandığına dair Renat'ın önemli açıklamasına dikkat edin. !

 
borilunad :

Her tikte mesafeyi de kontrol ediyor musun?!

Değil! Yalnızca koşul karşılandığında değişiklik yapma iznim var. Bu durumda, değişiklik koşulu, hesaplanan seviyelerde bir değişikliktir. Bunun gibi:

 void OnTick ()
{
   static double FirstInd = 0.0 ;                    // Переменная, которая хранит значение 1-ого индекса массива
   double MurreyLevelsValue[ 13 ];                    // Массив значений уровней
   GetDataFromIndicator (MurreyLevelsValue);        // Функция, которая получает значения из индикатора уровней
   
   if (gdt_LastBarTime <= Time[ 0 ])
   {
      OTotal = CPosInf.FindPositions (AmountPosByType);   // Получаем количество позиций( по типам ).
      
      GetTradeSignal (MurreyLevelsValue);
      
      gdt_LastBarTime = Time[ 0 ];
   }

   if (FirstInd != ND (MurreyLevelsValue[ 1 ]))      // Если значений текущего состояния переменной FirstInd не равно новому рассчитанном, то.. 

   {
      MovingLimitPositions (MurreyLevelsValue);     // ..модифицируем ордер новым значением
      FirstInd = ND (MurreyLevelsValue[ 1 ]);
   }
}

Sadece? Sadece....

borilunad :


Uzun zamandır bir TF çubuğunun açılışında emir açmayı ve sadece M1'deki bir çubuğun açılışında değiştirmeyi ve kapatmayı bir kural haline getirdim! Yukarıdaki kod bana yapılan iş için her şeyin var gibi göründüğü, ancak belirli bir şeyin olmadığı bir raporu hatırlatıyor! Tüm eylemleri belirli koşullara göre tanımladığınız bir döngü görmüyorum! Sadece bana neyin değiştirilmesi gerektiğini söyleyen bir döngü görüyorum, sonra sadece değiştirmeyin ve hiçbir hata olmayacak.

Ben de sadece M1'in açılışında değişiklik yapmak için benzer düşüncelerim vardı ve bu, değişiklik önceden belirlenmiş bir değerle gerçekleştirilirse geçerlidir. Ancak bu verileri M1'de kontrol etmem gerekmediği durumlar var. Örneğin, durağım zaten hesaplanmış bir seviyede takip ediyor. Ardından, yukarıda gösterdiğim gibi OnInit() işlevinde bir kontrolüm var:

 if (FirstInd != ND (MurreyLevelsValue[ 1 ]))
{
   MovingLimitPositions (MurreyLevelsValue);
   FirstInd = ND (MurreyLevelsValue[ 1 ]);
}
Onlar. seviye değiştiyse, o zaman ... değişir. Bu sayede gereksiz modifikasyon girişimlerinden kurtulmuş oluyoruz. Tabiri caizse, bir zamanlayıcıyla değil, bir sinyalle değişiklik. Burası açık mı?


borilunad :


Tüm eylemleri belirli koşullara göre tanımladığınız bir döngü görmüyorum! Sadece bana neyin değiştirilmesi gerektiğini söyleyen bir döngü görüyorum, sonra sadece değiştirmeyin ve hiçbir hata olmayacak.

Orada her şeyi yazdırdım. Neyi anlamıyorsun... :(

borilunad :

Hatalarınızın global düzeyde yapılması gerekenler ve yerel düzeyde neler yapılması gerektiği konusundaki kafa karışıklığından kaynaklanabileceğine ve hataların her zaman sonuncusu olduğuna, öncekilerin, fonksiyondan çıktığınızda katılımınız olmadan sıfırlandığına dair Renat'ın önemli açıklamasına dikkat edin. !

Bu sorun, öğrendiğim gibi, sadece benim başıma gelmiyor. İşte bir örnek ...

Ve yol boyunca karar verilmedi ve bunu çözmeyecekler. Belki geliştiriciler tembeldir? Hatalarla düzgün çalışmıyorsam, biri iş parçacığı oluşturursa, aynı Renat koda girebilir ve sadece benim sorunum olduğunu söylemekle kalmaz.

Sonunda modifikasyon fonksiyonundan önce değiştirilmesi planlanan parametrelerin yeni ve güncel değerleri yazdırılırsa bu değerlerin orada olduğu anlaşılır. Neden bir yerden daha yükseğe tırmansın? Değerler var, hata olmadığı açık (hatalar için orada yazdırdım). Yani mantıkta her şey doğru. Değişiklik işlevinde cant anlamına gelir.

 
hoz :

Değil! Yalnızca koşul karşılandığında değişiklik yapma iznim var. Bu durumda, değişiklik koşulu, hesaplanan seviyelerde bir değişikliktir. Bunun gibi:

Sadece? Sadece....

Ben de sadece M1'in açılışında değişiklik yapmak için benzer düşüncelerim vardı ve bu, değişiklik önceden belirlenmiş bir değerle gerçekleştirilirse geçerlidir. Ancak bu verileri M1'de kontrol etmem gerekmediği durumlar var. Örneğin, durağım zaten hesaplanmış bir seviyede takip ediyor. Ardından, yukarıda gösterdiğim gibi OnInit() işlevinde bir kontrolüm var:

Onlar. seviye değiştiyse, o zaman ... değişir. Bu sayede gereksiz modifikasyon girişimlerinden kurtulmuş oluyoruz. Tabiri caizse, bir zamanlayıcıyla değil, bir sinyalle değişiklik. Burası açık mı?


Orada her şeyi yazdırdım. Neyi anlamıyorsun... :(

Bu sorun, öğrendiğim gibi, sadece benim başıma gelmiyor. İşte bir örnek ...

Ve bu yolda karar verilmedi ve bunu çözmeyecekler. Belki geliştiriciler tembeldir? Hatalarla düzgün çalışmıyorsam, biri iş parçacığı oluşturur, aynı Renat koda girebilir ve sadece benim sorunum olduğunu söylemekle kalmaz.

Sonunda modifikasyon fonksiyonundan önce değiştirilmesi planlanan parametrelerin yeni ve güncel değerleri yazdırılırsa bu değerlerin orada olduğu anlaşılır. Neden bir yerden daha yükseğe tırmansın? Değerler var, hata olmadığı açık (hatalar için orada yazdırdım). Yani mantıkta her şey doğru. Değişiklik işlevinde cant anlamına gelir.

Bu örneğe zaten baktım. Ama daha iyisi kalmayana kadar her koşula başvurmak zorundayız. Kodunuz beni ikna etmiyor. Şimdi öğle yemeği yiyeceğim, sonra SL'yi ayarlamak, kullanılmışa aktarmak ve hataların aniden ortaya çıkarsa işlendiği modifikasyon işlevine sadece bir çağrı için trol yapmak için açıkça işe yarayan bir döngü örneği vereceğim. operasyonda, test cihazında ortaya çıkmazlar.

Değiştir() işlevini istiyor musunuz?

 
hoz :

Sonunda modifikasyon fonksiyonundan önce değiştirilmesi planlanan parametrelerin yeni ve güncel değerleri yazdırılırsa bu değerlerin orada olduğu anlaşılır. Neden bir yerden daha yükseğe tırmansın? Değerler var, hata olmadığı açık (hatalar için orada yazdırdım). Yani her şey mantıksal olarak doğru. Değişiklik işlevinde cant anlamına gelir.

kod oldukça .. gibi görünüyor ama gerçek hayatta (demo değil) işe yarıyor mu?
 

Victor, işten çıkarmalarda neden SL ve TP'yi değiştirmeye başladın?! Genel olarak, SL'yi yalnızca bir pozisyon açtıktan sonra ve TP'yi SL'yi Kullanılmış'a aktardıktan sonra koymak mantıklıdır! Öyleyse neden sunucuyu bu kadar boş yere rahatsız ediyor ve bu eziyete ihtiyacınız var?!

Kodun hızlı ve net bir şekilde çalışması için minimuma indirilmesi ve basitleştirilmesi gerekiyor ve ardından piyasanın kaprisleri nedeniyle düzeltmesi daha kolay olacak! Piyasanın gerçekleriyle ilgili tüm nüansları dikkatlice düşünün!