[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 364

 
남. 또한 변수 'n'이 코드에서 명확하지 않습니다. 이것이 필드의 수라면 사전에 알려지지 않은 경우 어떻게 찾을 수 있습니까?
 
sibemol >> :
남. 또한 'n' 변수는 코드에서 명확하지 않습니다. 이것이 필드의 수라면 사전에 알려지지 않은 경우 어떻게 찾을 수 있습니까?

하지만 결국 파일에 무언가를 쓰려고 합니까? 아니면 CSV 구조를 미리 알 수 없다는 뜻인가요? 그러면 필드의 수나 유형(문자열, 정수, 부동, 시간) 또는 의미론적 로드를 모르는 경우 추가해야 하는 점은 무엇입니까?

 
alsu >> :

하지만 결국 파일에 무언가를 쓰려고 합니까? 아니면 CSV 구조를 미리 알 수 없다는 뜻인가요? 그렇다면 필드의 수나 유형(문자열, 정수, 부동, 시간) 또는 의미론적 로드를 모르는 경우 추가하는 요점이 무엇입니까?

내 작업은 간단합니다. 다른 응용 프로그램으로 전송하기 위해 현재 기기의 따옴표를 csv 파일에 쓰는 것입니다. for(int i=Bars-1; i>=0; i--)에 대한 데이터 수집 주기 조건에서 모든 것이 성공적으로 작성되었습니다. 그러나 다음을 사용하여 코드를 최적화하는 경우:

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

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

그리고 int 대신 f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

그런 다음 파일 시작 부분에 0 막대가 기록됩니다. FileSeek()를 사용하면 각 눈금과 함께 행이 추가되지만 파일의 마지막 행은 현재 표시줄에서 덮어써야 합니다.

이제 모든 것이 명확해지기를 바랍니다. 그러나 만일을 대비하여 최적화되지 않은 완전한 작업 코드는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                  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 >> :

내 작업은 간단합니다. 다른 응용 프로그램으로 전송하기 위해 현재 기기의 따옴표를 csv 파일에 쓰는 것입니다. for(int i=Bars-1; i>=0; i--)에 대한 데이터 수집 주기 조건에서 모든 것이 성공적으로 작성되었습니다. 그러나 다음을 사용하여 코드를 최적화하는 경우:

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

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

그리고 int 대신 f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

그런 다음 파일 시작 부분에 0 막대가 기록됩니다. FileSeek()를 사용하면 각 눈금과 함께 행이 추가되지만 파일의 마지막 행은 현재 표시줄에서 덮어써야 합니다.

이제 모든 것이 명확해지기를 바랍니다. 그러나 만일을 대비하여 최적화되지 않은 완전한 작업 코드는 다음과 같습니다.


처음에 파일의 현재 위치를 기억하는 것보다

막대의 변경으로 변경하십시오.

 
Sorento >> :

처음에 파일의 현재 위치를 기억하는 것보다

막대의 변경으로 변경하십시오.


당신에게 어렵지 않다면 코드에서 어떻게 보일 것입니까?

 

하지만 현재 스크립트의 다른 차트에 있는 모든 스크립트를 비활성화하는 기능이 있는지 알려주실 수 있습니까? 또는 더 나은 방법으로 터미널을 완전히 줄이십시오.

실제로 이것은 포함된 스크립트 중 하나가 kerdyk가 접근하고 있음을 "인식"하면 자신과 다른 모든 사람의 작업을 중지할 목적으로 수행됩니다. 위의 경우를 구현하는 것이 여전히 불가능하다면 어떻게 할 수 있습니까?

 
sibemol >> :

내 작업은 간단합니다. 다른 응용 프로그램으로 전송하기 위해 현재 기기의 따옴표를 csv 파일에 쓰는 것입니다. for(int i=Bars-1; i>=0; i--)에 대한 데이터 수집 주기 조건에서 모든 것이 성공적으로 작성되었습니다. 그러나 다음을 사용하여 코드를 최적화하는 경우:

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

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

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

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

그런 다음 파일 시작 부분에 0 막대가 기록됩니다. FileSeek()를 사용하면 각 눈금과 함께 행이 추가되지만 파일의 마지막 행은 현재 표시줄에서 덮어써야 합니다.

이제 모든 것이 명확해지기를 바랍니다. 그러나 만일을 대비하여 최적화되지 않은 완전한 작업 코드는 다음과 같습니다.


나는 무엇이 문제인지 이해하지 못한다.

다음은 귀하의 텍스트에서 발췌한 것입니다. 여백을 계산하십시오.

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

기호, 기간, 날짜, 시간, OHLCV - CSV의 총 9개 필드. 위에서 제공한 목록에서는 모두 문자열로 읽히지만 문제가 되지 않습니다. 우리에게 중요한 것은 가치가 아니라 일렬로 늘어선 숫자입니다.

n을 9로 대체하고 사용하면 서브루틴이 보편적입니다.

동시에 Sorento가 올바르게 언급했듯이 각 항목 이전의 포인터 위치를 기억할 변수를 입력하면 다음 항목 이전에 필요한 경우 커서를 마지막 항목의 시작 부분으로 이동하고 덮어씁니다. 이 경우 파일 열기를 init()로, 닫기를 deinit()로 각각 이동해야 합니다. 변수 f는 전역 수준에서 선언되어야 합니다.

글쎄, 모든 것이 가능한 한 자세하게 보입니다. 숙제라고 생각하세요 :)

 
Mathers >> :

하지만 현재 스크립트의 다른 차트에 있는 모든 스크립트를 비활성화하는 기능이 있는지 알려주실 수 있습니까? 또는 더 나은 방법으로 터미널을 완전히 줄이십시오.

실제로 이것은 포함된 스크립트 중 하나가 kerdyk가 접근하고 있음을 "인식"하면 자신과 다른 모든 사람의 작업을 중지할 목적으로 수행됩니다. 위의 경우를 구현하는 것이 여전히 불가능하다면 어떻게 할 수 있습니까?

나는 다른 스크립트가 읽고 제 시간에 손을 씻을 수 있는 kerdyk를 "실행"한 스크립트에서 전역 변수 형태로 플래그를 설정합니다.

 

alsu писал(а) >>

글쎄, 모든 것이 가능한 한 자세하게 보입니다. 숙제라고 생각하세요 :)

답변 감사합니다 해보고 결과 올리겠습니다.

 
나는 VSI 지표 를 다시 하였다. 나는 플러스와 마이너스의 볼륨을 얻고 싶었습니다. 결과는 기절했습니다. 그것은 어디에서 왔습니까? 이상한 수학.
파일: