2017-11-03 1 views
0

以下のエラーがあります。エラー:数値オペランドが必要な%EVAL関数または%IF条件で文字オペランドが見つかりました

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: &N_GROUP

ERROR: The %TO value of the %DO I loop is invalid.

ERROR: The macro ORDERFLOW will stop executing.

リモートで送信しないでローカルでこれをテストしたところ、うまくいきました。しかし、WRDSサーバーでは動作しません。私はこれを修正するために多くのことを試みましたが、何が間違っているかを知ることはできません。

ここに私のコードです。参考までに、これはもっと大きなもののパイロットコードです。

%macro orderflow(YYYYMMDD=, CUTOFF=) /des = "Create OrderFlow"; 

%syslput YYYYMMDD = &YYYYMMDD; 
%syslput CUTOFF = &CUTOFF; 

%let wrds = wrds.wharton.upenn.edu 4016; 
options comamid=TCP; 
signon wrds username=_prompt_; 

rsubmit; 

/* Enter your WRDS institution name and your WRDS username */ 
options errors=2; 

/* STEP 1: RETRIEVE DAILY TRADE AND QUOTE (DTAQ) FILES */ 
    libname nbbo '/wrds/nyse/sasdata/taqms/nbbo'; 
    libname cq '/wrds/nyse/sasdata/taqms/cq'; 
    libname ct '/wrds/nyse/sasdata/taqms/ct'; 
    libname mast '/wrds/nyse/sasdata/taqms/mast'; 

    /* Create StockList each having 100 stocks */ 
    proc sql noprint; 
    select ceil(count(SYMBOL_ROOT)/&CUTOFF) into :N_GROUP  
    from mast.mastm_&YYYYMMDD 
    where LISTED_MARKET in ('A' 'N' 'T' 'Q') /* AMEX, NYSE, NASDAQ */ 
    and TAPE = 'A'       /* Common stock */  
    ; quit; 

    %do i=1 %to &N_GROUP; 
     %global STOCKLIST&i; 
     proc sql noprint; 
     select SYMBOL_ROOT into :STOCKLIST&i separated by '" "' 
     from mast.mastm_&YYYYMMDD 
     where LISTED_MARKET in ('A' 'N' 'T' 'Q') /* AMEX, NYSE, NASDAQ */ 
     and TAPE = 'A'        /* Common stock */ 
     and monotonic() between &cutoff*(&i-1)+1 and &cutoff*&i 
     ; quit; 


    /* Retrieve NBBO data */ 
    data DailyNBBO; 

     /* Enter NBBO file names in YYYYMMDD format for the dates you want */ 
     set nbbo.nbbom_&YYYYMMDD; 

     /* Enter company tickers you want */ 
     where sym_root in ("&&STOCKLIST&i") and 

     /* Quotes are retrieved prior to market open time to ensure NBBO 
      Quotes are available for beginning of the day trades */ 
     (("9:00:00.000000000"t) <= time_m <= ("9:30:00.000000000"t)); 
     format date date9.; 
     format time_m part_time trf_time TIME20.9; 
    run; 

    /* Retrieve Quote data */ 
    data DailyQuote; 

     /* Enter Quote file names in YYYYMMDD format for the same dates */ 
     set cq.cqm_&YYYYMMDD; 

     /* Enter the same company tickers as above */ 
     where sym_root in ("&&STOCKLIST&i") and 

     /* Quotes are retrieved prior to market open time to ensure NBBO 
      Quotes are available for beginning of the day trades*/ 
     (("9:00:00.000000000"t) <= time_m <= ("9:30:00.000000000"t)); 
     format date date9.; 
     format time_m part_time trf_time TIME20.9; 
    run; 

    /* Retrieve Trade data */ 
    data DailyTrade; 

     /* Enter Trade file names in YYYYMMDD format for the same dates */ 
     set ct.ctm_&YYYYMMDD; 

     /* Enter the same company tickers as above */ 
     where sym_root in ("&&STOCKLIST&i") and 

     /* Retrieve trades during normal market hours */ 
     (("9:30:00.000000000"t) <= time_m <= ("9:30:00.000000000"t)); 
     type='T'; 
     format date date9.; 
     format time_m part_time trf_time TIME20.9; 
    run; 

    /* Download to PC */ 
    proc download data=DailyNBBO out=taq.DailyNBBO_&&YYYYMMDD&i;  run; 
    proc download data=DailyQuote out=taq.DailyQuote_&&YYYYMMDD&i;  run; 
    proc download data=DailyTrade out=taq.DailyTrade_&&YYYYMMDD&i;  run; 

%end; 
%mend orderflow; 
%orderflow(YYYYMMDD=20141224,CUTOFF=100); 

コメントありがとうございます。ありがとう。

+0

あなたが修正しようとした多くのものをいくつか追加して、試してみるためにいくつかの重複した提案を得ることはできません。 – IncredibleHat

+0

ローカルで実行すると、RSUBMIT/SIGNON経由でWRDSサーバーに接続しますが、サーバー上で実行している場合は、それらのステートメントは必要ありませんか?私はそれがどのように設定されているか100%確信していません。あなたのコードに 'options mprint symbolgen mlogic;'を追加して、それを送信して、エラーメッセージと共に完全なログを投稿できますか? – Reeza

+0

アドバイスをいただきありがとうございます。また、以前私が知らなかったオプションを教えてくれてありがとうございます。あなたの助言はトムのことと同様にうまくいった! – Jay

答えて

1

このマクロは、SIGNONブロックとRSUBMIT/ENDRSUBMITブロックの両方を含んでいるため、LOCALマシン上で実行するように構成されています。

しかし、SQL INTO句を使用してリモートマシン上に作成されたマクロ変数N_GROUPを参照しています。私はそれがエラーメッセージの理由だと仮定します。

リモートマシン上で実行するマクロを定義するか、%SYSRPUTを使用してマクロ変数の値をローカルマシンに戻して、%DOループを制御するために使用します。

+0

ありがとう、トム!リモートサーバー上でマクロを定義することができました。どうして私はそれを考えなかったのですか?また、リモートとローカルの両方の設定でマクロ変数に関する他の解決策を探している間、私は他のユーザーにとっても私にとって有用な以下のリンクを見つけました。 http://documentation.sas.com/?docsetId=connref&docsetTarget=n1wm9969gdtuijn195n1o7uaqp87.htm&docsetVersion=9.4&locale=jaもう一度おねがいします。 – Jay

関連する問題