MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1718

 
// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double    Price;

       for ( int pos= 0 ; pos < OrdersTotal (); pos++)
      {
           if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
          {
             if (OrderSymbol()== Symbol ())
             {
                 if (OrderType() == OP_SELL)
                {
                   if (OrderTakeProfit() > 0 )
                   {
                       if (CountBuy1() > 0 ) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                         double      TP3 = NormalizeDouble ( 0 * Point , Digits );
                           if (OrderTakeProfit() > TP3)
                          {
                         
                             if (!OrderModify( OrderTicket(), OrderOpenPrice(), 0 , TP3, 0 , 0 ))
                                         Print ( "Ошибка модификации  ордера на продажу" );
                           }             
                        }
                    }
                }
               } 
             }   
           }     
 }      

Anlamama yardım et. Bu fonksiyonun anlamı, açık satış emirleri varsa ve bir alış emri açılmışsa, satış emirlerinin TP'sini değiştirmektir. Ancak değişiklik yalnızca bir ilk sipariş için gerçekleşir ve ardından OrderModify ERROR 1 hatası verir.

 
Snajper007 satış emirleri varsa ve bir alış emri açılmışsa, satış emirlerinin TP'sini değiştirmektir. Ancak değişiklik yalnızca bir ilk sipariş için gerçekleşir ve ardından OrderModify ERROR 1 hatası verir.

Bu durumda TakeProfit basitçe silinir.

HATA 1 - ERR_NO_RESULT Hata yok, ancak sonuç bilinmiyor

 
MakarFX # :

Bu durumda TakeProfit basitçe silinir.

HATA 1 - ERR_NO_RESULT Hata yok, ancak sonuç bilinmiyor

Neden birinde iki siparişten siliniyor, diğerinde silinmiyor?
 
Snajper007 # :
Neden birinde iki siparişten siliniyor, diğerinde silinmiyor?

Yalnızca OrderTakeProfit() > 0 ise kaldırılır

onlar. olumlu bir anlaşma

 
MakarFX # :

Yalnızca OrderTakeProfit() > 0 ise silinir

onlar. olumlu bir anlaşma

Kodu değiştirdim.

 // Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double    Price;

       for ( int pos= 0 ; pos < OrdersTotal (); pos++)
      {
           if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
          {
             if (OrderSymbol()== Symbol ())
             {
                 if (OrderType() == OP_SELL)
                {
                   
                   
                       if (CountBuy1() > 0 ) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                         double      TP3 = NormalizeDouble ( 0 * Point , Digits );
                          
                         
                             if (!OrderModify( OrderTicket(), OrderOpenPrice(), 0 , TP3, 0 , 0 ))
                                         Print ( "Ошибка модификации  ордера на продажу" );
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
Aynısı. Ortalama TP ile 2 satış emri var. Bu emirlerin her ikisi için de alış emri açarken TP silinmelidir. Ancak yalnızca birinci dereceden kaldırılır ve ikincisi ortalama TP ile kalır.
 
MakarFX # :

Yalnızca OrderTakeProfit() > 0 ise kaldırılır

onlar. olumlu bir anlaşma

eğer OrderTakeProfit() >   0, ticaretin kârda olduğu anlamına gelmez.. Bu, sadece kâr almanın pozisyona ayarlandığı anlamına gelir..

 
Snajper007 # :

Kodu değiştirdim.

Aynısı. Ortalama TP ile 2 satış emri var. Bu emirlerin her ikisi için de alış emri açarken TP silinmelidir. Ancak yalnızca birinci dereceden kaldırılır ve ikincisi ortalama TP ile kalır.

Her şeyi karıştırmışsınız..

İlk önce bir sipariş verdin

 if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))

Ama sonra işlevi çağırırsın

CountBuy1()

Hangisi büyük olasılıkla seçimi değiştirir .. Ve püresi çıkıyor .. Sinekleri pirzolalardan ayırın ve her şey işe yarayacak ..

 
Nikolay Ivanov # :

Her şeyi karıştırmışsınız..

İlk önce bir sipariş verdin

Ama sonra işlevi çağırırsın

Hangisi büyük olasılıkla seçimi değiştirir .. Ve püresi çıkıyor .. Sinekleri pirzolalardan ayırın ve her şey işe yarayacak ..

Teşekkür ederim! İşlev kaldırıldı, normal çalışmaya başladı.
 
Nikolay Ivanov # :

eğer OrderTakeProfit() >   0, ticaretin kârda olduğu anlamına gelmez.. Bu, sadece kâr almanın pozisyona ayarlandığı anlamına gelir..

Haklısın, OrderProfit() ile karıştırdım
 

Başka bir soru ortaya çıktı. Ortalama fiyatı hesaplama işlevi:

 //Средний тейкпрофит для ордеров Sell
double SR_CENA_SELL()
{
double      sr_cena_sell = 0 ;
if (CountSell() > 1 )
      {
   double      lot_price_Sell = 0 ;
   double      sum_lot_Sell_1  = 0 ;
         for ( int pos= 0 ; pos < OrdersTotal (); pos++)
           if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
           {
             if (OrderMagicNumber() == MN || OrderMagicNumber() == 0 )
              {
                 if (OrderSymbol() == Symbol () && OrderType() == OP_SELL)
                  {
                    lot_price_Sell += NormalizeDouble (OrderOpenPrice()* OrderLots(), Digits );
                    sum_lot_Sell_1   += OrderLots();
                    sr_cena_sell = NormalizeDouble (lot_price_Sell/sum_lot_Sell_1, Digits );
                    
                  }
              }
           }
           
      }
   return (sr_cena_sell);
 }
Yeniden hesaplama neden zaman içinde ilerliyor? Onlar. 2. satış emri açıldı, fonksiyon ortalama fiyatı verdi. Ama 3. sıra açıldığında fonksiyon hem eski değeri veriyor hem de yenisini veriyor (Dergideki baskıya baktım) ve sonuç olarak eski değer kalıyor. Neyi yanlış yaptı?