[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 364

 
Alsu,你的代码中的'n'变量并不清楚。如果是字段的数量,如果事先不知道,你怎么能找到它?
 
sibemol >> :
alsu先生,我不明白你代码中的'n'变量。如果是字段的数量,如果你事先不知道,你怎么能找到它?

但你要向文件中写入一些东西,不是吗? 或者你的意思是事先不知道CSV结构?那么,如果我们既不知道字段的数量,也不知道它们的类型(字符串、整数、浮动、时间),更不知道语义负载,那么在其中添加的意义何在?

 
alsu >> :

但你要向文件中写入一些东西,不是吗? 或者你的意思是事先不知道CSV结构?那么,如果我们既不知道字段的数量,也不知道它们的类型(字符串、整数、浮动、时间),更不知道它们的意义,那么向它添加的意义是什么?

我的任务很简单--将当前仪器的报价写到csv文件中,以便传输到其他应用程序。如果数据收集循环,一切都会成功写入,for(int i=Bars-1; i>=0; i--)。但是,如果我们用以下方法优化代码。

int counted_bars=IndicatorCounted(), limit;
如果(counted_bars==0)limit=Bars-1。
如果(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, "," )。

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

则零条被写在文件的开头。如果你使用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(), limit;
如果(counted_bars==0)limit=Bars-1。
如果(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, "," )。

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

则零条被写在文件的开头。如果你使用FileSeek(),这些行会随着每次打勾而增加,而我们需要最后一个文件行在当前栏被覆盖。

我希望现在一切都清楚了。以防万一,完整的未优化的运行代码。


还是在开始时记住文件中的当前位置更容易。

随着酒吧的变化而变化。

 
Sorento >> :

还是在开始时记住文件中的当前位置更容易。

随着酒吧的变化而变化。


如果你不介意的话,它在代码中看起来如何?

 

你能告诉我,是否有一个功能,可以从当前脚本中禁用所有在其他图表上的脚本?或者更好的是,完全关闭终端。

这样做的原因是,如果其中一个被启用的脚本 "注意到 "灾难即将来临--它将停止自己和其他所有脚本的工作。如果上述情况仍然无法实施,如何才能做到这一点?

 
sibemol >> :

我的任务很简单--将当前符号的报价写进csv文件,以便将其发送给另一个应用程序。一切都成功地写入了数据收集循环 for(int i=Bars-1; i>=0; i--)。但是,如果我们用以下方法优化代码。

int counted_bars=IndicatorCounted(), limit;
如果(counted_bars==0)limit=Bars-1。
如果(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, "," )。

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

则零条被写在文件的开头。如果你使用FileSeek(),这些行会随着每次打勾而增加,而我们需要最后一个文件行在当前栏被覆盖。

我希望现在一切都清楚了。以防万一,完整的未经优化的工作代码。


我不明白问题出在哪里。

下面是你的文字摘录,请阅读田野。

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

符号、周期、日期、时间、OHLCV - CSV中共有9个字段。在我上面的列表中,它们都被读作字符串,但这并不重要,因为对我们来说重要的不是它们的值,而是它们在字符串中的编号。

用9代替n并使用它,该子程序是通用的。

同时,正如Sorento所说,你可以写一个变量,它将记住每条记录前的指针位置。 然后在下一条记录前,如果需要,你可以将光标移到上一条记录的开头并覆盖它。注意,你应该把文件打开移到init(),关闭移到deinit()。变量f应该全局声明。

好吧,这就是尽可能多的细节。把它看作是家庭作业:)))))))

 
Mathers >> :

你能告诉我,是否有一个功能,可以从当前脚本中禁用所有在其他图表上的脚本?或者更好的是,完全关闭终端。

这样做的原因是,如果其中一个被启用的脚本 "注意到 "灾难即将来临--它将停止自己和其他所有脚本的工作。如果上述情况无法实施,如何才能做到这一点?

我将以全局变量的形式为脚本设置一个标志,这个标志可以被其他脚本读取,并按时清洗。

 

alsu писал(а) >>

好吧,这已经是你能得到的最详细的信息了。把它看作是家庭作业:)))))))

谢谢你的答复,我会试一试,让你知道发生了什么。

 
重新设计了 VSI指标.想得到正负的体积.结果是惊人的.什么地方来的?不清楚的数学。
附加的文件:
原因: