Hatalar, hatalar, sorular - sayfa 2879

 
Igor Makanu :

biraz elden geçirdim

(bu yüzden makro kullanmamak daha iyidir;)

 #define   SpeedTest(count_x10,msg,EX)        { ulong mss= GetMicrosecondCount (); ulong count=( ulong ) pow ( 10 ,count_x10); for ( ulong _i= 0 ;_i<count;_i++){EX;} \
                                               printf ( "%s: loops=%llu ms=%llu" ,msg,count, GetMicrosecondCount ()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
{
   ulong sum = 0 ;
   uint in01A = ( uint ) rand ();
   uint in01B = ( uint ) rand ();
   uint in02A = ( uint ) rand ();
   uint in02B = ( uint ) rand ();
   uint in03A = ( uint ) rand ();
   uint in03B = ( uint ) rand ();
   uint in04A = ( uint ) rand ();
   uint in04B = ( uint ) rand ();
   uint in05A = ( uint ) rand ();
   uint in05B = ( uint ) rand ();
   uint param[ 5 ];
   SpeedTest( 22 , "tst 1 : " ,
   {
      sum += in01A << ( sizeof ( ushort ) * 8 ) | in01B;
      sum += in02A << ( sizeof ( ushort ) * 8 ) | in02B;
      sum += in03A << ( sizeof ( ushort ) * 8 ) | in03B;
      sum += in04A << ( sizeof ( ushort ) * 8 ) | in04B;
      sum += in05A << ( sizeof ( ushort ) * 8 ) | in05B;
   //   for(int i = 0; i < 5; i++) sum += param[i];
   });
   Print (sum);
   }
//--  

   ulong sum = 0 ;
   ushort in00 = ( ushort ) rand ();
   ushort in01 = ( ushort ) rand ();
   ushort in02 = ( ushort ) rand ();
   ushort in03 = ( ushort ) rand ();
   ushort in04 = ( ushort ) rand ();
   ushort in05 = ( ushort ) rand ();
   ushort in06 = ( ushort ) rand ();
   ushort in07 = ( ushort ) rand ();
   ushort in08 = ( ushort ) rand ();
   ushort in09 = ( ushort ) rand (); 
   sum = 0 ;
   union ushortTouint
   {
       uint param[ 5 ];
       ushort in[ 10 ];
   }U;
      ushortTouint u;
   SpeedTest( 22 , "tst 2 : " ,
   { 
      u.in[ 0 ] = in00;
      u.in[ 1 ] = in01;
      sum +=u.param[ 0 ];
      u.in[ 2 ] = in02;
      u.in[ 3 ] = in03;
      sum +=u.param[ 1 ];
      u.in[ 4 ] = in04;
      u.in[ 5 ] = in05;
      sum +=u.param[ 2 ];
      u.in[ 6 ] = in06;
      u.in[ 7 ] = in07;
      sum +=u.param[ 3 ];
      u.in[ 8 ] = in08;
      u.in[ 9 ] = in09;
      sum +=u.param[ 4 ];
     //  Comment(121);
   //  for(int i = 0; i < 5; i++) sum += u.param[i];
   });
Print (sum);
}
 
Alexandr Andreev :

biraz elden geçirdim

(bu yüzden makro kullanmamak daha iyidir;)

test ederken, optimize edicinin boş döngüler atmaması için kodu mümkün olduğunca karıştırırım

sen

 //  for(int i = 0; i < 5; i++) sum += u.param[i];

MQL yürütmesinin optimizasyonu, ilk döngüyü programdan önce sonlandırabilir, çünkü hesaplanan değerler kullanılmaz, bu nedenle SpeedTest() işleminden sonra sonuçlarla bir şeyler yapmanız gerekir - bu döngü

yorumlanmış bir döngü ile kontrol edildi, onu atmadı, ancak başka bir testte kopabilirsiniz


makrolar zevk meselesi, bu makroyu defalarca kontrol ettim, çalışıyor, aynı şeyi elle yazmak için bir neden göremiyorum



UPD: Modern derleyicilerin nasıl çalıştığını okuduğum yeri buldum, oldukça bilgilendirici

https://habr.com/ru/post/431688/

https://habr.com/en/post/47878/

 

kod, tutamaçların iRSI değerini verir ve bu şekilde devam eder, her zaman yalnızca 10'dur, ancak fiyatlar ve grafik aynı şekilde değişir.

iRSI(_Symbol, PERIOD_H1,14 ,PRICE_CLOSE)


2652 inşa

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.
 
Aleksei Skrypnev :

kod, tutamaçların iRSI değerini verir ve bu şekilde devam eder, her zaman yalnızca 10'dur, ancak fiyatlar ve grafik aynı şekilde değişir.

iRSI(_Symbol, PERIOD_H1,14 ,PRICE_CLOSE)


2652 inşa

Gösterge kolunu aldın, 10

Ardından, istenen çubuktaki değerleri almanız gerekir.

 //--- создадим хэндл индикатора
   if (type==Call_iRSI)
      handle= iRSI (name,period,ma_period,applied_price);

//--- индикаторный буфер
double   rsi_buffer[];

//--- заполняем часть массива iRSIBuffer значениями из индикаторного буфера под индексом 0
   if ( CopyBuffer (ind_handle, 0 , 0 ,amount,rsi_buffer)< 0 )
     {
       //--- если копирование не удалось, сообщим код ошибки
       PrintFormat ( "Не удалось скопировать данные из индикатора iRSI, код ошибки %d" , GetLastError ());
       //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
       return ( false );
     }

Yardımı okuyun veya forumda yanıt arayın - birçok

Документация по MQL5: Технические индикаторы / iRSI
Документация по MQL5: Технические индикаторы / iRSI
  • www.mql5.com
//|                                                    Demo_iRSI.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iRSI;               ...
 
Vitaly Muzichenko :

Gösterge kolunu aldın, 10

Ardından, istenen çubuktaki değerleri almanız gerekir.

Yardımı okuyun veya forumda yanıt arayın - birçok

Anladım. Tamponlar hakkında çalışacağım. Her şeyin zaten çalıştığına dair garip bir his vardı, belki mql4 ile karıştırdım.

İstek üzerine Google aracılığıyla bulamamam garip - mql5'teki göstergeden veri alıyorum


Evet, örneğinize göre, anladığım kadarıyla, RSI göstergesinin değeri sonuçta formun bir değişkeninde

rsi_buffer[0] 
 
Igor Makanu :

kontrol:

2020.10.15 21:48:01.401 HızTst (EURUSD,H1) tst1 : : döngüler=10000000000 ms=10864370

2020.10.15 21:48:12.264 HızTst (EURUSD,H1) tst2 : : döngüler=10000000000 ms=10862287

önemli bir fark değil, testleri değiştirirseniz sonuçların tam tersi olması kuvvetle muhtemeldir.

genellikle kritik değildir.

teste rand() eklemek pek doğru değil, çünkü bu işlev, kaynakları diğer komutlardan çok daha fazla tüketir.
Bence bu daha iyi bir test olurdu:

 #define Num 1000000
#define SpeedTest(msg,s,EX)  { ulong mss= GetMicrosecondCount (); EX \
                                    mss= GetMicrosecondCount ()-mss;\
                                     printf ( "%-22s%llu µs; Сумма - %llu" ,msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   ulong sum = 0 ;
   ushort in[];
   ArrayResize (in,Num* 2 );
   for ( int i= 0 ; i<Num* 2 ; i++) in[i] = ( ushort ) rand ();
   SpeedTest( "test binary shift : " , sum,
   for ( int i = 0 ;i<( 2 *Num- 1 ) && ! _StopFlag ;i+= 2 )
   {
      sum+=in[i]<<( sizeof ( ushort )* 8 ) | in[i+ 1 ];
   });
//--   
   sum = 0 ;
   union ushortTouint
   {
       uint param;
       ushort in[ 2 ];
   } u;
   SpeedTest( "test union : " , sum,
   for ( int i = 0 ;i<( 2 *Num- 1 ) && ! _StopFlag ;i+= 2 )
   {
      u.in[ 0 ]=in[i+ 1 ];
      u.in[ 1 ]=in[i];
      sum+=u.param;
   });
}

Sonuç:

 2020.10 . 15 17 : 14 : 03.168 TestMakanu (USDCAD,M1)  test binary shift :   1384 µs; Сумма - 1074434582054198
2020.10 . 15 17 : 14 : 03.169 TestMakanu (USDCAD,M1)  test union :           1209 µs; Сумма - 1074434582054198
2020.10 . 15 17 : 14 : 19.370 TestMakanu (USDCAD,M1)  test binary shift :   1891 µs; Сумма - 1073924616844949
2020.10 . 15 17 : 14 : 19.371 TestMakanu (USDCAD,M1)  test union :           1289 µs; Сумма - 1073924616844949
2020.10 . 15 17 : 14 : 20.949 TestMakanu (USDCAD,M1)  test binary shift :   1342 µs; Сумма - 1073194788831653
2020.10 . 15 17 : 14 : 20.950 TestMakanu (USDCAD,M1)  test union :           1178 µs; Сумма - 1073194788831653
2020.10 . 15 17 : 14 : 27.141 TestMakanu (USDCAD,M1)  test binary shift :   1365 µs; Сумма - 1075017290553168
2020.10 . 15 17 : 14 : 27.142 TestMakanu (USDCAD,M1)  test union :           1362 µs; Сумма - 1075017290553168
2020.10 . 15 17 : 14 : 28.202 TestMakanu (USDCAD,M1)  test binary shift :   1354 µs; Сумма - 1075051817914563
2020.10 . 15 17 : 14 : 28.203 TestMakanu (USDCAD,M1)  test union :           1105 µs; Сумма - 1075051817914563

Neyse ki, hala yanlış ata bahse giriyorum. Sendikalar biraz daha hızlı. Onlarla çalışmak daha uygundur ve kod daha okunabilirdir.

 
Nikolai Semko :

teste rand() eklemek pek doğru değil, çünkü bu işlev, kaynakları diğer komutlardan çok daha fazla tüketir.

genellikle kritik olmayan

rand() çalışma zamanı sabittir, büyük olasılıkla normal bir C++ işlevidir, google "Rand c++ kaynak kodu"

başlatmak gerekir, ancak sabitlerle başlatırsanız, optimizasyonla karşılaşabilirsiniz.

genel olarak, rand () 'dan hoşlanmadığım belli değil

böyle bir şeyle başlatma seçeneği olarak:

 void OnStart ()
{
   for ( int i= 0 ;i< 20 ;i++) Print (Myvalue());

}
//+------------------------------------------------------------------+
int Myvalue()
{
   const static int arr[] = { 3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 };
   static int cnt = ArraySize (arr);
   if (--cnt < 0 ) cnt = ArraySize (arr) - 1 ;
   return (arr[cnt]);
}

hızlı olacak


betiğinizi başlattı, IMHO doğru değil

ana zaman, kodu önbelleğe ve ardından işlemciye yüklemektir.

peki, sistem zamanlayıcısının ayrıklığını ekleyin

neredeyse rastgele bir sayı alıyoruz

uzun bir süre, yaklaşık 100500 kez test etmeniz gerekiyor, IMHO

 
Nikolai Semko :

teste rand() eklemek pek doğru değil, çünkü bu işlev, kaynakları diğer komutlardan çok daha fazla tüketir.
Bunun daha iyi bir test olacağını düşünüyorum:

Sonuç:

Neyse ki, hala yanlış ata bahse giriyorum. Sendikalar biraz daha hızlı. Onlarla çalışmak daha uygundur ve kod daha okunabilirdir.


birer birer ve ilk galibiyet mesafesinde, (göründüğü gibi, ilk yöntem dönüşüm çizgisini kısa devreden bir şeye kaldırdı)

 
Igor Makanu :

genellikle kritik olmayan

rand() çalışma zamanı sabittir, büyük olasılıkla normal bir C++ işlevidir, google "Rand c++ kaynak kodu"

başlatmak gerekir, ancak sabitlerle başlatırsanız, optimizasyonla karşılaşabilirsiniz.

genel olarak, rand () 'dan hoşlanmama net değil

böyle bir şeyle başlatma seçeneği olarak:

hızlı olacak

ölçüm yaparken, tam olarak neyin gerekli olduğunu, gereksiz olmadan ölçmek gerekiyordu.

 
Alexandr Andreev :

ölçüm yaparken, tam olarak neyin gerekli olduğunu, gereksiz olmadan ölçmek gerekiyordu.

Numara

yinelenen kod bölümleri varsa - optimizasyon testi yapın!

rand()'ın ne kadar süre çalıştığı ne fark eder?

evet, test süresinin 2/3'ünü çalıştırmasına izin verin, asıl mesele rand()'ın çalışma süresinin sabit olmasıdır

IMHO, sistem işlevlerini yürütmek için bağlamı değiştirmeniz gerekiyor, ancak MQL kodunuz sistem MQL işlevlerini kullanacak mı? - test edilecek ideal kodun anlamı?