Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 1022

 

ya da daha basit bir şekilde soracağım:

OnCalculate() işlevine bir döngü eklenir ve bu nedenle yalnızca bir yinelemeden geçer, bir sonraki yalnızca grafik güncellendiğinde....

 
ara66676 :

ya da daha basit bir şekilde soracağım:

OnCalculate() işlevine bir döngü eklenir ve bu nedenle yalnızca bir yinelemeden geçer, bir sonraki yalnızca grafik güncellendiğinde...

Görünen o ki medyumları görmen gerekiyor, ya da STÜDYO KODU.
 
bistreevseh :
Çok teşekkürler! Garip bir şekilde çalışıyor, yönetici haklarım var, özellikle sahibine tüm yıkımı verdiğim terminal klasörü için, yardımcı oldu, ancak daha sonra çalışmayı durdurdu. Sonra günlük dosyasını FileReadStrArrayW işleviyle okumaya çalıştım (adıyla yanılmıyorsam), boş satırlar okunuyor, ansi modunda komut dosyası donuyor. Yalnızca FileReadCharArr ansi kodlarını okumak için çıktı. Belki kitaplığınızı kullanarak günlük dosyasını nasıl ayrıştıracağınıza dair bir örneğiniz vardır? Çok minnettar olacağım!

Evet, şimdi günlüğü okumada bir sorun var. Eskiden daha kolaydı.

Gerçek şu ki, dosyanın kendisi ANSI kodludur ve satırlar artık UNICODE'dur.

İşte çalışan bir komut dosyası:

 #property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10 ;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
 {
   string sName = TimeToString ( TimeLocal (), TIME_DATE );
   StringReplace (sName, "." , "" );
   string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log" ;
   Print (sPath);
  
   if (!FileCheckW(sPath))
   {
     Print ( "Файл отсутствует!" );
     return ;
   }
    
   int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
   if (hFile == NULL )
   {
     Print ( "Файл не открыт!" );
     return ;
   }

   string asArray[];
   ArrayResize (asArray, NumLines);
   Print ( "hFile = " , hFile);
   for ( int i = 0 ; i < NumLines; i++) asArray[i] = string (i) + "                                                                                                                                                                                                                                                          " ;
  FileReadStrArrayMW(hFile, asArray, ArraySize (asArray), 0 , NumLines);
  FileCloseHandle(hFile);
   for ( int i = 0 ; i < NumLines; i++) Alert (asArray[i]);
 }

Ancak yalnızca günlük dosyası ilk olarak UNICODE'a kaydedilirse çalışır!

Onlar. kitaplık düzgün çalışıyor. Dosyanın ANSI kodlamasını UNICODE dize dizisine dönüştürmenin basit bir yolunu bulmam veya kitaplığa dosyayı okurken dizelerin kodlamasını dönüştürecek bir işlev eklemem gerekiyor.

======================

Seçenek 1. Dizilerle uğraşmanıza gerek yok. Tüm dosyayı ANSI olarak okuyun, UNICODE'a dönüştürün, ardından MQL kullanarak ayrıştırın.

Seçenek 2. ANSI olarak oku, terminalin geçerli dizinine yaz, CSV dosyalarıyla çalışmak için MQL fonksiyonlarını kullanarak oku.

Seçenek 3. Aynı kitaplıktan bir işlevle sanal alandaki günlük dosyasına sembolik bir bağlantı oluşturun ve CSV dosyalarıyla çalışmak için MQL işlevlerini kullanarak bunu okuyun:

 #property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
 {
   string sName = TimeToString ( TimeLocal (), TIME_DATE );
   StringReplace (sName, "." , "" );
  sName += ".log" ;
  
   string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
   string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
   Print (sPathLogs);
   Print (sPathFiles);
  
   if (!FileCheckW(sPathLogs))
   {
     Print ( "Файл отсутствует!" );
     return ;
   }
  
   if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
     Print ( "Символьная ссылка не создана!" );
     return ;
   }
  
  int hFile = FileOpen (sName, FILE_READ | FILE_CSV | FILE_ANSI , '\t' );
   if (hFile == INVALID_HANDLE )
   {
     Print ( "Файл не открыт!" );
     return ;
   }
  
   while (! FileIsEnding (hFile)) Alert ( FileReadString (hFile));
   FileClose (hFile);
 }

Bence bu en güzel ve basit seçenek.

 

Tek kanal göstergesi yazmaya çalışıyorum. Grafikte çizim değerleri hesaplandı ve double tob[] ve double tos[] dizilerine dolduruldu, ancak bunları grafikte çizim için arabelleğe bağlamaya çalışırken - 25 ve 26. satırlarda:

 SetIndexBuffer ( 0 , tob);
SetIndexBuffer ( 1 , tos);

, bu diziler yerine istenen değerler gibi:

0/1.424/1.3679
1/1.42/1.3639

2147483647 numarasıyla şu şekilde doldurulur:
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

Nasıl tedavi edilir?

Dosyalar:
channel1.mq4  7 kb
 
Dönemler arasında hızlı geçiş yapmak için kısayol tuşları var mı?
D düğmesine basıldığında H1 M15'e, U düğmesine basıldığında H1'e geçecektir.
 

MT4'ün gece ve gündüzü ayırması için bir şablon bulmama yardım et.

Diyelim ki grafikte 00:00 - 8:00 arası tablo bir renkte ve 8:00 - 00:00 arası başka bir renkte.

 

Hepiniz hoşgeldiniz.

Bu sorunla karşılaştı:

robot kod parçacığı:

int per=Dönem();
if(başına = 60)
{

Print("Periyot H1 değilse - bu satır logda olmamalıdır");

Yorum (...);

... // robotun gövdesinin devamı

...

...

}

grafikte H1 dışında bir nokta etkinleştirilirse, ne robotun gövdesinin, ne Print(...) satırının ne de Comment(...) satırının ekranda yürütülmeyeceğini ima eder.

Ancak, her şey herhangi bir dönemde yürütülür. Niye ya ?

Grafikteki süre belirtilen süreye uymuyorsa, kontrolü terminale geri döndürmek nasıl doğru yazılır. (Bu arada, RETURN (0) kullanmayı denedim - yardımcı olmuyor - yine de her şeyi yazdırıyor ...)

 
Dikons :

Hepiniz hoşgeldiniz.

Böyle bir sorunla karşılaştı:

robot kod parçacığı:

int per=Periyot();
if(başına = 60)
{

Print("Periyot H1 değilse - bu satır logda olmamalıdır");

Yorum(...);

... // robotun gövdesinin devamı

...

...

}

grafikte H1 dışında bir nokta etkinleştirilirse, ne robotun gövdesinin, ne Print(...) satırının ne de Comment(...) satırının ekranda yürütülmeyeceğini ima eder.

Ancak, her şey herhangi bir dönemde yürütülür. Niye ya ?

Grafikteki süre belirtilen süreye uymuyorsa, kontrolü terminale geri döndürmek nasıl doğru yazılır. (Bu arada, RETURN (0) kullanmayı denedim - yardımcı olmuyor - yine de her şeyi yazdırıyor ...)

Bir ödev yapıyorsunuz, ancak bir karşılaştırmaya ihtiyacınız var if(per == 60)
 
Trader76 :
Bir ödev yapıyorsunuz, ancak bir karşılaştırmaya ihtiyacınız var if(per == 60)

Teşekkürler yoldaş ... aksi takdirde tüm beyin kaynadı ... programlamada önemli bir kırılma oldu - az bildiğimden çok şey unuttum ...

---

Başka bir soru ... terminalde günde ilk 8 saat için max / mini aramasının bir parçası:

int h=ZamanSaati(ZamanAkım()); // mevcut terminal saatini öğrenin (0...23)
if (h<8) dönüş(0); // günün ilk 8 mumu için H1 yoksa = ayrıl...

double Maxi=Yüksek[iEn Yüksek(NULL, PERIOD_H1 ,MODE_HIGH,8,h-7)]; // günde ilk 8 mumun maksimumunu belirleyin.

double Mini=Düşük[iDüşük(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Grafikte H1 dışında bir nokta ayarlanmışsa son iki satır düzgün çalışmaz. Niye ya ? Sonuçta, hesaplamalar için süre açıkça robota verilir ...

Grafiğe örneğin H4'ü dahil ederseniz, robot H4 mumlarıyla (diğer periyotlarla aynı) yeniden hesaplayacaktır.

 
Dikons :

Teşekkürler yoldaş ... aksi takdirde tüm beyin kaynadı ... programlamada önemli bir kırılma oldu - az bildiğimden çok şey unuttum ...

---

Başka bir soru ... terminalde günde ilk 8 saat için max / mini aramasının bir parçası:

int h=ZamanSaati(ZamanAkım()); // mevcut terminal saatini öğrenin (0...23)
if (h<8) dönüş(0); // günün ilk 8 mumu için H1 yoksa = ayrıl...

double Maxi=Yüksek[iEn Yüksek(NULL,PERIOD_H1,MODE_HIGH,8,h-7)]; // günde ilk 8 mumun maksimumunu belirleyin.

double Mini=Düşük[iDüşük(NULL,PERIOD_H1,MODE_LOW,8,h-7)];


Grafikte H1 dışında bir nokta ayarlanmışsa son iki satır düzgün çalışmaz. Niye ya ? Sonuçta, hesaplamalar için süre açıkça robota verilir ...

Grafiğe örneğin H4'ü dahil ederseniz, robot H4 mumlarıyla (diğer periyotlarla aynı) yeniden hesaplayacaktır.

Burada bar max/min sayısını alırsınız: iHighest(NULL, PERIOD_H1 ,MODE_HIGH,8,h-7)

Ve sonra örneğin 2 numaralı çubuğu eklersiniz, bunun sonucunda şunu elde edersiniz: Yüksek [2] ve başka bir zaman diliminde H1'den farklı bir değer elde edersiniz. Yüksek hakkında okuyun.

iYüksek ( NULL , PERIOD_H1 , iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7) )