目次

CONNEQTOR 投資家FIX接続仕様書(データフォーマット編)

1.0版

2023年6月 作成



1.本仕様書の表記について

①項目の内容における‘△’はキャラクターコードのスペースを示す。

②FIXタグの必須属性について、以下のように記述する。

③各種取引における値段の設定/出力方法
 値段の設定/出力はZZZZZZZ9.9999形式である。具体的には、以下のようになる。

CONNEQTORでのマッチング値段値段の出力方法
100円100.0000
100.5円100.5000

④フィールドに設定する数値に関しては特に規定がない場合は2.2データ型の定義に従って設定する。
  例)①Int型のフィールド定義に数値範囲を0~100と指定されている場合、0は|0|となり、100は|100|となる。
    ②char型のフィールド定義に△△1~100と指定されている場合、△△1は|△△1|となり、100は|100|となる。

⑤ダミー値の扱いについて
表中に“(ダミー値)”として記載されている指定値に関しては、指定項目個々のフォーマット/範囲のチェックを行なうが、項目間の関連性チェックは行なわない。

⑥各メッセージのStandard Headerの説明欄について
各メッセージのStandard Headerの説明欄には、当メッセージのTAG35:MsgTypeと当メッセージで使用する「2.4標準メッセージヘッダ」の”条件により必須”扱いのタグについて記述する。

⑦各取引における注文数量設定
1口単位で設定する。(例:1,000口のRFQを送信する場合、Tag38には1000を設定する。)

2.電文構成

2.1 メッセージの概要

FIXメッセージのフォーマットは、以下のように標準ヘッダ部に続くボディ部と、それに続く標準トレーラ部で構成される。

標準ヘッダ ボディ部 標準トレーラ

各メッセージは、タグ番号とデータ値の組み合わせによる形式(タグ番号=値)で表記されたフィールドの組み合わせで構成され、各フィールドはASCIIコードの区切り文字<SOH>(#001)で終了する。
 例えば、8=FIX.4.2<SOH>9=60<SOH>35=A<SOH>…(中略)<SOH>10=027<SOH> の様に、“8=FIX.4.2”で始められ、“10=nnn<SOH>”で終了する。

下記のタグについては、無効なタグとして読み捨てる。

 ●メッセージの完全性保証
 通信でやり取りされるメッセージの完全性は、BodyLength(Tag=9)によるレコード長の検査とCheckSum(Tag=10)によるチェックサムの検査で確認する。
 完全性が保証されないメッセージを検知した場合、無効メッセージとしてメッセージを破棄する。

2.2 データ型

データ型とは、タグ単位に指定する値の型である。使用するデータ型を以下に示す。

データ型定義
Int整数値(ASCII文字の“-”及び“0”から“9”)
“-”は、負符号を意味するものであり、値の先頭に位置する場合のみ有効。
例.フィールド21の723は、|21=723|となる。
  フィールド21の-723は、|21=-723|となる。
Float小数値(ASCII文字の“-”、“.”及び“0”から“9”)
小数点“.”を含まないものは、整数値をfloat型で表現したものとする。最大文字数は、15文字である。
Qty数量を表すFloat型値。
Price値段を表すFloat型値。
Char英数字(区切り文字<SOH>以外の全てのASCIIコードが使用可能、大文字小文字の区別あり<text≠Text>)
Boolean論理値を表すChar型値。
'Y' = True/Yes
'N' = False/No
String英数字フリーフォーマット文字列(0x20~0x7Eの範囲のASCIIコードが使用可能、大文字小文字の区別あり<morstatt≠Morstatt>)
UTCTimestampYYYYMMDD-HH:MM:SS(秒単位)またはYYYYMMDD-HH:MM:SS.sss(ミリ秒単位) フォーマットで表現したUTC (Universal Time Coordinated, also known as “GMT”)値。コロン、ハイフン、ピリオドが必要。

有効値範囲:
・YYYY = 0000-9999, MM = 01-12, DD = 01-31, HH = 00-23, MM = 00-59,
 SS = 00-60 (60 only if UTC leap second) (without milliseconds).
・YYYY = 0000-9999, MM = 01-12, DD = 01-31, HH = 00-23, MM = 00-59,
 SS = 00-60 (60 only if UTC leap second), sss=000-999 (indicating milliseconds)

2.3 メッセージチェック

メッセージデータが完全である(FIXメッセージとして認めることができる)メッセージに対して、FIXプロトコル仕様(Ver4.2Errata)の規定に基づき、メッセージの形式チェックを行う。
チェック項目は以下の通りである。

これらの規定に従っていないメッセージを受信した場合、相手システムにRejectを送信して、メッセージにフォーマットエラーがあったことを通知する。

2.4 標準メッセージヘッダ/トレーラ

別紙1 標準メッセージヘッダ/トレーラフォーマット に記載する。

3.管理メッセージ

別紙2 管理メッセージフォーマット に記載する。

4.アプリケーションメッセージ

別紙3 アプリケーションメッセージフォーマット に記載する。

別紙1 標準メッセージヘッダ/トレーラフォーマット

(1) 標準メッセージヘッダ

タグフィールド名データ型必須 説明 備考
8BeginStringString使用するFIXプロトコルのVersionを設定する。必ず先頭に位置する。
「FIX.4.2」固定。
9BodyLengthLengthMsgTypeからCheckSumの直前(<SOH>)までのメッセージ長を設定する。
必ずBeginStringの次に位置する。
「0」~「9999」
35MsgTypeStringメッセージ毎のタイプを設定する。必ずBodyLengthの次に位置する。設定値については、各電文のページを参照。
49SenderCompIDString自企業IDを設定する。
上り電文(投資家システム→CONNEQTOR):各投資家システム固定の値を設定する。
下り電文(CONNEQTOR→投資家システム):
CONNEQTORの固定値「TSECQT」を設定する。
56TargetCompIDString接続する相手企業IDを設定する。
上り電文(投資家システム→CONNEQTOR):
CONNEQTORの固定値「TSECQT」を設定する。
下り電文(CONNEQTOR→投資家システム):各投資家システム固定の値を設定する。
34MsgSeqNumSeqnumシーケンス番号を設定する。
「1」~「99999999」
115OnBehalfOfCompIDString上り電文:CONNEQTORが指定する投資家の組織IDを設定する。
下り電文:省略
国内金融機関の場合は金融機関コードとし、それ以外の場合は別途採番する。
128DeliverToCompIDString上り電文:省略
下り電文:CONNEQTORが指定する投資家の組織IDを設定する。
国内金融機関の場合は金融機関コードとし、それ以外の場合は別途採番する。
43PossDupFlagBoolean再送メッセージを識別する識別子を設定する。
「Y」:Possible duplicate、
「N」:Original transmission
下り電文の場合、再送時のみ「Y」を設定。
97PossResendBooleanアプリレベルで再送するメッセージの識別子を設定する。
「Y」:Possible Resend Message
「N」:Original transmission
上り電文においては「Y」または「N」を設定する。下り電文の場合は省略。上り電文で当タグの設定値が「Y」の場合、CONNEQTORでは、当該電文が処理済であれば破棄、未処理であれば処理を行なう。
52SendingTime UTC
Time
stamp
メッセージ送信時間を設定する。GMT表示。
122OrigSendingTimeUTC
Time
stamp
再送メッセージ(PossDupFlag=Y)に設定する。GMT表示。
347MessageEncodingString「Shift_JIS」固定。 CONNEQTORでは入力値のチェックを行わない。
下り電文の場合、設定なし。

(2) 標準メッセージトレーラ

タグフィールド名データ型必須 説明 備考
10CheckSumStringメッセージの先頭からチェックサムの直前までの各バイトを合計し、モジュロ256で設定する。設定値は10進数3桁。「000」~「255」。
必ず最後に位置する。



別紙2 管理メッセージフォーマット

(1) Logon

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「A」
98EncryptMethodInt暗号化通信の手順を設定する。
0固定
108HeartBtIntIntハートビート監視使用時に設定する。
0の設定は不可。
141ResetSeqNumFlagBooleanシーケンス番号リセット時に設定する。
「Y」固定
383MaxMessageSize Length1メッセージの最大長を設定する。
「10023」固定
CONNEQTORでは入力値のチェックを行わない。
下り電文の場合、設定なし。
Standard Trailer

(2) Logout

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「5」
58Text StringLogoutの理由を先頭5バイトに設定する。
上り電文:
「00000」、または指定無し:
 本日の取引を終了したことを意味する。(取引終了)
上記以外:
 障害等により取引の中断を意味し、障害復旧時、取引再開可能とする。(取引中断)

下り電文:
解放要因となった理由コード(5バイト)
上り電文:
(取引終了)が設定された場合、当日の取引は終了 したとみなす。ただし、再度Logonすることにより取引可能となる。(FIXシーケンス番号はリセットされない為、再度Logonを行う場合、継続して使用する)

(取引中断)が設定された場合、参加者システムで何らかの異常が発生したとみなし、再度Logonすることにより取引可能となる。(FIXシーケンス番号はリセットされない為、再度Logonを行う場合、継続して使用する)

下り電文:
 設定値については、「付録1 理由コード一覧」参照。
Standard Trailer

(3) HeartBeat

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「0」
112TestReqID StringTestRequestの応答の場合は、受信したTestRequestのTestReqIDを設定する。
Standard Trailer

(4) Test Request

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「1」
112TestReqID String下り電文:
メッセージ送信時間を設定する。
 YYYYMMDD-hh:mm:ss形式
(コロン“:”とハイフン“-”は必須)
有効値:YYYY=0000~9999、MM=01~12、DD=01~31、hh=00~23、mm=00~59、ss=00~59
Standard Trailer

(5) Resend Request

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「2」
7BeginSeqNo SeqNum再送要求範囲の先頭を設定する。
16EndSeqNo SeqNum再送要求範囲の最後を設定する。
下り電文:
 常に”0”(送信済メッセージの最後まで)を設定する。
上り電文の場合は、必ずしも“0”である必要は無い。
Standard Trailer

(6) Reject

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「3」
45RefSeqNum SeqNumReject対象となったメッセージのMsgSeqNumを設定する。
371RefTagIDIntReject対象となったメッセージのTag番号を設定する。
372RefMsgType StringReject対象となったメッセージのMsgTypeを設定する。
373SessionRejectReasonIntReject理由を設定する。
下り電文では以下のいずれかのコードを設定する。
0:Invalid tag number(タグ番号不正)
1:Required tag missing(必須タグ無し)
2:Tag not defined for this message type(MsgTypeに関する未定義タグ)
3:Undefined Tag(未定義タグ)
4:Tag specified without a value(タグに値未設定)
5:Value is incorrect (out of range) for this tag(タグ設定値不正)
6:Incorrect data format for value(タグ設定値フォーマット不正)
9:CompID problem(企業ID不正)
10:SendingTime accuracy problem(SendingTime不正)
11:Invalid MsgType(メッセージタイプ不正)
12:SubID problem(口座ID不正)
58Text String理由コード(5バイト)及びエラー詳細情報(エラー要因となったタグ番号)を半角カンマ繋ぎで設定。ただし、理由コードのみの場合もある。
エラー詳細情報有りの場合:「理由コード」,「エラー詳細情報」
エラー詳細情報無しの場合:「理由コード」
「付録1 理由コード一覧」参照。
Standard Trailer

(7) Sequence Reset

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「4」
123GapFillFlag Boolean「Y」:GapFillメッセージであることを示す。
下り電文:
 注意)要求されたメッセージを再送できない場合、「N」を設定する。
36NewSeqNo SeqNum次に送信するメッセージのシーケンス番号を設定する。
Standard Trailer



別紙3 アプリケーションメッセージフォーマット

※必須欄の凡例は以下のとおりです。

(1) RFQ送信(New Order Single)

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「D」
SenderCompID= 「投資家システムの識別子」
TargetCompID=「TSECQT」(固定値)
OnBehalfOfCompID=「CONNEQTORで扱う投資家の組織ID」
11ClOrdIDString注文番号を指定する。
注文番号:投資家システムが各自の注文に割り振るFIXセション単位に一意な番号を採番
76ExecBrokerString執行ブローカーを指定する(取引参加者コード5桁を指定)。
1AccountString投資家システムで管理する顧客の口座情報を設定
21HandlInstchar「3」:Manual order, best execution 固定
63SettlmntTypchar決済日(from)を設定する。
タグを省略した場合は、T+2(3日目決済)として扱う。
「4:T+3決済」、「5:T+4決済」、「9:T+5決済」
55SymbolString銘柄コードを指定する。4桁。
54Sidechar注文の売買区分を指定する。
「1」:Buy(買注文)
「2」:Sell(売注文)
60TransactTimeUTCRFQ送信時刻を指定する。CONNEQTORではチェックしない。
38OrderQtyQty注文数量を指定する。金額指定の場合は0を設定する。
0~999999999
40OrdTypechar注文の執行種類を指定する。
「1」: Market(成行)固定。
58TextString投資家システムが任意に利用。
8102User IDStringCONNEQTORで扱うUser IDを設定する。
8103決済日(To)char決済日(To)を指定する場合に設定する。
タグを省略した場合は、63タグに設定した決済日の単日指定となる。
「4:T+3決済」、「5:T+4決済」、「9:T+5決済」
8106メモString投資家システムが任意に利用。
Standard Trailer

(2) RFQ受付通知(Execution Report)

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「8」
SenderCompID=「TSECQT」(固定値)
TargetCompID=「投資家システムの識別子」
DeliverToCompID=「CONNEQTORで扱う組織ID」
37OrderIDString「-」固定
11ClOrdIDStringNew Order Singleで投資家システムが採番した値を設定する。
17ExecIDString各投資家システムとのFIXセッションの中で一意となる値を設定する。
20ExecTransTypechar「0」:New 固定
150ExecTypechar「0」:New または「8」:Rejected を設定する。
39OrdStatuschar「0」:New または「8」:Rejected を設定する。
1AccountStringNew Order Singleで設定した値を設定する。
63SettlmntTypcharRFQ送信時に指定した決済日(from)を設定する。
55SymbolStringRFQ送信時に指定した銘柄コードを設定する。
54SidecharRFQ送信時に指定した売買区分を設定する。
38OrderQtyQtyRFQ送信時に指定した注文数量を設定する。金額指定の場合は0を設定する。
32LastSharesQty約定数量を設定する。0固定。
31LastPxQty約定価格を設定する。0固定。
151LeavesQtyQty注文残数量を設定する。
新規の場合は注文数量を設定。拒否の場合は0を設定。
※金額指定の場合は常に0を設定。
14CumQtyQty内出来数量(現在までの総成立数量)を設定する。0固定。
6AvgPxPrice約定平均価格を設定する。0固定。
58TextStringRFQ正常受付の場合は「00000」を設定し、RFQ受付拒否の場合はそれ以外の理由コード及びエラー内容を設定する。「付録1 理由コード一覧」参照。エラー内容は「code:●●,comment:●●」で返却。
8100RFQIDintRFQ IDを設定する。CONNEQTORが採番。RFQ受付拒否の場合は省略。
8102User IDStringNew Order Singleで設定した値を設定する。
8103決済日(To)charNew Order Singleで設定した値を設定する。
Standard Trailer

(3)RFQキャンセル通知(Execution Report)

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「8」
SenderCompID=「TSECQT」(固定値)
TargetCompID=「投資家システムの識別子」
DeliverToCompID=「CONNEQTORで扱う組織ID」
37OrderIDString「-」固定
11ClOrdIDStringNew Order Singleで投資家システムが採番した値を設定する。
17ExecIDString各投資家システムとのFIXセッションの中で一意となる値を設定する。
20ExecTransTypechar「0」:New 固定
150ExecTypechar「C」:Expired 固定。
39OrdStatuschar「C」:Expired 固定。
1AccountStringNew Order Singleで設定した値を設定する。
63SettlmntTypcharRFQ送信時に指定した決済日(from)を設定する。
55SymbolStringRFQ送信時に指定した銘柄コードを設定する。
54SidecharRFQ送信時に指定した売買区分を設定する。
38OrderQtyQtyRFQ送信時に指定した注文数量を設定する。金額指定の場合は0を設定する。
32LastSharesQty約定数量を設定する。0固定。
31LastPxQty約定価格を設定する。0固定。
151LeavesQtyQty注文残数量を設定する。0固定。
14CumQtyQty内出来数量(現在までの総成立数量)を設定する。0固定。
6AvgPxPrice約定平均価格を設定する。0固定。
58TextStringRFQキャンセルの理由及びエラー内容を設定を設定する。「付録1 理由コード一覧」参照。エラー内容は「code:●●,comment:●●」で返却。
8100RFQIDintRFQ IDを設定する。CONNEQTORが採番。
8102User IDStringNew Order Singleで設定した値を設定する。
8103決済日(To)charNew Order Singleで設定した値を設定する。
Standard Trailer

(4)約定通知(Execution Report)

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「8」
SenderCompID=「TSECQT」(固定値)
TargetCompID=「投資家システムの識別子」
DeliverToCompID=「CONNEQTORで扱う組織ID」
37OrderIDString注文に関して一意となる識別子(ブローカー側で採番)を設定する。
11ClOrdIDStringNew Order Singleで投資家システムが採番した値を設定する。
17ExecIDString各投資家システムとのFIXセッションの中で一意となる値を設定する。
20ExecTransTypechar「0」:New 固定
150ExecTypechar「2」:Filled(調達済(全出来))固定。
39OrdStatuschar「2」:Filled(調達済(全出来))固定。
1AccountStringNew Order Singleで設定した値を設定する。
63SettlmntTypchar決済期日を設定する。
55SymbolStringRFQ送信時に指定した銘柄コードを設定する。
54SidecharRFQ送信時に指定した売買区分を設定する。
38OrderQtyQtyRFQ送信時に指定した注文数量を設定する。金額指定の場合は0を設定する。
47Rule80Achar売買管理用項目(委託・自己の区分)を設定する。
32LastSharesQty約定数量を設定する。
31LastPxQty約定価格を設定する。
151LeavesQtyQty注文残数量を設定する。0固定。
14CumQtyQty内出来数量(現在までの総成立数量)を設定する。
6AvgPxPrice約定平均価格を設定する。0固定。
58TextStringCONNEQTORからブローカーに発注電文を送信した時刻を設定する
orderDate:YYYY-MM-DD hh:mm:ss
8026約定時刻StringToSTNeTでの約定時刻を設定する。
「HHMMSSTT0」形式とし、下1 桁は「0」固定とする。
8045現金・信用取引区分char現金・信用取引区分を設定する。
8100RFQIDintRFQ IDを設定する。CONNEQTORが採番。
8102User IDStringNew Order Singleで設定した値を設定する。
Standard Trailer

(5)Done for day送信(Execution Report)

タグフィールド名データ型必須 説明 備考
Standard Header MsgType=「8」
SenderCompID=「TSECQT」(固定値)
TargetCompID=「投資家システムの識別子」
DeliverToCompID=「CONNEQTORで扱う組織ID」
37OrderIDString注文に関して一意となる識別子(ブローカー側で採番)を設定する。
11ClOrdIDStringNew Order Singleで投資家システムが採番した値を設定する。
17ExecIDString各投資家システムとのFIXセッションの中で一意となる値を設定する。
20ExecTransTypechar「0」:New 固定
150ExecTypechar「3」:Done for day固定。
39OrdStatuschar「3」:Done for day固定。
1AccountStringNew Order Singleで設定した値を設定する。
63SettlmntTypchar決済期日を設定する。
55SymbolStringRFQ送信時に指定した銘柄コードを設定する。
54SidecharRFQ送信時に指定した売買区分を設定する。
38OrderQtyQtyRFQ送信時に指定した注文数量を設定する。金額指定の場合は0を設定する。
47Rule80Achar売買管理用項目(委託・自己の区分)を設定する。
32LastSharesQty約定数量を設定する。
31LastPxQty約定価格を設定する。
151LeavesQtyQty注文残数量を設定する。0固定。
14CumQtyQty内出来数量(現在までの総成立数量)を設定する。
6AvgPxPrice約定平均価格を設定する。0固定。
58TextStringCONNEQTORからブローカーに発注電文を送信した時刻を設定する
orderDate:YYYY-MM-DD hh:mm:ss
8026約定時刻StringToSTNeTでの約定時刻を設定する。
「HHMMSSTT0」形式とし、下1 桁は「0」固定とする。
8045現金・信用取引区分char現金・信用取引区分を設定する。
8100RFQIDintRFQ IDを設定する。CONNEQTORが採番。
8102User IDStringNew Order Singleで設定した値を設定する。
Standard Trailer


付録1 理由コード一覧

理由コード 内容 備考
00000 正常
00001 タグの型異常
00002 必須タグ無し
00003 余剰タグの存在
00004 繰り返し可能でないフィールドが重複
00005 相手システムからの切断要求に対する応答
00006 プロトコル異常(MsgSeqNumの異常)
00007 プロトコル異常(Logon Messageの異常)
00008 プロトコル異常(管理メッセージに対するReject受信)
00009 連続Reject送信による強制切断
00010 重大プロトコル異常
00011 CONNEQTORシステム異常
20001 銘柄コード
20002 売/買
20101 執行ブローカー不正 投資家に紐づかないブローカーを指定している場合
20102 決済日不正 決済日指定がT+2~T+5の間以外を指定している場合
20103 注文数量/金額不正 注文数量/金額のどちらか一方のみの指定以外の場合
20104 User ID不正 CONEQTORで扱うUser ID以外を指定している場合
20105 売買単位不正
30001 RFQ送信可能時間外
30002 売買停止中
30003 1注文最大金額超過 投資家がCONNEQTOR画面から設定する1注文最大金額を超過している場合
30004 証券会社FIX未接続 指定したブローカーがFIX未接続の場合
30005 証券会社決済日非対応 指定したブローカーが対応していない決済日を指定している場合
30006 証券会社発注銘柄制限 指定したブローカーが対応していない銘柄を指定している場合
30007 証券会社発注時間制限 指定したブローカーが対応していない時間にRFQを送信した場合
30008 決済日跨ぎ 指定した決済日(範囲)が決算日を跨ぐRFQを送信した場合
30009 250億円超え 口数×iNAV値が250億円を超過するRFQを送信した場合
40001 RFQ取消
40002 RFQタイムアウト
40003 全マーケットメイカーQuote提示拒否
40004 マーケットメイカー承認拒否
40005 マーケットメイカー承認タイムアウト
40006 投資家側証券会社拒否
40007 マーケットメイカー側証券会社拒否
40008 証券会社承認タイムアウト




留意事項

使用許諾条件

本接続仕様書のご利用に当たっては、必ず以下の項目をお読みいただき、以下の使用許諾条件に同意いただくことを条件とします。

(著作権等)
本接続仕様書の各種情報等(以下「技術情報等」という。)に関する著作権等の一切の権利は、東証に帰属します。

(禁止事項)
有償、無償を問わず第三者に対して、使用許諾、譲渡、転売、貸与又は媒体の如何にかかわらず本接続仕様書及び技術情報等の外部への提供若しくは印刷物の出版を禁じます。

(免責)
東証は、本接続仕様書の誤謬、省略若しくは欠落等に起因する損害等、直接又は間接を問わず技術情報等を利用したこと、又は利用できなかったことにより利用者及び利用者の顧客等に生じた一切の損害について、損害賠償責任を負わないものとします。
東証は、東証の故意又は重過失による場合を除き、本サービスの利用に起因しその他本書に関連して利用者及び利用者の顧客等に生じた損害につき、一切の法的責任を負いません。
東証は、東証の予見の有無を問わず特別の事情から利用者及び利用者の顧客等に生じた損害、及び利用者及び利用者の顧客等に生じた逸失利益については、賠償責任を負いません。
利用者等の損害賠償請求権は、損害発生の日から12ヶ月以内に行使しなければ消滅するものとします。

(違反)
利用者が使用許諾条件のいずれかの項目に違反した場合、利用者は東証の指示に異議なく従うものとします。

(その他)
東証は、本接続仕様書に記載した内容について、明示又は黙示の如何を問わずその無誤謬性を一切保証しません。

発行者

発行:株式会社 東京証券取引所
   東京都中央区日本橋兜町2番1号 〒103-8220
   MAIL:ask-conneqtor@jpx.co.jp