پرش به مطلب اصلی

دریافت قیمت منصفانه​

کانال قیمت منصفانه، قیمت منصفانه‌ی همه‌ی بازارها را به‌صورت دوره‌ای ارسال می‌کند. هر پیام یک snapshot کامل از قیمت‌ها در یک لحظه می‌باشد، نه فقط قیمت‌هایی که تغییر کرده‌اند.

قیمت منصفانه‌ی هر بازار میانگین بهترین قیمت خرید و فروش منصفانه است، یعنی (bid + ask) / 2. این عدد تا ۸ رقم اعشار گرد می‌شود و صفرهای انتهایی آن حذف می‌گردد، بنابراین 123456.7 دریافت می‌کنید و نه 123456.70000000. این همان عددی می‌باشد که GET /v1/all-fairPrice برمی‌گرداند و این دو هیچ‌وقت با هم اختلاف ندارند.

این کانال فقط روی ورژن ۲ (سنتریفیگو) در دسترس می‌باشد و روی ورژن ۱ (منسوخ شده) با آدرس wss://api.wallex.ir/ws وجود ندارد. جهت دریافت این کانال دو روش وجود دارد.

ورژن ۲ (سنتریفیگو) با SDK​

آدرس اتصال WebSocket​

برای اتصال باید از آدرس زیر استفاده کنید.

wss://api.wallex.ir/connection/websocket

نام کانال​

این کانال یک کانال عمومی و سراسری می‌باشد. برخلاف کانال‌های معاملات و عمق بازار، برای هر مارکت یک کانال جداگانه ندارد و یک پیام آن قیمت همه‌ی بازارها را دارد.

public:all@fairPrice

نمونه کد عضویت​

const fairPrices = client.newSubscription("public:all@fairPrice");
fairPrices.on("publication", (ctx) => console.log(ctx.data));
fairPrices.subscribe();

نمونه پاسخ دریافتی​

پس از عضویت، هر snapshot جدید در رویداد publication به شما تحویل داده می‌شود و بدنه‌ی آن در ctx.data قرار دارد.

فیلدنوعتوضیح
tsISO 8601 Stringزمان ساخته شدن این snapshot. در هر پیام دیرتر از پیام قبلی می‌باشد.
pricesObjectنماد بازار به قیمت. کلیدها نمادهایی مانند BTCTMN هستند و مقدار هر کلید String (decimal) می‌باشد.
{
"ts": "2026-09-07T13:10:07.689Z",
"prices": {
"BTCTMN": "123456.7",
"ETHTMN": "8901.2",
"USDTTMN": "89.5"
}
}

در نمونه‌ی بالا سه نماد آمده است، اما پیام واقعی چند صد نماد دارد و حجم آن بین ۴۶ تا ۵۰ کیلوبایت می‌باشد.

نکته‌ها​

  • توجه داشته باشید که عضو شدن در این کانال هیچ قیمتی برای شما ارسال نمی‌کند و اولین پیام در انتشار بعدی می‌رسد. این انتظار می‌تواند تا ۲۰ ثانیه طول بکشد.
  • هر ۲۰ ثانیه یک پیام ارسال می‌شود، چه قیمتی تغییر کرده باشد و چه نکرده باشد.
  • گاهی این فاصله تا حدود ۳۵ ثانیه هم می‌رسد. این حالت طبیعی می‌باشد و به معنی قطع شدن کانال نیست.
  • بنابراین پیشنهاد می‌شود هنگام بالا آمدن برنامه یک بار GET /v1/all-fairPrice را صدا بزنید و از آن به بعد قیمت‌ها را از این کانال بگیرید.
  • در صورتی که بیش از ۶۰ ثانیه پیامی دریافت نکردید، دوباره GET /v1/all-fairPrice را صدا بزنید. نرسیدن پیام به معنی ثابت ماندن قیمت‌ها نیست.
  • زمان آخرین پیامی را که پذیرفته‌اید نگه دارید و هر پیامی را که ts آن دیرتر نباشد نادیده بگیرید.
  • مقدار ts را قبل از مقایسه به زمان تبدیل کنید و آن را به‌صورت متن مقایسه نکنید. وقتی کسر ثانیه صفر باشد نوشته نمی‌شود، بنابراین هر دو شکل 2026-09-08T09:00:00Z و 2026-09-08T09:00:07.689Z را دریافت می‌کنید و در مقایسه‌ی متنی، زمان زودتر بزرگ‌تر به نظر می‌رسد. در JavaScript از Date.parse(msg.ts) و در Java از Instant.parse(msg.ts) استفاده کنید و سپس نتیجه را مقایسه کنید.
  • فیلد prices همیشه همه‌ی نمادها را ندارد. نمادی که در آن لحظه قیمت آن در دسترس نباشد در همان پیام نمی‌آید و ممکن است در پیام بعدی برگردد. بنابراین فهرست کلیدها را ثابت فرض نکنید و نبودن یک نماد را به معنی حذف شدن آن بازار نگیرید.
  • فیلد prices هیچ‌وقت خالی ارسال نمی‌شود.
  • این کانال تاریخچه نگه نمی‌دارد، بنابراین snapshot‌هایی که در زمان قطعی اتصال منتشر شده‌اند دوباره ارسال نمی‌شوند.
  • نام کانال باید دقیقاً all@fairPrice باشد و به بزرگی و کوچکی حروف حساس می‌باشد. اشتباه در بخش بعد از @، مانند all@fairprice یا all@fairPrices، با خطای 102: unknown channel رد می‌شود.
  • اما اشتباه در بخش قبل از @ هیچ خطایی نمی‌دهد. برای مثال alll@fairPrice با موفقیت subscribe می‌شود و پس از آن هیچ‌وقت هیچ پیامی دریافت نمی‌کنید. بنابراین در صورتی که تا ۶۰ ثانیه پیامی نرسید، قبل از هر چیز نام کانال را بررسی کنید.
  • پاسخ دادن به ping سرور توسط SDK انجام می‌شود. جزئیات در اتصال و عضویت آمده است.

ورژن ۲ (سنتریفیگو) بدون SDK​

آدرس اتصال WebSocket​

برای اتصال باید از آدرس زیر استفاده کنید.

wss://api.wallex.ir/connection/websocket

نام کانال​

public:all@fairPrice

فرمت پیام Subscribe​

جهت دریافت قیمت منصفانه‌ی همه‌ی بازارها باید دستور زیر را ارسال کنید.

{ "id": 4, "subscribe": { "channel": "public:all@fairPrice" } }

پاسخ موفق این دستور خالی می‌باشد.

{ "id": 4, "subscribe": {} }

نمونه پاسخ دریافتی​

پس از ارسال پیام در سوکت، جواب‌هایی که دریافت می‌کنید به‌صورت زیر می‌باشد و بدنه‌ی پیام داخل پوشش push قرار دارد.

فیلدنوعتوضیح
tsISO 8601 Stringزمان ساخته شدن این snapshot. در هر پیام دیرتر از پیام قبلی می‌باشد.
pricesObjectنماد بازار به قیمت. کلیدها نمادهایی مانند BTCTMN هستند و مقدار هر کلید String (decimal) می‌باشد.
{
"push": {
"channel": "public:all@fairPrice",
"pub": {
"data": {
"ts": "2026-09-07T13:10:07.689Z",
"prices": {
"BTCTMN": "123456.7",
"ETHTMN": "8901.2",
"USDTTMN": "89.5"
}
}
}
}
}

در نمونه‌ی بالا سه نماد آمده است، اما پیام واقعی چند صد نماد دارد و حجم آن بین ۴۶ تا ۵۰ کیلوبایت می‌باشد.

نکته‌ها​

  • توجه داشته باشید که عضو شدن در این کانال هیچ قیمتی برای شما ارسال نمی‌کند و اولین پیام در انتشار بعدی می‌رسد. این انتظار می‌تواند تا ۲۰ ثانیه طول بکشد.
  • هر ۲۰ ثانیه یک پیام ارسال می‌شود، چه قیمتی تغییر کرده باشد و چه نکرده باشد.
  • گاهی این فاصله تا حدود ۳۵ ثانیه هم می‌رسد. این حالت طبیعی می‌باشد و به معنی قطع شدن کانال نیست.
  • بنابراین پیشنهاد می‌شود هنگام بالا آمدن برنامه یک بار GET /v1/all-fairPrice را صدا بزنید و از آن به بعد قیمت‌ها را از این کانال بگیرید.
  • در صورتی که بیش از ۶۰ ثانیه پیامی دریافت نکردید، دوباره GET /v1/all-fairPrice را صدا بزنید. نرسیدن پیام به معنی ثابت ماندن قیمت‌ها نیست.
  • زمان آخرین پیامی را که پذیرفته‌اید نگه دارید و هر پیامی را که ts آن دیرتر نباشد نادیده بگیرید.
  • مقدار ts را قبل از مقایسه به زمان تبدیل کنید و آن را به‌صورت متن مقایسه نکنید. وقتی کسر ثانیه صفر باشد نوشته نمی‌شود، بنابراین هر دو شکل 2026-09-08T09:00:00Z و 2026-09-08T09:00:07.689Z را دریافت می‌کنید و در مقایسه‌ی متنی، زمان زودتر بزرگ‌تر به نظر می‌رسد. در JavaScript از Date.parse(msg.ts) و در Java از Instant.parse(msg.ts) استفاده کنید و سپس نتیجه را مقایسه کنید.
  • فیلد prices همیشه همه‌ی نمادها را ندارد. نمادی که در آن لحظه قیمت آن در دسترس نباشد در همان پیام نمی‌آید و ممکن است در پیام بعدی برگردد. بنابراین فهرست کلیدها را ثابت فرض نکنید و نبودن یک نماد را به معنی حذف شدن آن بازار نگیرید.
  • فیلد prices هیچ‌وقت خالی ارسال نمی‌شود.
  • این کانال تاریخچه نگه نمی‌دارد، بنابراین snapshot‌هایی که در زمان قطعی اتصال منتشر شده‌اند دوباره ارسال نمی‌شوند.
  • نام کانال باید دقیقاً all@fairPrice باشد و به بزرگی و کوچکی حروف حساس می‌باشد. اشتباه در بخش بعد از @، مانند all@fairprice یا all@fairPrices، با خطای 102: unknown channel رد می‌شود.
  • اما اشتباه در بخش قبل از @ هیچ خطایی نمی‌دهد. برای مثال alll@fairPrice با موفقیت subscribe می‌شود و پس از آن هیچ‌وقت هیچ پیامی دریافت نمی‌کنید. بنابراین در صورتی که تا ۶۰ ثانیه پیامی نرسید، قبل از هر چیز نام کانال را بررسی کنید.
  • پاسخ دادن به ping سرور بر عهده‌ی خود شما می‌باشد. جزئیات در اتصال بدون SDK آمده است.