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

 
Andrey F. Zelinsky :
işte biraz bununla ilgili https://docs.mql4.com/en/convert/normalizedouble

DoubleToString IMHO...

Yazdır.

 
Andrey F. Zelinsky :
işte biraz bununla ilgili https://docs.mql4.com/en/convert/normalizedouble
İnanmayacaksınız, sadece başlangıçta tüm veriler normalleşmeye getirildi ve virgülden sonra bir rakam vardı. Çift değerlerin bile normalleştirilmesi gerektiğini biliyorum. Normalize edilmiş statik verileri kendiniz yeniden hesaplamayı deneyin, bunun bir derleyici hatası olduğunu düşünüyorum ama umarım yanılıyorumdur, şu ana kadar MathRound işleviyle bu sorunu çözdüm ama bu doğru değil!
 
arhipov-76 :
İnanmayacaksınız, sadece başlangıçta tüm veriler normalleştirmeye getirildi ve virgülden sonra bir rakam vardı. Çift değerlerin bile normalleştirilmesi gerektiğini biliyorum. Normalize edilmiş statik verileri kendiniz yeniden hesaplamayı deneyin, bunun bir derleyici hatası olduğunu düşünüyorum ama umarım yanılıyorumdur, şu ana kadar MathRound işleviyle bu sorunu çözdüm ama bu doğru değil!

Digis'in ne olduğunu bilmiyorum, sadece DoubleToString (...) işlevini deneyin.

Hesaplamaları EA içinde şimdi düşündüklerinizle yaparsanız, NormalizeDouble() ile bile hesaplamalar doğru şekilde yapılır, ancak parametreleri örneğin Print, Alert, Comment dışında görüntülemek istiyorsanız DoubleToString aracılığıyla normalleştirmeyi kullanın. (... )

DoubleToString - Преобразование данных - Справочник MQL4
DoubleToString - Преобразование данных - Справочник MQL4
  • docs.mql4.com
DoubleToString - Преобразование данных - Справочник MQL4
 

0.0001 sayısını nasıl normalleştirirseniz yapın, ikili gösterimde sonsuz bir periyodik kesir olarak kalır, çünkü 5'e bölümü vardır. Bir bilgisayarda bu sonsuz kesir, sığacak uzunlukta kesilmelidir. Bölmenin bir sonucu olarak, yine kesilmesi gereken çok uzun bir şey elde ederiz. Ortaya çıkan sayının ondalık biçimde "iyi" bir biçimi için, programda verilen uygun sayıda kesirli basamaklı bir dizgeye dönüştürmek gerekir. Örneğin, burada daha önce belirtildiği gibi DoubleToString kullanma.

PS "Sonuç olması gerekenden onda bir daha az" - böyle bir suçlama yoktu. Yüz milyonda biri...

 
Timur1988 :

Merhaba! Lütfen algoritmaya yardım edin!
Pearson korelasyon katsayısını hesaplayan basit bir komut dosyası yazdı. İlk çubuktan başlayarak kapanış fiyatlarında seçilen diziler

Fiyat dizisi, birinciden başlayıp 24 çubukla biten alınır.
Şimdi korelasyonu 24 çubuk için de hesaplamak istiyorum, ancak İKİNCİ(!) çubuğundan fiyat dizisini alıyorum.

Algoritmayı bilmeden her fiyat dizisini manuel olarak girdim:

24 bar çok fazla ve eğer 100 bar için korelasyonu bulmak istersem, o zaman her diziye girmek işkence oluyor.
Peki ya insanlar?)

Muhtemelen, Koef=Edxdy/( sqrt ( DoubleToString ((Edx2*Edy2), w))); satırından karekök hesaplamasını düzeltmeye değer.

 
Vladimir :

Muhtemelen, Koef=Edxdy/( sqrt ( DoubleToString ((Edx2*Edy2), w))); satırından karekök hesaplamasını düzeltmeye değer.

İşte korelasyonu hesaplamak için çalışan bir fonksiyon, sadece fiyatları olan dizileri vermeniz gerekiyor ve çıktı bir değer olacak:

string Correlation1( double & CurOpen[], double & SubOpen[]) {
double sumXY2= 0 , sumX2= 0 , sumY2= 0 , sumXs2= 0 , sumYs2= 0 , res2= 1 ;

int k= MathMin ( ArraySize (CurOpen), ArraySize (SubOpen));
   if (k> 2 ) {
   for ( int i= 0 ; i<k; i++) {
     sumXY2+=CurOpen[i]*SubOpen[i];
     sumX2 +=CurOpen[i];
     sumY2 +=SubOpen[i];
     sumXs2+=CurOpen[i]*CurOpen[i];
     sumYs2+=SubOpen[i]*SubOpen[i];    
    }
   res2 = (k*sumXY2-sumX2*sumY2) / MathSqrt ( (k*sumXs2-sumX2*sumX2)*(k*sumYs2-sumY2*sumY2) );
  }
   return ( DoubleToStr (res2, 2 ));
}
 
Merhaba! Robotumu bir demo hesabına koydum, çalıştığı ikinci ay. Bugün terminali açıyorum, ondan önce bir sipariş verilmiş olmasına rağmen, bir sinyale iki sipariş verildi. Sipariş sayısında bir sınırlama vardır. Nedeni ne olabilir?
 

İşte kullandığım şey

Вот что я использую

if (ExistPositions(Symb)== false &&ExistOrders(Symb)== false &&Delta_Buy< Low [ 1 ]&& sar> Close [ 1 ])
{SetOrder( NULL , OP_BUYSTOP ,Lts,sar,sar-SL* Point (),sar+TP* Point (),Magik_number);}
if (ExistPositions(Symb)== false &&ExistOrders(Symb)== false &&Delta_Sell> High [ 1 ] && sar< Close [ 1 ])
{SetOrder( NULL , OP_SELLSTOP ,Lts,sar,sar+SL* Point (),sar-TP* Point (),Magik_number);}


//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders( string sy= "" , int op=- 1 , int mn=- 1 , datetime ot= 0 ) {
   int i, k= OrdersTotal (), ty;

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) {
      ty= OrderType ();
       if (ty> 1 && ty< 6 ) {
         if (( OrderSymbol ()==sy || sy== "" ) && (op< 0 || ty==op)) {
           if (mn< 0 || OrderMagicNumber ()==mn) {
             if (ot<= OrderOpenTime ()) return ( True );
          }
        }
      }
    }
  }
   return ( False );
}
//--------------------------------------------------------------------------------//


bool ExistPositions( string sy= "" , int op=- 1 , datetime ot= 0 ) {
   int i, k= OrdersTotal ();

   if (sy== "0" ) sy=Symb;
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) {
       if ( OrderSymbol ()==sy || sy== "" ) {
         if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
           if (op< 0 || OrderType ()==op) {
             if ( OrderMagicNumber ()==Magik_number) {
               if (ot<= OrderOpenTime ()) return ( True );
            }
          }
        }
      }
    }
  }
   return ( False );
}
 
Neron_76 :

İşte kullandığım şey

Döngüler, OrdersTotal () -1'den 0'a kadar ters sırada sayılmalıdır.
 
Vitalie Postolache :
Döngüler, OrdersTotal () -1'den 0'a kadar ters sırada sayılmalıdır.
Teşekkürler, yeniden yapacağım.