[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 364

 
SW. alsu, 'n' değişkeni kodunuzda net değil. Bu alanların sayısıysa, önceden bilinmiyorsa nasıl bulunur?
 
sibemol >> :
SW. alsu, 'n' değişkeni kodunuzda net değil. Bu alanların sayısıysa, önceden bilinmiyorsa nasıl bulunur?

ama sonuçta bir dosyaya bir şey mi yazacaksınız? Yoksa CSV yapısının önceden bilinmediğini mi kastediyorsunuz? O zaman, alanların sayısını veya türlerini (dize, tamsayı, kayan, zaman) veya anlamsal yükü bilmiyorsak, buna eklemenin anlamı nedir?

 
alsu >> :

ama sonuçta bir dosyaya bir şey mi yazacaksınız? Yoksa CSV yapısının önceden bilinmediğini mi kastediyorsunuz? O zaman, alanların sayısını veya türlerini (dize, tamsayı, kayan, zaman) veya anlamsal yükü bilmiyorsak, buna eklemenin anlamı nedir?

Görevim basit - mevcut enstrümanın alıntılarını başka bir uygulamaya aktarmak için bir csv dosyasına yazmak. (int i=Bars-1; i>=0; i--) için veri toplama döngüsü koşulu altında her şey başarıyla yazılmıştır. Ancak aşağıdakileri kullanarak kodu optimize ederseniz:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

for(int i=limit; i>=0; i--), ile

ve int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ","); yerine

insert int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");

daha sonra dosyanın başına sıfır çubuğu yazılır. FileSeek() kullanırsanız, satırlar her onay işaretiyle eklenir, ancak mevcut çubukta dosyanın son satırının üzerine yazılması gerekir.

Umarım şimdi her şey açıktır. Ancak her ihtimale karşı, optimize edilmemiş çalışma kodunun tamamı:

 //+------------------------------------------------------------------+
//|                                                  iHisoryBars.mq4 |
//|                                        Copyright © 2009, Sibemol |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Sibemol"
#property link       ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 White
//---- input parameters
double v1 [ ] ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init ( )
   {
//---- indicators 
   SetIndexStyle ( 0 , DRAW_LINE ) ;   
   SetIndexBuffer ( 0 , v1 ) ;       
//----
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit ( )
   {
//----
   
//----
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start ( )
   {   
   int counted_bars = IndicatorCounted ( ) , limit ;
   if ( counted_bars = = 0 )   limit = Bars - 1 ;
   if ( counted_bars > 0 )    limit = Bars - counted_bars - 1 ;     
   int f = FileOpen ( Symbol ( ) + " " + Period ( ) + ".csv" , FILE_CSV | FILE_WRITE , "," ) ;
   //int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");    
   FileWrite ( f ,
   "<ticker>,<per>,<date>,<time>,<open>,<high>,<low>,<close>,<volume>,<oi>" ) ;
   for ( int i = Bars - 1 ; i > = 0 ; i - - )
     {
    v1 [ i ] = Close [ i ] ;     
     int _Year = TimeYear ( Time [ i ] ) ,
        _Month = TimeMonth ( Time [ i ] ) ,
        _Day = TimeDay ( Time [ i ] ) ,
        _Hour = TimeHour ( Time [ i ] ) ,
        _Minute = TimeMinute ( Time [ i ] ) ;
        
     string Y , M , D , H , Mi , Date , _Time ;
        
     if ( _Month < 10 ) M = "0" + DoubleToStr ( _Month , 0 ) ; else M = DoubleToStr ( _Month , 0 ) ;
     if ( _Day < 10 ) D = "0" + DoubleToStr ( _Day , 0 ) ; else D = DoubleToStr ( _Day , 0 ) ;
     if ( _Hour < 10 ) H = "0" + DoubleToStr ( _Hour , 0 ) ; else H = DoubleToStr ( _Hour , 0 ) ;
     if ( _Minute < 10 ) Mi = "0" + DoubleToStr ( _Minute , 0 ) ; else Mi = DoubleToStr ( _Minute , 0 ) ;
    Date = DoubleToStr ( _Year , 0 ) + M + D ;
    _Time = H + Mi ;
        
     FileWrite ( f ,      
     Symbol ( ) , Period ( ) ,
    Date , _Time ,      
     Open [ i ] , High [ i ] , Low [ i ] , Close [ i ] , Volume [ i ] , 0 ) ;
    
     }
    
     FileClose ( f ) ;
    
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
 
sibemol >> :

Görevim basit - mevcut enstrümanın alıntılarını başka bir uygulamaya aktarmak için bir csv dosyasına yazmak. (int i=Bars-1; i>=0; i--) için veri toplama döngüsü koşulu altında her şey başarıyla yazılmıştır. Ancak aşağıdakileri kullanarak kodu optimize ederseniz:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

for(int i=limit; i>=0; i--), ile

ve int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ","); yerine

insert int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");

daha sonra dosyanın başına sıfır çubuğu yazılır. FileSeek() kullanırsanız, satırlar her onay işaretiyle eklenir, ancak mevcut çubukta dosyanın son satırının üzerine yazılması gerekir.

Umarım şimdi her şey açıktır. Ancak her ihtimale karşı, optimize edilmemiş çalışma kodunun tamamı:


dosyanın başındaki mevcut konumu hatırlamak yerine.

Bir çubuk değişikliği ile değiştirin.

 
Sorento >> :

dosyanın başındaki mevcut konumu hatırlamak yerine.

Bir çubuk değişikliği ile değiştirin.


Sizin için zor değilse, kodda nasıl görünecek?

 

Ancak, mevcut komut dosyasından diğer çizelgelerde asılı olan tüm komut dosyalarını devre dışı bırakmak için böyle bir özellik olup olmadığını söyleyebilir misiniz? Ya da daha iyisi, terminali tamamen kesin.

Aslında bu, içerilen betiklerden biri bir kerdyk'in yaklaştığını "fark ederse" hem kendisinin hem de diğer herkesin işini durdurması amacıyla yapılır. Yukarıdaki durumların uygulanması hala imkansızsa, bu nasıl yapılabilir?

 
sibemol >> :

Görevim basit - mevcut enstrümanın alıntılarını başka bir uygulamaya aktarmak için bir csv dosyasına yazmak. (int i=Bars-1; i>=0; i--) için veri toplama döngüsü koşulu altında her şey başarıyla yazılmıştır. Ancak aşağıdakileri kullanarak kodu optimize ederseniz:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

for(int i=limit; i>=0; i--), ile

ve int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ","); yerine

insert int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");

daha sonra dosyanın başına sıfır çubuğu yazılır. FileSeek() kullanırsanız, satırlar her onay işaretiyle eklenir, ancak mevcut çubukta dosyanın son satırının üzerine yazılması gerekir.

Umarım şimdi her şey açıktır. Ancak her ihtimale karşı, optimize edilmemiş çalışma kodunun tamamı:


sorun ne anlamıyorum

İşte metninizden bir alıntı, kenar boşluklarını sayın:

 FileWrite ( f ,      
     Symbol ( ) , Period ( ) ,
    Date , _Time ,      
     Open [ i ] , High [ i ] , Low [ i ] , Close [ i ] , Volume [ i ] , 0 ) ;

Sembol, dönem, tarih, saat, OHLCV - CSV'de toplam 9 alan. Yukarıda verdiğim listede, hepsi bir dizi olarak okunuyor, ancak bunun bir önemi yok, çünkü bizim için önemli olan değerleri değil, bir satırdaki sayılarıdır.

n yerine 9 koyun ve kullanın, alt program evrenseldir.

Aynı zamanda, Sorento'nun haklı olarak belirttiği gibi, her girişten önce işaretçinin konumunu hatırlayacak bir değişken girebilirsiniz, ardından bir sonrakinden önce, gerekirse imleci son girişin başlangıcına taşıyabilirsiniz ve üzerine yaz. Bu durumda, dosyanın açılışını sırasıyla init () ve kapanışını deinit () konumuna taşımanız gerektiğini unutmayın. f değişkeni global düzeyde bildirilmelidir.

Her şey mümkün olduğunca ayrıntılı görünüyor. bence ödev :)

 
Mathers >> :

Ancak, mevcut komut dosyasından diğer çizelgelerde asılı olan tüm komut dosyalarını devre dışı bırakmak için böyle bir özellik olup olmadığını söyleyebilir misiniz? Ya da daha iyisi, terminali tamamen kesin.

Aslında bu, içerilen betiklerden biri bir kerdyk'in yaklaştığını "fark ederse" hem kendisinin hem de diğer herkesin işini durdurması amacıyla yapılır. Yukarıdaki durumların uygulanması hala imkansızsa, bu nasıl yapılabilir?

Kerdyk'i "ateşleyen" komut dosyasından, diğer komut dosyalarının okuyabileceği ve zamanında ellerini yıkayabileceği global bir değişken biçiminde bir bayrak ayarlardım.

 

alsu писал(а) >>

Her şey mümkün olduğunca ayrıntılı görünüyor. bence ödev :)

Cevap için teşekkürler deneyip sonuçları yazacağım.

 
VSI göstergesini yeniden düzenledim. Artı ve eksi hacimleri almak istedim. Sonuç hayrete düşürdü. Nereden geldi? Garip matematik.
Dosyalar: