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

 
MrBrooklin # :

Bahşiş için teşekkürler, Alex! Öncelikle bu başlıkta cevap bekleyeceğim ama sessizlik olursa o zaman Hatalar, buglar, sorular konusuna döneceğim.

Saygılarımla, Vladimir.

Bu başlıkta, geliştiricilerden yanıt beklemeniz pek olası değildir. Bir hata bulduk - gerçekten bir hata olduğundan emin olduk - bunu Alexei'nin seslendirdiği şubeye bildirdiler. Bu konuda moderatörlerin eylemlerini beklemeye gerek yok - biz de insanız ve bazen zamanımız da olmuyor.

 
Artyom Trishkin # :

Bu başlıkta, geliştiricilerden yanıt beklemeniz pek olası değildir. Bir hata bulduk - gerçekten bir hata olduğundan emin olduk - bunu Alexei'nin seslendirdiği şubeye bildirdiler. Bu konuda moderatörlerin eylemlerini beklemeye gerek yok - biz de insanız ve bazen zamanımız da olmuyor.

Merhaba Artyom!

Temiz.

Saygılarımla, Vladimir.

 

Günün iyi zamanı!!!!

İşte grid Expert Advisor'ın iki işlevi, ilk işlev, kârsız siparişlerin kısmi kapanışını dikkate alarak kâr hesaplamasıdır.

 //+----------------------------------------------------------------------------+
//| Калькуляция сетки ордеров                                                  |
//+----------------------------------------------------------------------------+
bool CalculiteProfit()
  {
   double oProfit= 0 ,oLoss= 0 ,percent;
   int i;
   nOrd= 0 ;
   for (i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!= Symbol () || OrderMagicNumber()!=Magic || OrderType()>OP_SELL)
         continue ;
       if (OrderProfit()>= 0 )
         oProfit += OrderProfit();
       else
        {
         oLoss+=OrderProfit();
         Ord_ticket[nOrd]=OrderTicket();
         Ord_lot[nOrd]=OrderLots();
         nOrd++;
        }
     }
   oLoss = MathAbs (oLoss+GetOrderSwap()+GetOrderCommission());
   if (oLoss> 0 )
      percent=oProfit/oLoss* 100 ;
   else
      percent= 100 ;
   if (percent<MinPercentForClose) //MinPercentForClose переменная из настроек 
       return ( false );
   for (i= 0 ; i<nOrd; i++)
     {
      Ord_lot[i]=( MathCeil ((Ord_lot[i]*RowLots)*percent)/ 100 )/RowLots;
     }
   return ( true );
  }

Siparişleri kapatmanın ikinci işlevi, ayrıca kârsız siparişlerin bir kısmını kapatma

 //+----------------------------------------------------------------------------+
//| Закрытие сетки ордеров при заданной команде с учетом части ордеров         |
//+----------------------------------------------------------------------------+
void ClosseAll()
  {
   int i,j,tkt;

   for (i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES) || OrderSymbol()!= Symbol () || OrderMagicNumber()!=Magic)
         continue ;
      tkt=OrderTicket();
      RefreshRates();
       if (OrderProfit()>= 0 )
        {
         if (OrderType() == OP_BUY)
           {
             if (!OrderClose(OrderTicket(), OrderLots(), Bid, slip))
               Print ( "Не удалось закрыть ордера на покупку!" );
           }
         else
             if (OrderType() == OP_SELL)
              {
               if (!OrderClose(OrderTicket(), OrderLots(), Ask, slip))
                   Print ( "Не удалось закрыть ордер на продажу!" );
              }
        }
       else
         for (j= 0 ; j<nOrd; j++)
             if (tkt==Ord_ticket[j])
              {
               if (OrderLots()<Ord_lot[j])
                  Ord_lot[j]=OrderLots();
               Ord_lot[j]=NRL(Ord_lot[j]);
               if (OrderType() == OP_BUY)
                 {
                   if (!OrderClose(OrderTicket(), Ord_lot[j], Bid, slip))
                     Print ( "Не удалось закрыть ордера на покупку!" );
                 }
               else
                   if (OrderType() == OP_SELL)
                    {
                     if (!OrderClose(OrderTicket(), Ord_lot[j], Ask, slip))
                         Print ( "Не удалось закрыть ордер на продажу!" );
                    }
               break ;
              }
     }
  }

Durum şudur: Partilerin kapatılması gereken kısmının yuvarlanması sonucunda, kârsız siparişlerin kısmi kapanması dikkate alınarak siparişler tablosu kapatılırken bir kayıp meydana gelir.

Soru, bu iki fonksiyona dayanarak, kârsız emirleri hesaplamak için bir fonksiyon yazmanın mümkün olup olmadığı veya daha doğrusu emrin kapatılacak kısmıdır.

Eğer öyleyse, lütfen yazmama yardım et.

teşekkürler

 
EVGENII SHELIPOV # :

Günün iyi zamanı!!!!

Eğer öyleyse, lütfen yazmama yardım et.

Şimdi zaman iyi değil.

Senin için yazmak mı demek istiyorsun?

 
Andrey Sokolov # :

Şimdi zaman iyi değil.

Senin için yazmak mı demek istiyorsun?

Kendini yırtma İskender

 

ilkokulda kayboldum:

trol için poz aramasını nasıl organize edebilirim - eş yönlü, bir nedenden dolayı bir pozu trol eder, yani. geçmez... MT5

 for (i= 0 ; i< PositionsTotal (); i++)   
     if (a_position.Select( _Symbol ))       
     if ( PositionSelect ( _Symbol )) if ( Symbol ()== PositionGetSymbol (i))  
     if (Magic== PositionGetInteger ( POSITION_MAGIC ))  
   //  magic = myposition.Magic();   
      {
         //  ------------   перевод в бу  BUY   ------------    
         //if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 
         if (a_position.PositionType() == POSITION_TYPE_BUY )
           if (NLb_fun > 0 )
            {
                 Print ( " перевод в безубыток BUY, _SL = " , _SL, " POSITION_PRICE_OPEN: " ,
                     NormalizeDouble ( PositionGetDouble ( POSITION_PRICE_OPEN ), _Digits ),
                     " NLb_fun = " , NormalizeDouble (NLb_fun, _Digits ));
               Modify = true ;
 if (Modify)
              {
               Print ( " серия рыночных позиций BUY назначена к переводу в безубыток, текущией позы POSITION_PRICE_OPEN = " ,
               NormalizeDouble ( PositionGetDouble ( POSITION_PRICE_OPEN ), _Digits ), " тикет = " , PositionGetInteger ( POSITION_TICKET ));
                
               trade.PositionModify( _Symbol , SymbolInfoDouble ( _Symbol , SYMBOL_BID ) - 50 * _Point , PositionGetDouble ( POSITION_TP ));
               Print ( " Перенос в бу стоп лосса позиции Buy № " ,   PositionGetInteger ( POSITION_TICKET ));
    ...
           } // к if(Modify)
        }     // к if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) 

...

HEDGE piyasa pozisyonları - ATP ile takip etmek için bir poz aramak için bir kod parçasını kullanabilirsiniz.

sorun çözüldü! ATP, bir kez daha Vladimir Karputov'a!!!

onun trol ile!

https://www.mql5.com/ru/code/17263

anahtar özellik, dizindeki döngüye bakmak ve seçeneği bir biletle değiştirmek !!!

 //--- при таком методе мы будет сюда попадать на каждом тике.
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--)
       if (m_position.SelectByIndex(i))
         if (m_position. Symbol ()== Symbol () && m_position.Magic()==m_magic)
           {
             //--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
             if (m_position.PositionType()== POSITION_TYPE_BUY )
              {
               //--- когда у позиции ещё нет StopLoss
               if (m_position.StopLoss()== 0 )
                 {
                   //--- пока StopLoss равен 0.0, TrailingStep не учитываем
                   if (m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
                    {
                     //--- модификация позиции
                     m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(), 0.0 );
                    }
                 } 
TrailingStop
TrailingStop
  • www.mql5.com
Пример советника с реализацией Trailing Stop.
 

Basit bir görev: Dizin ve değer bakımından ArrayI dizisinin öğeleriyle eşleşen tüm öğeleri ArrayJ dizisinden çıkarmanız gerekir :

 int OnInit ()
  {
   int CommonArray[]={ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 13 , 13 , 13 , 13 , 13 , 13 , 13 };
   int ArrayI[ 20 ]=   { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 8 , 9 , 10 ,   0 , 12 , 13 , 13 , 13 , 13 ,   0 ,   0 , 13 ,   0 };
   int ArrayJ[];

   for ( int j= 0 ; j< ArraySize (ArrayI); j++)
   {
       ArrayResize (ArrayJ,j+ 1 );
      ArrayJ[j]=CommonArray[j];
   }

   ArrayPrint (ArrayI);
   ArrayPrint (ArrayJ);

   for ( int i= 0 ; i< ArraySize (ArrayI); i++)
       if (ArrayI[i])
         for ( int j= 0 ; j< ArraySize (ArrayJ); j++)
             if (ArrayI[i]==ArrayJ[j])
               ArrayRemove (ArrayJ,j, 1 );

   ArrayPrint (ArrayJ);
//---
   return ( INIT_SUCCEEDED );
  }

Anahtar satırı vurgulandı. Sonuç:

 2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         0    0    0    0    0    0    0    8    9 10    0 12 13 13 13 13    0    0 13    0
2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         1    2    3    4    5    6    7    8    9 10 11 12 13 13 13 13 13 13 13 13
2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         1    2    3    4    5    6    7 11

beklenen:

 2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         0    0    0    0    0    0    0    8    9 10    0 12 13 13 13 13    0    0 13    0
2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         1    2    3    4    5    6    7    8    9 10 11 12 13 13 13 13 13 13 13 13
2022.02 . 26 13 : 56 : 48.489 test (NZDUSD,H4)         1    2    3    4    5    6    7            11                  13 13      13

ArrayJ dinamiktir, onda bir sorun var gibi görünüyor... ama statik bir şeye ihtiyacım yok.

Bütün aklımı kırdım. ÇADNT? Yoksa gerçekten eski şarkının bir analogu mu:

https://www.mql5.com/ru/forum/1111/page3141#comment_27152680

ve

https://www.mql5.com/ru/forum/1111/page3142#comment_27371998

adlandırılmış sabitler hakkında?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2022.01.28
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
x572intraday ArrayJ dizisinden çıkarmanız gerekir :

Anahtar satırı vurgulandı. Sonuç:

beklenen:

ArrayJ dinamiktir, onda bir sorun var gibi görünüyor... ama statik bir şeye ihtiyacım yok.

1. ArrayResize bir döngü için çıkarmak daha iyidir

 ArrayResize (ArrayJ, ArraySize (ArrayI));
for ( int j= 0 ; j< ArraySize (ArrayI); j++)
   {
      ArrayJ[j]=CommonArray[j];
   }

2. ArrayRemove, bir dizi öğesini "boş" yapmaz, ancak sonraki öğeleri yerine "kaydırır". Bu nedenle, sonraki endekslerdeki öğelerin yazışmaları ihlal edilir.

 
JRandomTrader # :

1. ArrayResize bir döngü için çıkarmak daha iyidir

2. ArrayRemove, bir dizi öğesini "boş" yapmaz, ancak sonraki öğeleri yerine "kaydırır". Bu nedenle, sonraki endekslerdeki öğelerin yazışmaları ihlal edilir.

2 ile ilgili soru yok, netlik için aralıkları ben belirledim. Ek olarak, Yardım statik bir dizi hakkında şunları söyler: " İşlev sabit boyutlu bir dizi için kullanılıyorsa, dizinin boyutu değişmez: bu durumda, kalan "kuyruk" fiziksel olarak başlangıca kopyalanır. konum . " Yardım'daki örnek ayrıca sabit boyutlu bir dizi kullanıyor, ancak benimki dinamik.

1. ile ilgili olarak, onu döngüden çıkarmanın bir yolu yoktur, çünkü gerçek bir görevde ne ArrayJ ne de ArrayI'nin boyutu önceden bilinmez ve CommonArray, dahası, kendi boyutuna sahiptir - hepsi eşleşmiyor .

Yukarıdaki örnekte olduğu gibi, öğelerin dışarı itilmesinin yarıda kesilmediği başka bir örneğim var:

 int OBJTFVArray[]={ 1 , 2 , 3 , 4 , 5 , 6 , 10 , 12 , 1520 , 30 , 16385 , 16386 , 16387 , 16388 , 16390 , 16392 , 16396 , 16408 , 32769 , 49153 , 49154 , 49155 , 49156 , 49157 , 49158 , 49159 , 49160 };
int PArray[ 20 ]={ 0 , 0 , 0 , 0 , 0 , 00 , 16390 , 16392 , 163960 , 32769 , 49153 , 49153 , 49153 , 49153 , 0 , 0 , 49153 , 0 };
int PArray_[];

int OnInit ()
  {
   for ( int p_= 0 ; p_< ArraySize (PArray); p_++)
   {
       ArrayResize (PArray_,p_+ 1 );
      PArray_[p_]=OBJTFVArray[p_+ 8 ];
   }

   ArrayPrint (PArray);
   ArrayPrint (PArray_);

   for ( int p= 0 ; p< ArraySize (PArray); p++)
       if (PArray[p])
         for ( int p_= 0 ; p_< ArraySize (PArray_); p_++)
             if (PArray[p]==PArray_[p_])
               ArrayRemove (PArray_,p_, 1 );

   ArrayPrint (PArray_);

   return ( INIT_SUCCEEDED );
  }

Geçerli sonuç:

 0      0      0      0      0      0      0 16390 16392 16396      0 32769 49153 49153 49153 49153      0      0 49153      0
15      20      30 16385 16386 16387 16388 16390 16392 16396 16408 32769 49153 49154 49155 49156 49157 49158 49159 49160
15      20      30 16385 16386 16387 16388                    16408              49154 49155 49156 49157 49158 49159 49160

ama bu seçeneğin çalışması gerekiyor. Görünüşe göre, aynı değere sahip öğeler sağdaki kuyrukta arka arkaya giderse bir tıkaç olur (önceki gönderiye bakın) - ve bu zaten yukarıda bahsettiğim soruna benziyor.

 
x572intraday # :

2 ile ilgili soru yok, netlik için aralıklar belirledim. Ek olarak, Yardım statik bir dizi hakkında şunları söyler: " İşlev sabit boyutlu bir dizi için kullanılıyorsa, dizinin boyutu değişmez: bu durumda, kalan "kuyruk" fiziksel olarak başlangıca kopyalanır. konum . " Yardım'daki örnek ayrıca sabit boyutlu bir dizi kullanıyor ve bende dinamik bir dizi var.

1. ile ilgili olarak, onu döngüden çıkarmanın bir yolu yoktur, çünkü gerçek bir görevde ne ArrayJ ne de ArrayI'nin boyutu önceden bilinmez ve CommonArray, dahası, kendi boyutuna sahiptir - hepsi eşleşmiyor .

Yukarıdaki örnekte olduğu gibi, öğelerin dışarı itilmesinin yarıda kesilmediği başka bir örneğim var:

Geçerli sonuç:

ama çalışmak için bu seçeneğe ihtiyacım var. Görünüşe göre, aynı değere sahip öğeler sağdaki kuyrukta arka arkaya giderse bir tıkaç olur (önceki gönderiye bakın) - ve bu zaten yukarıda bahsettiğim soruna benziyor.

1. Gösterdiğim gibi, onu döngüden çıkarabilir ve çıkarmalısınız. Döngü sırasında ArrayI'nin boyutu değişmedikçe.

2. Sonra, bunun gibi bir şey

 int k= 0 ; // объявляем до цикла - чтобы использовать после
for ( int i= 0 ; i< ArraySize (ArrayI); i++) // после предыдущего кода (1) размеры ArrayI и ArrayJ равны
   if (ArrayI[i]!=ArrayJ[i])
    {
     ArrayJ[k++]=ArrayI[i];
    }
ArrayResize (ArrayJ,k);