Hatalar, hatalar, sorular - sayfa 561

 

ArrayInitialize kodu çalışmıyor; döngünün yorumunu kaldırırsanız, her şey yolunda demektir.

Ve sınıftaki değişkenleri ve global düzeydeki göstergeyi aynı isimlerle bildirirken bir uyarı çıkıyor.

 #property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1   "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- plot Line2
#property indicator_label2   "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2   1
//--- indicator buffers
double          Line1Buffer[];
double          Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit ()
  {
   SetIndexBuffer ( 0 ,Line1Buffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,Line2Buffer, INDICATOR_DATA );
   ArraySetAsSeries (Line1Buffer, true ) ;
   ArraySetAsSeries (Line2Buffer, true ) ;
   ArrayInitialize (Line1Buffer, EMPTY_VALUE ) ;
   ArrayInitialize (Line2Buffer, EMPTY_VALUE );
   return ( 0 );
  }
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
       ArraySetAsSeries (price, true ) ;
       int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
       for (i= 0 ;i< 100 ;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

Hafta sonu, tık yokken, demo hesaplarındaki göstergede hata ayıkladım, son derlemede MT5 terminalinin iki örneğini çalıştırdım, ancak farklı şirketlerden: MetaQuotes ve EGlobal. Ayarlar her yerde aynı. Emin olmak için çevrimdışı olarak kontrol ettim, bu yüzden kene faktörü hariç tutuldu.

Sorun, farklı şirketlerin farklı terminallerindeki en basit "gösterge altı" kodunun (tam teşekküllü ve daha karmaşık bir göstergeden bahsetmiyorum bile) sonucun farklı bir miktarını göstermesidir:

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit ()
  {
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );

   handle= iFractals ( _Symbol , PERIOD_CURRENT );
   if (handle== INVALID_HANDLE ) return (- 1 );

   return ( 0 );
  }

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   Print ( 1 );

   return (rates_total);
  }

1. Eglobal . 2. Meta alıntılar . EGküreselMetaAlıntılar

Her iki terminali de tamamen boşalttım (bellekteki işlemler için Görev Yöneticisi aracılığıyla kontrol ettim), tekrar yükledim ve her iki kodu da yeniden derleme durumunda. Sonunda - değişiklik yok.

 
Burada olması gerektiği gibi şaşırtıcı bir şey yok.
 

MathRound() , 4 ve 5'te farklı çalışır, ancak aynı olmalıdır.

4. kod:

 int start()
{
   double minlot= 0.01 ;
   double step  = 0.01 ;
   Print (minlot+step* MathRound (( 0.005 - minlot)/step));
   return ( 0 );
}

5. kod:

 void OnStart ()
{
   double minlot= 0.01 ;
   double step  = 0.01 ;
   Print (minlot+step* MathRound (( 0.005 - minlot)/step));
}
 
joo :

MathRound(), 4 ve 5'te farklı çalışır, ancak aynı olmalıdır.

4. kod:

5. kod:

Sorun burada:

   double y= MathRound (- 0.5 );
   Print ( "Округление -0.5 до " ,y);

bu değer 4-ke ve 5-ke'de farklı şekilde yuvarlanır.

 
Loky :
Burada olması gerektiği gibi şaşırtıcı bir şey yok.
Ve daha spesifik olarak?
 

Test kesintiye uğrarsa MT5 neden siparişlerin geçmişini vb. kaydetmiyor? MT4'e kaydedildi.

Ayrıca, test tablosundan siparişlerin geçmişinde herhangi bir konumlandırma yoktur - büyük düşüşler alanındaki siparişleri grafiğe tıklayarak görüntülemek uygun oldu.

 

İyi akşamlar.

Lütfen bana SLeep() yönteminin nasıl çalıştığını açıklayabilir misiniz?

Fikre göre Uzman Danışmanı belli bir süre askıya almalı yoksa yanılıyor muyum?


{for (int uyku=0;uyku<10000;uyku++)

if ( BarsCalculated (Handle)>=o_bars_reoptimate)

{ Print(BarsCalculated(Tutamak)); kırmak; } başka Uyku(100);}

Bu koda göre şu sonucu bekliyorum - Belirli bir göstergenin Hesaplanan çubuk sayısı belirli bir değerin üzerine çıkarsa döngü kesintiye uğrar; Aksi takdirde, 100ms miktarında daha fazla kod yürütme Gecikmesi olur. Toplam olası toplam gecikme 100*10000 ms'dir....Göstergeyi hesaplamak için yeterli süre. O zaman kod neden çalışmaya devam ediyor? (bu döngüyü takip eder) Veya test cihazında bu işlev benim varsaydığım gibi çalışmıyor. Açıklamalar için şimdiden teşekkürler.

 
mi__x__an :

İyi akşamlar.

Lütfen bana SLeep() yönteminin nasıl çalıştığını açıklayabilir misiniz?

Fikre göre Uzman Danışmanı belli bir süre askıya almalı yoksa yanılıyor muyum?


{for (int uyku=0;uyku<10000;uyku++)

if (BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsHesaplanan(Tutamak)); kırmak; } başka Uyku(100);}

Bu koda göre şu sonucu bekliyorum - Belirli bir göstergenin Hesaplanan çubuk sayısı belirli bir değerin üzerine çıkarsa döngü kesintiye uğrar; Aksi takdirde, 100ms miktarında daha fazla kod yürütme Gecikmesi olur. Toplam olası toplam gecikme 100*10000 ms'dir....Göstergeyi hesaplamak için yeterli süre. O zaman kod neden çalışmaya devam ediyor? (bu döngüyü takip eder) Veya test cihazında bu işlev benim varsaydığım gibi çalışmıyor. Açıklamalar için şimdiden teşekkürler.

Uyku göstergelerinde çalışmıyor
 

Beynin çıngırağı, örneğin CopyBuffer gibi belgelerden kaynaklanır: " Gösterge değerlerini başka bir diziye ( gösterge arabelleği değil) kısmen kopyalamak gerekiyorsa, bu amaçlar için bir ara dizi kullanmak gerekir. gerekli miktarda kopyalanır. Ve bu aracı diziden, istenen sayıda değerin alıcı dizide istenen yerlere eleman-eleman kopyalanmasını üretmek için. "

 int    CopyBuffer (
   int        indicator_handle,     // handle индикатора
   int        buffer_num,           // номер буфера индикатора
   [...]
   );

Buffer_num'a açıkça atıfta bulunuluyorsa, o zaman kesinlikle ilk önce alıcı diziyi bir veya başka bir sıra numarası altındaki gösterge arabelleğiyle SetIndexBuffer aracılığıyla, büyük olasılıkla INDICATOR_CALCULATIONS kisvesinde bağlama ihtiyacı anlamına gelir. Ancak " gösterge değerlerinin kısmi bir kopyasını başka bir diziye (gösterge arabelleği değil) yapmak gerekirse ", o zaman herhangi bir buffer_num söz konusu olamaz, çünkü bu bir gösterge değildir ve tanım gereği yapmadık. herhangi bir şeye bağla.

Çelişki mi?

belirsizlik?

Yoksa tamamen programlanmış mıyım?

Gösterge arabelleğinin net bir tanımını kendi başıma bulmaya çalıştım ama bulamadım. SetIndexBuffer aracılığıyla bağlantılı mı, yoksa bu yeterli değil mi ve ID INDICATOR_DATA olan bir dizi olması gerekiyor mu?