Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 245

 
forexman77 :

Senaryoda şöyle bir şey yaptım:

zaman=0

SymbolInfoTick Pazartesi günü kontrol edecek

Bu kodla kontrol edebilirsiniz:

 void OnStart ()
{
   double ask;
   uint start= GetTickCount ();
   for ( int i= 0 ;i< 1000000 ;i++)
  {
    ask= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
  }
   uint time= GetTickCount ()-start;
   Print ( "SymbolInfoDouble = " ,time, " ms" );
  
   MqlTick tick;
  start= GetTickCount ();
   for ( int i= 0 ;i< 1000000 ;i++)
  {
     SymbolInfoTick ( Symbol (),tick);
  }
  time= GetTickCount ()-start;
   Print ( "SymbolInfoTick = " ,time, " ms" );
}

Ama sembolle kenelere ihtiyacımız var.

 
Fleder :

Bu kodla kontrol edebilirsiniz:

Ama sembolle kenelere ihtiyacımız var.

Evet, " SymbolInfoTick ", bugün test edilmedi.

Keneler gidene kadar denedim hiçbir şey işe yaramayacak

 void OnStart ()
  {
uint start= GetTickCount ();
double iask= 0 ;
MqlTick latest_price;       // Будет использоваться для текущих котировок  
if (! SymbolInfoTick ( _Symbol ,latest_price)){iask=latest_price.ask;}
Alert ( "iask=" ,iask);
uint time= GetTickCount ()-start;
Alert ( "time=" ,time);  
  }
iask=0
 
forexman77 :

Evet, "SymbolInfoTick", bugün test edilmedi.

Keneler gidene kadar denedim hiçbir şey işe yaramayacak

iask=0

Bu özellik çok hızlı.

Performansı ölçmek için, çok sayıda yineleme içeren bir döngüde birden çok çağrı uygulamanız ve toplam yürütme süresini ölçmeniz gerekir.

 
barabashkakvn :
Daha da ilginç olanı, bir kod örneği var. Sonucu bekliyoruz.
 
forexman77 :
Teşekkür ederim. İşe yaramak.
 

EA'da yeni bir çubuğu kontrol etmek için forumlarda bulduğum "CopyTime", "CopyRates" tabanlı işlevleri kullandım. Hesaplarının çok zaman aldığı sonucuna vardım.

İşte kontrol verileri ( gösterge çağrısının 171 ms sürmesi dikkat çekicidir):

 datetime New_Time[]; //буффер для проверки нового бара
void OnStart ()
  {
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{
static datetime t; //записываем старое время  
ArraySetAsSeries (New_Time, true ); //направление индексации
CopyTime ( _Symbol , _Period , 0 , 1 ,New_Time); //копируем время нового бара
t=New_Time[ 0 ];   
}
uint time= GetTickCount ()-start;
Print ( "New_Time = " ,time, " ms" );
  }

 MqlRates rates[]; 
void OnStart ()
  {
datetime t;  
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{
ArraySetAsSeries (rates, true );
int copied= CopyRates ( Symbol (), Period (), 0 , 1 ,rates);  
t=rates[ 0 ].time; 
}
uint time= GetTickCount ()-start;
Print ( "t = " ,time, " ms" );
  }

Sonra düşündüm ki, eğer denersem, başka bir şey. Örneğin "Zaman Akımı"

Optimizasyon için aşağıdaki kodu yaptı:

 void OnStart ()
  {
int t;
int s;  
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{

MqlDateTime m;
TimeCurrent (m);
t=m.min;
s=m.sec;
}
uint time= GetTickCount ()-start;
Print ( "time = " ,time, " ms" );    
  }

Expert Advisor'da optimizasyon için aşağıdaki kodu yaptım:

 static double ind1; //записываю значения
static double ind2; // значения
static double indsmall; //индикаторов
MqlDateTime m;
TimeCurrent (m);
int MIN=m.min;
int SEC=m.sec;
if (MIN== 0 && SEC== 0 )//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}

Her tikte gösterge değerleri elde edildiğinde, yeni bir çubuğu kontrol etmeden tek bir çalıştırmada sonuç: 817.196 ms

Yeni çubuk kontrolü ile: 735.904 ms

Fark özellikle etkileyici değil, iyileştirmeler var, ancak bu yeterli değil.

Göstergeyi şöyle alıyorum:

 int TSIHandle;   // хэндл индикатора  TSI
double TSI[]; // динамические массивы для хранения численных значений TSI

int OnInit ()
  {
TSIHandle= iCustom ( NULL , 0 , "Blau_TSI" ,q,r,s,u, PRICE_CLOSE );
if (TSIHandle< 0 ){ Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 );}
ArraySetAsSeries (TSI, true );
   return ( 0 );
  }

void OnDeinit ( const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease (TSIHandle);
   ArrayFree (TSI);
  }

void OnTick ()
  {
MqlDateTime m;
TimeCurrent (m);
int MIN=m.min;
int SEC=m.sec;
static double tsismall;

if (MIN== 0 && SEC== 0 )
{
//--- копируем значения индикаторов из индикаторных буферов
   if ( CopyBuffer (TSIHandle, 0 , 0 , 3 ,TSI)< 0 )
     {
       Alert ( "Ошибка копирования буферов индикатора Moving Average - номер ошибки:" , GetLastError (), "!!" );
       return ;
     }
tsismall=TSI[ 1 ];
}
}

Yeni çubuğun kontrol edildiği bloğa tanıtıcı çağrı ile kodu yerleştirmeye çalıştım, bu satırda bir hata oluşuyor

 if (TSIHandle< 0 ){ Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 );}

o dönüşü koydum hiçbir şey döndürmez, hata vermez, ancak danışman çalışmıyor.

Mümkünse tanıtıcı çağrısının ve genel olarak statik değişken dışındaki tüm ana kodun yeni bir çubuğu kontrol etmek için koşullu operatörün içine yerleştirilmesi gerektiğini varsayıyorum.

Bir yerde yanılmıyorsam kolu çağırsak da tamponlarda indikatör istemesek de yine de hesaplandığını okumuştum.

 
Yalnızca bir formül tamponunun [i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID) sonuçlarının çıktısına dayalı olarak nasıl bir gösterge yapılacağını kim söyleyebilir?) ))*10000;
 
rus-lot :
Yalnızca bir formül tamponunun [i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID) sonuçlarının çıktısına dayalı olarak nasıl bir gösterge yapılacağını kim söyleyebilir?) ))*10000;

Özel bir gösterge yazmanız gerekir. Süreci kolaylaştırmak için - en basit göstergelerden birini alın - iMa ve biraz yeniden yazın. İşte MarketInfo'dan bahseden başka bir konu . Kod yaz, yolunda gitmeyen bir şey olup olmadığını sor.

 
Statik değişkenlere ne oldu? Bugün terminalin eski yapısını güncelledim ve şimdi hatayı derlerken:

unresolved static variable
 
sgreen :
Statik değişkenlere ne oldu? Bugün terminalin eski yapısını güncelledim ve şimdi hatayı derlerken:

unresolved static variable

Şimdi sınıfın statik veri üyeleri yerleştirilmelidir :

 //+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public :
   static int         s_words;
   static int         s_symbols;
   //--- конструктор и деструктор
                     Parser( void );
                    ~Parser( void ){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words= 0 ;
int CParser::s_symbols= 0 ;