[ARŞİV!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 4. - sayfa 101

 
kon12 :

Anlaşıldı ... Yeniden çizmenin başka bir yolu varsa?
Kodu gösterin ve hemen cevaplanacaksınız.
 
Lisi4ka330 :


Tünaydın! Lütfen ArrayMo işlevini anlamama yardım edin (f-I, yoğunluk eğrisinin maksimumunu döndürür).

 double ArrayMo ( double & x [] , int d = 4 ) {
   double e , s = 0 ;
   double m [][ 2 ] ;             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
   int      i , k = ArraySize ( x ) ;
   int      n ;                   // номер строки временного массива m
   int      r ;                   // количество строк во временном массиве m

   if ( k > 0 ) {
     for ( i = 0 ; i < k ; i ++ ) {
       e = NormalizeDouble ( x [ i ] , d ) ;
       n = ArraySearchDouble ( m , e ) ;
       if ( n < 0 ) {
         r = ArrayRange ( m , 0 ) ;
         ArrayResize ( m , r + 1 ) ;
         m [ r ][ 0 ] ++;
         m [ r ][ 1 ] = e ;
       } else m [ n ][ 0 ] ++;
     }
     ArraySort ( m , WHOLE_ARRAY , 0 , MODE_DESCEND ) ;
     s = m [ 0 ][ 1 ] ;
   } else Print ( " ArrayMo(): Массив пуст! " ) ;

   return ( s ) ;
}

Aşağıdaki sorular ortaya çıktı:

1. Geçici bir dizi oluşturmanın amacı nedir?

 m [][ 2 ]

2. Geçici dizinin değerlerinin nelerden alınacağı net değildir ve bu nedenle bu dizinin nasıl aranacağı da net değildir:

 n = ArraySearchDouble ( m , e )

3. Ve sonra, genel olarak, gerçek benim için derinden gizli))))) Değer olmadığından emin olduktan sonra, "hangi değerler olduğu belli değil" dizisinin boyutunu belirlemeye başlıyoruz.

Bu hikayede bir ışık ışını için çok minnettar olurum))))


Bana öyle geliyor ki fonksiyon hala tam olarak doğru yazılmamış. Asıl sebep duyurudan sonra

 double m [][ 2 ] ;

mutlaka gerekli

 ArrayResize (m, 0 );

aksi halde ( alıntı )

int ArrayResize ( void dizisi[], int yeni_boyut)
Dizinin ilk boyutunda yeni boyutu ayarlar. Başarı durumunda, işlev yeniden boyutlandırıldıktan sonra dizide bulunan tüm öğelerin sayısını döndürür, aksi takdirde -1 döndürür ve dizi yeniden boyutlandırılmaz.
!!!Not: Yeniden boyutlandırılmış bir işlevde yerel olarak bildirilen bir dizi, işlev sona erdikten sonra değişmeden kalacaktır. İşlev yeniden çağrıldığında, böyle bir dizi, bildirilenden farklı bir boyuta sahip olacaktır.!!!

Ve böylece, sayısız çağrı ile işlev "geçmişe düşecek")

Algoritmanın işleyişi ile ilgili. m[][2] dizisinin kendisi, x[i] değişkeninin çeşitli değerleri üzerinden isabet sayısının doğrudan ampirik dağılımının bir temsilidir. Onlar. dizinin her elemanı iki sayıdan oluşur - belirli bir değerdeki (ilk alan) isabet sayısı ve bu değerin kendisi. Döngüde, her x[i] için, m dizisinde aynı değer aranır ve bulunursa, miktar alanı eklenir, aksi takdirde, ArrayResize() ve bizim x[i] kullanılarak yeni bir öğe oluşturulur. orada yazıyor.

Ayrıca, dizi doldurulduktan sonra, maksimum isabet sayısına sahip öğeyi, yani tanım gereği dağıtım modu x'i bulmanız yeterlidir.

Çizgilerle yapılır

     ArraySort ( m , WHOLE_ARRAY , 0 , MODE_DESCEND ) ;
     s = m [ 0 ][ 1 ] ;

bana öyle gelse de (çok boyutlu bir diziden emin değilim),

    s=m[ ArrayMaximum (m)][ 1 ];

Genel olarak (kodun yazarına tüm saygımla) söyleyebilirim ki, tüm eksiklikler giderildiğinde bile, bu algoritma son derece verimsizdir ve çoğu zaman yanlış sonuç verebilir. Bunun nedeni double tip ile çalışmamız yani x[i] değerlerinin çok yakın ancak yine de ayırt edilebilir değerlere düşme olasılığı oldukça fazladır. Örnek boyutu, x[i] alanına izin verilen toplam aralık sayısından çok daha büyük (yüzlerce kez veya daha fazla) olduğunda bu çok fark edilmeyebilir. Ancak, bu kısıtlamanın sağlanmadığı çok sayıda durumda, birçok yanlış hesaplama olacaktır.

Modu hesaplamanın daha doğru bir yolu şudur: ampirik bir dağılım fonksiyonu oluşturulur (frekans dağılımıyla karıştırılmamalıdır), ardından parçalı doğrusaldan düze enterpolasyon yapılır ve son olarak türevin maksimum noktasıdır. aranan. Böyle bir algoritma yukarıda sıralanan dezavantajlardan aridir ve küçük örneklem boyutlarında bile çok verimli çalışır. En azından, MQL'de sadece 50-100 elemanlı örnekler üzerinde karşılaştırılabilir sayıda aralıklarla mod bulma problemini çözmem gerekiyordu ve her şey yolundaydı. Tek bir dezavantaj var - enterpolasyonlarda, kural olarak, elbette niteliksel olarak düzeltmek istemiyorsak, hesaplamaların hızı keskin bir şekilde düşer.

 
Merhaba, danışman yazmak için iletişime geçebileceğiniz değerli forum üyeleri. Göstergesiz Expert Advisor, yönümüzde değilken hareket ederken ikiye katlanmaya dayanır.
 
Glazunov :
Merhaba, danışman yazmak için iletişime geçebileceğiniz değerli forum üyeleri. Göstergesiz Expert Advisor, yönümüzde değilken hareket ederken ikiye katlanmaya dayanır.
burada: https://www.mql5.com/ru/job
 
ilunga :
burada: https://www.mql5.com/ru/job

Teşekkür ederim. Belki daha fazla seçenek vardır.
 
Glazunov :

Teşekkür ederim. Belki daha fazla seçenek vardır.
sitedeki aramaya "martingale" yazmayı deneyin - şaşıracaksınız
 
YOUNGA :
sitedeki aramaya "martingale" yazmayı deneyin - şaşıracaksınız

Zaten baktım! Ama istediğim şey değil
 
Glazunov :
Merhaba, danışman yazmak için iletişime geçebileceğiniz değerli forum üyeleri. Göstergesiz Expert Advisor, yönümüzde değilken hareket ederken ikiye katlanmaya dayanır.


Buraya bak

https://www.mql5.com/ru/forum/136747

 

Merhaba. MQL4'te yeni başladı.

Bana OrderModify işlevinden bahsedin. Ders kitaplarında ve örneklerde bu işlev trol için düşünülür, yani. kayıp değişikliğini durdur. Sadece açık bir emirde kar al değiştirmem gerekiyor.Açılışta zararı durdur ayarlanmadı, ayrıca değişiklik sırasında 0'da kalmalı.

Siparişlerin sayımı ve seçimi nasıl olmalı?

Nihai hedef şöyle görünmelidir:

if (OrderType()==OP_BUY && OrderOpenPrice()-Bid>kof*Point) // bir satın alma var, ancak kof kadar düştü
{
OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+tpnew*Point,0,CLR_NONE);// TP'yi önceden ayarlanandan daha aşağı taşı

Satış benzer.

Herhangi bir cevap için teşekkürler.

 

Tekrar merhaba! :)

Düşündüğüm gibi, sorunlar vardı. İşte kod. Mesele şu ki, test cihazındaki emirler TP tarafından kapatılır ve TP işlevi tarafından, Takip Durdurma sırasında emir değiştirildiğinde kaldırılır.

 double my_ord[ 31 ][ 2 ];                                           //ордера советника
                                                                 //[][0] Ticket
                                                                 //[][1] Вид операции 
//---------------------------------------------------------------------------------

void FindMyOrders()                                             //ищем свои ордера(от советника)
   {
     for ( int a = 0 ;a< 32 ;a++)                                     //во избежание ошибок заполняем все нулями
      {
       my_ord[a][ 0 ]= 0 ;
       my_ord[a][ 1 ]= 0 ;
      }
     int pos = 0 ;
     for ( int i= 0 ; i< 32 ; i++)
      {
       if (Mas_Ord_New[i][ 8 ]== 1 )                                 //есть ли комментарий
         {
           int num = Mas_Ord_New[i][ 4 ];
           OrderSelect (SELECT_BY_TICKET, num);
           string str = OrderComment ();
           if (str == "AO Day Profiter Trade" )                   //наш ли это комментарий
            {
             my_ord[pos][ 0 ] = num;
             my_ord[pos][ 1 ] = Mas_Ord_New[i][ 6 ];                 //если наш, записываем Ticket и вид операции
             pos++;
            }
           else { }
         }
       else { }
      }
   }
//---------------------------------------------------------------
void TrailStop( int ticket, int TStop)                           //ф-ция трейлинг стопа, TStop-расстояние в пп
   {
     int minDist = MarketInfo (symb, MODE_STOPLEVEL);
     if (TStop<minDist)
      {
       TStop = minDist;
      }
     else { }
     if (TStop> 0 )
      {
       OrderSelect (ticket, SELECT_BY_TICKET);
       if ( OrderType ()==OP_BUY)
         {
           if (Bid - OrderOpenPrice ()> Point *TStop)
            {
             if ( OrderStopLoss ()<Bid- Point *TStop)
               {
                 OrderModify ( OrderTicket (), OrderOpenPrice (), 
                Bid- Point *TStop, 0 , 0 , Blue );
                 return ;
               }
             else { }
            }
             else { }
         }
       else if ( OrderType ()==OP_SELL)
         {
           if ( OrderOpenPrice () - Ask> Point *TStop)
            {
             if ( OrderStopLoss ()>Ask + TStop* Point )
               {
                 OrderModify ( OrderTicket (), OrderOpenPrice (), 
                Ask+ Point *TStop, 0 , 0 , Blue );                           //ordertakeprofit!!
                 return ;
               }
             else { }
            }
           else { }
         }
       else { }
      }
     else { }
    }
//-----------------------------------а это кусочек Start(), отвечающий за трейлинг стоп
   for ( int i = 0 ; i< 32 ; i++)                                   //трейлинг стоп для наших ордеров
      {
       if (my_ord[i][ 0 ]> 0 )
         {
          TrailStop(my_ord[i][ 0 ], TralingStop);
         }
       else { break ;}
      }
Bu, test cihazı günlüğünde yanlış TP ve SL ile ilgili herhangi bir hata olmamasına rağmen, takip eden durdurmanın yürütülmediği anlamına gelir. Yanlış olan ne?