终于有实现让ami批量读日期了,但新的问题又来了。

Discussion in 'AmiBroker' started by woodark, Feb 9, 2009.

  1. lname = "right";
    fh = fopen( "c:\\AmiBackup\\" + lname + ".csv", "r");
    if( fh )
    {
    while( ! feof( fh ) )
    {
    aa=DateNum()==1000000+StrToNum( fgets( fh ) );

    Plot(aa AND TimeNum()==091000,"day",colorRed,style=1);

    }
    }
    else
    {
    printf("ERROR: file can not be found (does not exist)");
    }
    以上程序可以通过批量读文本日期文件例如:“050606”即2005年6月6日“,每行一日期,多少日就有多少行。然后,ami可在相关的日期mark上标记。
    但现在发现,虽然能很好的实现我的要求,但运行速度相当的慢,如果日期过多会当机。我发现,ami总是反复不停的读取csv文件,不断的进行着不必要的重复从头到尾的运算。有没有哪位有办法只让ami读一次csv文件,然后就停止不读了。我发现用ami的ib autotrading,下完一单后,也总是不断的重复下单。
     
  2. 试试这个吧,其实所有只想运行一次的code都可以这样来用。

    加上一个trigger的好处是万一在一开始运行一次后,如果以后想手动让这一段code再运行一次,可以方便地使用这个按钮来做。

    你说得下单问题道理也一样。

    Code:
    trigger = ParamTrigger("ReadFile", "Click here to readfile"); 
    
    if(trigger)
    {
    StaticVarSetText("fileRead","");
    }
    
    
    flag = StaticVarGetText("fileRead"); 
    
    if(flag == ""  )
    {
    	  //code that only run once OR when triggered
    
         lname = "right";
         fh = fopen( "c:\\AmiBackup\\" + lname + ".csv", "r");
         if( fh )
         {
    			while( ! feof( fh ) )
    			{
    				aa=DateNum()==1000000+StrToNum( fgets( fh ) );
    
    				Plot(aa AND TimeNum()==091000,"day",colorRed,style=1);
    
    			}
    
    			StaticVarSetText("fileRead","Y");
    	}
    	else
    	{
    		printf("ERROR: file can not be found (does not exist)");
    	} 
    
    } 
     
  3. rendercat:你的代码思路是正确的。但是真运行时,我虽然点按钮会指标窗口会出现mark的标记,但之后,无论是点“OK”确认,还是屏幕任意其它位置,马上所有的标记全部消失,整个指标窗口被清空了。
     
  4. 对哦,多谢提醒,绘图是要不断刷新数据的,看来要把数据先读入内存,再每次绘图时使用。

    以下这个方法不算好,不过如果你的文件还不算太大的话,应该问题不大,可以试试看,应该比每次从文件读取要效率高些。


    Code:
    
    trigger = ParamTrigger("ReadFile", "Click here to readfile"); 
    
    if(trigger)
    {
    StaticVarSetText("fileRead","");
    }
    
    
    flag = StaticVarGetText("fileRead"); 
    
    if(flag == ""  )
    {
    
        lname = "right";
        fh = fopen( "c:\\AmiBackup\\" + lname + ".csv", "r");
    
    
        if( fh )
        {
    
             StaticVarSetText( "fileRead",fgets(fh));
    
             while( ! feof( fh ) )
             {
    
                  StaticVarSetText( "fileRead",StaticVarGetText("fileRead")+","+fgets(fh));
    
              }
    
              fclose( fh ); 
    
    
       }
       else
       {
          printf("ERROR: file can not be found (does not exist)");
       }
    
    }
    
    flag = StaticVarGetText("fileRead"); 
      
    for( item = 0; ( data = StrExtract( flag , item ) ) != ""; item++ ) 
    { 
          aa=DateNum()==1000000+StrToNum(data);
          Plot(aa AND TimeNum()==091000,"day",colorRed,style=1);
    } 
    
     
     
  5. 谢谢,这个方法不错,虽然有一些速度上的影响,但总比当机好。你一定对amibroker非常了解,像我想了一个晚上,也没想到可以通过这个思路解决问题。另外,还有一个小问题想请教你,那就是ParamTrigger窗口中的按钮和文字,在字体或颜色方面是否可以有办法自定义。我找了很久也没找到办法自定义。
     
  6. 呵呵,我也是在学习中,多交流能多学到东西。
    抱歉,自定义param窗口的文字颜色我也不会,好像说明书里也没找到,如果论坛上那位弟兄知道的话还望告知,多谢了。