🚀 بهترین برنامه نویس و طراح ربات معامله گر فارکس و سفارش ربات و اکسپرت معامله گر متاتریدر به زبان MQL4 و MQL5 | متااکسپرت

طراحی ربات متناسب با شرایط بروکر

طراحی الگوریتم معاملاتی

طراحی ربات متناسب با شرایط بروکر

استقرار یک ربات معاملاتی (Trading Bot) یا اکسپرت (Expert Advisor) در محیط زنده بازار، فراتر از صرفاً پیاده‌سازی یک الگوریتم منطقی است؛ این فرآیند یکپارچه‌سازی عمیق بین کد نوشته شده و زیرساخت‌های فنی ارائه‌شده توسط کارگزار یا همان بروکر (Broker) محسوب می‌شود. غفلت از این تطابق ضروری، متداول‌ترین و پرهزینه‌ترین اشتباهی است که معامله‌گران الگوریتمی مرتکب می‌شوند. یک استراتژی که در محیط شبیه‌سازی‌شده بر روی داده‌های تاریخی یک بروکر خاص (حتی با تنظیمات مشابه) عملکردی بی‌نقص داشته است، ممکن است در مواجهه با محیط عملیاتی بروکر دیگر یا حتی تغییر شرایط همان بروکر، به سرعت کارایی خود را از دست بدهد و متحمل زیان‌های غیرمنتظره شود. این تفاوت‌ها صرفاً در نرخ کمیسیون (Commission) خلاصه نمی‌شوند، بلکه ریشه در معماری فنی زیربنایی، نوع حساب معاملاتی (Account Type)، و سیاست‌های اجرای سفارش (Order Execution) هر کارگزار دارند. بنابراین، محوریت اصلی در توسعه موفق الگوریتم‌های معاملاتی، درک عمیق و مدل‌سازی دقیق این متغیرهای محیطی است که مستقیماً بر رفتار ربات معاملاتی (Trading Bot) تأثیر می‌گذارند.

معماری اجرای سفارش و تأثیر آن بر منطق معاملاتی

یکی از مهم‌ترین تمایزات میان کارگزاری‌ها، در نحوه مدیریت و اجرای دستورات مشتریان نهفته است. این تفاوت‌ها مستقیماً بر سرعت و دقت سیگنال‌های خرید و فروش که ربات معاملاتی (Trading Bot) تولید می‌کند، اثر می‌گذارد. حساب‌های مبتنی بر مدل Market Maker که معمولاً در حساب‌های استاندارد رایج هستند، تعهد می‌کنند که خودشان طرف مقابل سفارشات را بپذیرند، که این امر می‌تواند منجر به اسلیپیج (Slippage) قابل توجهی در شرایط نوسان بالا شود، زیرا بروکر ممکن است قیمت را به نفع خود تنظیم کند، حتی اگر این تنظیمات به شکل رسمی اعلام نشده باشند. در مقابل، حساب‌های ECN (Electronic Communication Network) یا STP (Straight Through Processing) سفارشات را به بازار بین بانکی یا تأمین‌کنندگان نقدینگی (Liquidity Providers) هدایت می‌کنند. این تفاوت بنیادین در اجرای سفارش (Order Execution) مستلزم رویکردهای متفاوتی در طراحی ربات معاملاتی (Trading Bot) است. برای مثال، استراتژی‌هایی که بر اساس ورود سریع با حد ضرر (Stop Loss) بسیار نزدیک طراحی شده‌اند (مانند برخی روش‌های اسکالپینگ)، در محیط Market Maker ممکن است به دلیل عدم اطمینان در نقطه ورود و خروج واقعی، ناکام بمانند، در حالی که در محیط ECN انتظار اجرای دقیق‌تری می‌رود، البته با پرداخت اسپرد (Spread) کمتر و کمیسیون (Commission) بالاتر.

الگوریتم‌های باید به‌طور هوشمندانه تفاوت بین اجرای بازار (Market Execution) و اجرای فوری (Instant Execution) را درک کنند. در محیط‌هایی که اجرای فوری حکمفرماست، ربات باید برای مواجهه با شرایطی که قیمت مورد نظر در دسترس نیست، مکانیزمی تعریف کند. نادیده گرفتن این مورد می‌تواند منجر به صدور سفارش‌هایی شود که بلافاصله توسط سرور بروکر رد می‌شوند، که این امر باعث از دست رفتن فرصت‌های ورود یا خروج در زمان‌بندی حیاتی می‌شود. یک ربات معاملاتی (Trading Bot) حرفه‌ای باید مجهز به منطقی باشد که بتواند با کدهای خطا (Error Codes) دریافتی از سرور بروکر (Broker Server) تعامل کند و در صورت مشاهده خطاهایی نظیر “Requote” یا “Execution Rejected”، تصمیمات ثانویه‌ای (مانند ارسال مجدد سفارش با قیمت اندکی متفاوت یا صرف‌نظر کردن از معامله) اتخاذ نماید.

اهمیت پارامترهای هزینه: اسپرد، کمیسیون و اندازه لات

تفاوت‌های ساختاری در نحوه درآمدزایی بروکرها، مستقیماً بر پارامترهای هزینه تأثیر می‌گذارد و این پارامترها باید به شریان اصلی هر ربات معاملاتی (Trading Bot) تبدیل شوند. اسپرد (Spread)، که تفاوت بین قیمت خرید و فروش است، می‌تواند ثابت (Fixed) یا شناور (Variable) باشد. در حساب‌های استاندارد برخی کارگزاران، اسپرد (Spread) ثابت اعمال می‌شود که در شرایط عادی بازار بسیار جذاب به نظر می‌رسد. اما این نوع اسپرد (Spread) معمولاً در زمان انتشار اخبار مهم اقتصادی یا نوسانات شدید، به شدت افزایش می‌یابد (Spread Widening)؛ وضعیتی که یک ربات اسکالپ (Scalping Bot) که بر اساس اسپرد (Spread) ثابت کوچک طراحی شده است، را در معرض ریسک‌های بزرگ قرار می‌دهد. ربات باید قابلیت پایش بلادرنگ میزان فعلی اسپرد (Spread) را داشته باشد و در صورت عبور آن از یک آستانه تعریف‌شده، فعالیت خود را موقتاً متوقف سازد.

از سوی دیگر، حساب‌های ECN معمولاً اسپرد (Spread) بسیار نزدیکی به صفر یا بسیار ناچیز دارند، اما در عوض، کمیسیون (Commission) قابل توجهی بر هر لات (Lot) معامله اعمال می‌کنند. یک ربات معاملاتی (Trading Bot) که استراتژی آن شامل حجم بالای معاملات با حجم کم (مانند اسکالپینگ فرکانس بالا) است، باید محاسبه کند که در نهایت، آیا هزینه کمیسیون (Commission) برتری دارد یا سود حاصل از اسپرد (Spread) پایین‌تر. فرمول کلی مدیریت ریسک (Risk Management) و سودآوری باید بر اساس هزینه‌های واقعی محاسبه شود:

[
\text{سود خالص هر معامله} = \text{سود ناخالص} – (\text{کمیسیون} + \text{اسپرد متحمل‌شده} + \text{اسلیپیج}) ]

اگر یک ربات معاملاتی (Trading Bot) برای یک حساب ECN طراحی شده باشد که بر اساس دریافت کمیسیون (Commission) کار می‌کند، اما به اشتباه روی یک حساب Standard که صرفاً از طریق اسپرد (Spread) درآمد کسب می‌کند، اجرا شود، محاسبات حجم موقعیت و حداقل سودآوری آن کاملاً مختل خواهد شد. ربات باید به‌طور پویا بتواند این ساختارهای هزینه‌ای را شناسایی کرده و پارامترهایی نظیر حداقل سود مورد نیاز برای ورود به معامله را بر اساس نرخ‌های جاری کمیسیون (Commission) تنظیم نماید.

تأثیر لوریج و مارجین بر استحکام الگوریتم

لوریج (Leverage) یا اهرم مالی که توسط بروکر ارائه می‌شود، به طور مستقیم بر مارجین (Margin) مورد نیاز برای باز کردن موقعیت‌ها تأثیر می‌گذارد و این موضوع، محدودیت‌های اساسی را بر مکانیزم‌های مدیریت ریسک (Risk Management) اعمال می‌کند. در حالی که برخی کارگزاران لوریج (Leverage) بسیار بالایی (مثلاً ۱:۵۰۰ یا ۱:۱۰۰۰) ارائه می‌دهند، این اهرم بالا به این معنی است که ربات معاملاتی (Trading Bot) فضای کمتری برای اشتباه و نوسانات طبیعی بازار خواهد داشت قبل از اینکه با خطر مارجین کال (Margin Call) مواجه شود. در مقابل، کارگزارانی که لوریج (Leverage) محافظه‌کارانه‌تری اعمال می‌کنند (مانند ۱:۳۰)، به طور ذاتی سطح ایمنی بیشتری برای الگوریتم‌های تهاجمی فراهم می‌آورند.

برنامه‌نویس باید اطمینان حاصل کند که ربات معاملاتی (Trading Bot) توانایی خواندن و احترام گذاشتن به میزان مارجین (Margin) آزاد موجود در حساب معاملاتی را دارد. استراتژی‌هایی که از روش‌هایی مانند مارتینگل (Martingale) یا افزایش پله‌ای حجم موقعیت‌ها استفاده می‌کنند، به شدت به لوریج (Leverage) بالا و در نتیجه به مارجین (Margin) در دسترس وابسته هستند. اجرای چنین ربات‌هایی در یک بروکر با لوریج (Leverage) محدود، می‌تواند منجر به شکست سریع شود، زیرا سیستم زودتر از موعد مقرر به سطح هشدار مارجین کال (Margin Call) می‌رسد. علاوه بر این، برخی بروکرها ممکن است در صورت نوسانات شدید بازار، به طور خودکار لوریج (Leverage) مؤثر را کاهش دهند تا ریسک خود را مدیریت کنند؛ قابلیتی که یک ربات معاملاتی (Trading Bot) باید بتواند آن را شناسایی کرده و حجم معاملات خود را متناسب با آن تنظیم کند تا از اجرای ناموفق سفارشات جلوگیری نماید.

تفاوت داده‌های قیمتی و اهمیت سرور بروکر

یکی از بزرگ‌ترین چالش‌های فنی در طراحی ربات متناسب با شرایط بروکر، تفاوت در دیتای قیمتی (Price Data) است. دو بروکر مختلف ممکن است بر اساس تأمین‌کنندگان نقدینگی متفاوت، حتی برای نماد یکسان (مثلاً EURUSD)، قیمت‌های متفاوتی را در هر میلی‌ثانیه نمایش دهند. این تفاوت‌ها معمولاً در زمان‌هایی که نقدینگی کم است (مانند ساعات پایانی شب یا روزهای تعطیل) یا زمانی که رویدادهای خبری بزرگی منتشر می‌شود، مشهودتر است. بک‌تست (Backtest) گرفتن یک استراتژی بر روی داده‌های تاریخچه‌ای یک بروکر (مثلاً بروکر A) و سپس اجرای آن بر روی سرور بروکر (Broker Server) دیگر (بروکر B) که ممکن است دارای اسپایک‌های قیمتی (Price Spikes) متفاوت یا داده‌های کم‌عمق‌تر باشد، یک ریسک بزرگ محسوب می‌شود.

برای مثال، اگر ربات معاملاتی (Trading Bot) شما بر اساس یک نوسان کوچک قیمت در دیتای بروکر A سیگنال خرید صادر کند، ممکن است در دیتای بروکر B اصلاً چنین نوسانی رخ نداده باشد و سیگنال به‌طور کاذب تولید شود. یا بدتر از آن، اگر استراتژی به دنبال شناسایی سشن‌های نقدینگی بالا باشد، و سرور بروکر (Broker Server) مورد استفاده، دیتای مربوط به سشن‌های پرنوسان مانند سشن نیویورک را به خوبی پوشش ندهد، الگوریتم از مزیت زمانی و نقدینگی اصلی بازار محروم خواهد ماند.

علاوه بر کیفیت داده، موقعیت مکانی (Server Location) سرور بروکر (Broker Server) نیز حیاتی است. تأخیر (Latency) در ارتباط بین ربات معاملاتی (Trading Bot) و سرور بروکر (Broker Server) باید به حداقل برسد. برای استراتژی‌های با فرکانس بالا، تأخیر چند صد میلی‌ثانیه‌ای می‌تواند به معنای از دست دادن فرصت ورود به قیمت مورد نظر باشد. اگر ربات معاملاتی (Trading Bot) روی یک سرور محلی (Local Machine) در اروپا اجرا شود، اما سرور بروکر (Broker Server) در آسیا واقع شده باشد، همیشه یک تأخیر ذاتی وجود خواهد داشت که باید در محاسبات اسلیپیج (Slippage) و زمان‌بندی ورود لحاظ گردد. این موضوع، اهمیت استفاده از سرور خصوصی مجازی (VPS) که از نظر جغرافیایی به سرور بروکر (Broker Server) نزدیک است را برجسته می‌سازد، و این نزدیکی باید در فرآیند بک‌تست (Backtest) و فوروارد تست (Forward Test) مدل‌سازی شود.

محدودیت‌های بروکر و ممنوعیت‌های استراتژیک

بسیاری از معامله‌گران، به خصوص کسانی که به دنبال استفاده از روش‌های پیشرفته مانند هج (Hedge)، مارتینگل (Martingale)، یا آربیتراژ (Arbitrage) هستند، باید به دقت مقررات و محدودیت‌های اعمال‌شده توسط بروکر (Broker) خود را بررسی کنند. اکثر کارگزاران، به خصوص آن‌هایی که تحت نظارت شدیدتری هستند، صراحتاً یا تلویحاً برخی از این استراتژی‌ها را ممنوع می‌کنند. برای مثال، استراتژی‌های هج (Hedge) (باز کردن همزمان سفارش خرید و فروش برای یک نماد) در برخی حساب‌ها یا توسط برخی کارگزاران به دلیل پیچیدگی‌های مارجین (Margin) و همچنین نگرانی از سوءاستفاده، مجاز نیستند یا مدیریت بسیار متفاوتی دارند.

اگر یک ربات معاملاتی (Trading Bot) طوری طراحی شود که در یک حساب استاندارد، سفارش‌های هج (Hedge) ارسال کند، ممکن است با خطای “Hedging not allowed” مواجه شود. این امر نیازمند آن است که ربات معاملاتی (Trading Bot) قابلیت تشخیص نوع حساب معاملاتی (Account Type) را داشته باشد. اگر حساب از نوع Netting باشد (که اجازه هج (Hedge) نمی‌دهد)، ربات باید استراتژی جایگزینی مانند بستن سریع موقعیت قبلی قبل از ورود به موقعیت جدید را اتخاذ کند.

همچنین، روش‌های مارتینگل (Martingale) که به طور نمایی حجم را افزایش می‌دهند، به شدت بر محافظه‌کاری بروکر (Broker) در خصوص ریسک‌پذیری وابسته هستند. یک بروکر محافظه‌کار ممکن است با مشاهده افزایش غیرمنطقی حجم معاملات در بازه زمانی کوتاه، حساب را به دلیل اجرای الگوریتم‌های مشکوک مسدود سازد، حتی اگر تمام سفارشات به لحاظ فنی در چارچوب لوریج (Leverage) اجرا شده باشند. این امر نشان می‌دهد که مدیریت ریسک (Risk Management) ربات باید نه تنها ریسک مالی را مدیریت کند، بلکه باید ریسک عملیاتی ناشی از قوانین داخلی بروکر را نیز در نظر بگیرد.

مستندسازی و انتقال شرایط بروکر به منطق کدنویسی

قبل از شروع کدنویسی حتی یک خط از اکسپرت (Expert Advisor)، فرآیند جامع شناسایی و مستندسازی پارامترهای بروکر باید انجام شود. این مرحله زیربنای موفقیت است و اغلب توسط برنامه‌نویسان عجول نادیده گرفته می‌شود. این مستندسازی باید شامل موارد زیر باشد:

۱. مشخصات قیمت‌گذاری: حداقل و حداکثر اسپرد (Spread) واقعی (نه صرفاً اعلام‌شده)، وجود یا عدم وجود کمیسیون (Commission) برای نمادهای کلیدی، و نحوه محاسبه آن (بر اساس لات یا حجم کلی).

۲. پارامترهای اهرم و مارجین: حداکثر لوریج (Leverage) مجاز، نحوه محاسبه مارجین (Margin) مورد نیاز برای هر لات (Lot)، و آستانه‌های سطح مارجین کال (Margin Call).

۳. مشخصات اجرای سفارش: نوع حساب معاملاتی (Account Type) (ECN/Standard/Micro)، روش اجرای سفارش (Market/Instant)، و مقادیر مجاز برای انحراف قیمت (Price Deviation) در هنگام ارسال سفارش‌های بازار.

۴. محدودیت‌های معاملاتی: ساعات معاملات نمادهای خاص، حداقل فاصله مجاز بین حد ضرر و قیمت بازار (Stop Level)، و محدودیت‌های اعمال‌شده بر استراتژی‌های پرنوسان (مانند ممنوعیت هج (Hedge) یا مارتینگل (Martingale)).

۵. دقت داده‌ها: تعداد ارقام اعشار (Digits) مورد استفاده برای قیمت‌ها در پلتفرم معاملاتی (مثلاً ۴ یا ۵ رقم برای ارزها) و تأثیر آن بر محاسبات اندیکاتورها و مدیریت موقعیت.

این اطلاعات مستندشده باید مستقیماً به کد منتقل شوند. به عنوان مثال، اگر بروکر برای EURUSD از ۵ رقم اعشار استفاده می‌کند، ربات معاملاتی (Trading Bot) باید از همین دقت در محاسبات خود بهره ببرد. استفاده از توابع استاندارد پلتفرم که به طور خودکار این پارامترها را استخراج می‌کنند (مانند SymbolInfoDouble در MQL5 یا دسترسی به متادیتا در پایتون) حیاتی است، اما توسعه‌دهنده باید مطمئن شود که این توابع بر اساس تنظیمات فعلی سرور بروکر (Broker Server) عمل می‌کنند نه صرفاً تنظیمات پیش‌فرض.

آسیب‌های ناشی از نادیده‌گرفتن تفاوت دیتای بک‌تست و محیط زنده

یکی از فاجعه‌بارترین اشتباهات، انجام بک‌تست (Backtest) با داده‌های عمومی یا داده‌های جمع‌آوری شده از یک کارگزار دیگر و سپس اجرای آن بر روی سرور بروکر (Broker Server) هدف است. این کار به دلیل عدم تطابق در عواملی مانند اسپرد (Spread) تاریخی، اسلیپیج (Slippage) مدل‌سازی شده، و فرکانس به‌روزرسانی قیمت، نتایج گمراه‌کننده‌ای تولید می‌کند.

فرض کنید یک استراتژی اسکالپینگ طراحی شده که بر اساس یک اسپرد (Spread) تاریخی میانگین ۰.۸ پیپ در نماد طلای XAUUSD سوددهی نشان می‌دهد. اگر ربات معاملاتی (Trading Bot) روی سرور بروکر (Broker Server) جدیدی اجرا شود که در شرایط مشابه، به دلیل ماهیت نوع حساب معاملاتی (Account Type)، اسپرد (Spread) واقعی را روی ۱.۵ پیپ نگه می‌دارد، کل فرضیه سوددهی استراتژی از بین می‌رود. در واقع، در بک‌تست (Backtest)، ربات به سادگی سود را بدون کسر هزینه‌های واقعی متحمل شده ثبت کرده است.

علاوه بر این، اسلیپیج (Slippage) در بک‌تست (Backtest) اغلب به صورت بسیار محافظه‌کارانه (یا کاملاً نادیده گرفته می‌شود) مدل‌سازی می‌شود. اما در محیط زنده، به ویژه در زمان‌هایی که نقدینگی پایین است یا بروکر (Broker) از اجرای بازار برای حجم‌های بزرگ استفاده می‌کند، اسلیپیج (Slippage) واقعی می‌تواند بسیار بیشتر باشد. مدیریت ریسک (Risk Management) باید شامل یک ضریب محافظه‌کارانه برای اسلیپیج (Slippage) باشد که بر اساس نوع اجرای سفارش در بروکر هدف کالیبره شده است. اگر بروکر اجرای بازار دارد، باید در فوروارد تست (Forward Test) به دنبال اسلیپیج متوسط ۲ تا ۳ پیپ باشید، در حالی که در یک محیط ECN بسیار باکیفیت، این عدد ممکن است کمتر از ۰.۵ پیپ باشد. این تفاوت در مدل‌سازی، تفاوت بین ربات معاملاتی (Trading Bot) سودده و زیان‌ده در دنیای واقعی است.

تنظیمات تایم فریم و تفاوت نمادهای معاملاتی

هرچند به نظر می‌رسد که یک تایم فریم (Time Frame) (مانند M1 یا H1) در همه جا یکسان است، اما تفاوت در نحوه محاسبه کندل‌ها (Candle) توسط سرور بروکر (Broker Server) می‌تواند مشکل‌ساز شود. برخی بروکرها کندل‌ها را بر اساس زمان سرور بروکر (Broker Server) (که اغلب GMT یا GMT+2 است) محاسبه می‌کنند، در حالی که برخی دیگر ممکن است از زمان محلی مشتری یا زمان معاملاتی نیویورک پیروی کنند. اگر ربات معاملاتی (Trading Bot) برای سیگنال‌گیری در زمان بسته شدن کندل M1 طراحی شده باشد، اما کندل‌های بروکر هدف در زمان دیگری بسته شوند، ربات سیگنال‌ها را در لحظه نادرست تولید می‌کند.

این مسئله به ویژه در مورد نمادهایی که سشن‌های معاملاتی مشخصی دارند (مانند کالاها یا شاخص‌ها) اهمیت پیدا می‌کند. برخی بروکرها ممکن است در طول تعطیلات رسمی، قیمت‌گذاری نمادهای خاص را متوقف کنند یا نرخ اسپرد (Spread) را به شکل غیرمنتظره‌ای افزایش دهند. ربات معاملاتی (Trading Bot) باید توانایی تشخیص این شرایط غیرعادی را داشته باشد تا از اجرای معاملات در بازه‌های زمانی بی‌ثبات جلوگیری کند. یک کدنویسی قوی باید شامل توابع بررسی وضعیت بازار فعلی (Market Status Check) باشد که به‌طور دوره‌ای اطلاعات مربوط به ساعات کاری و پارامترهای جاری بروکر (Broker) را استخراج کند.

فراتر از بک‌تست: ضرورت تست‌های تطبیقی و زنده محدود

پس از اطمینان از انطباق پارامترهای فنی ربات با مستندات بروکر (Broker)، مرحله حیاتی بعدی، فوروارد تست (Forward Test) است. بک‌تست (Backtest) صرفاً نشان می‌دهد که الگوریتم با داده‌های گذشته کار می‌کند؛ فوروارد تست (Forward Test) نشان می‌دهد که الگوریتم با سرور بروکر (Broker Server) و شرایط اجرای واقعی کار می‌کند.

فوروارد تست (Forward Test) باید با حجم بسیار کم (Micro Lots) یا در حساب‌های دمو که اجرای سفارش آن‌ها نزدیک به حساب واقعی است (برخی دموها اجرای ضعیف‌تری دارند)، انجام شود. در این مرحله، تمرکز اصلی بر روی مشاهده رفتار ربات در مواجهه با اسلیپیج (Slippage)، نرخ پذیرش سفارش، و نحوه مدیریت تغییرات ناگهانی اسپرد (Spread) است. اگر ربات معاملاتی (Trading Bot) پس از چند هفته در فوروارد تست با شرایط متغیر بازار سازگار باشد، می‌توان به تدریج حجم معاملات را افزایش داد و مدیریت ریسک (Risk Management) را با توجه به ظرفیت واقعی حساب و محدودیت‌های بروکر تنظیم نمود.

در نهایت، هرگز نباید فرض شود که شرایط یک بروکر (Broker) در طول زمان ثابت باقی می‌ماند. کارگزاران ممکن است ساختار کمیسیون، حداقل لوریج (Leverage)، یا حتی تأمین‌کنندگان نقدینگی خود را تغییر دهند. بنابراین، ربات معاملاتی (Trading Bot) باید به‌طور دوره‌ای (مثلاً هر سه ماه یک‌بار) فرآیند اعتبارسنجی پارامترهای محیطی خود را تکرار کند تا اطمینان حاصل شود که همچنان در چارچوب عملیاتی کارگزار باقی مانده است. این نگاه بلندمدت به پایداری فنی، ضامن بقای استراتژی‌های معاملاتی الگوریتمی در محیط متغیر بازار است.

دیدگاه‌ها (0)

  • نظرات نامربوط به محتوا تأیید نخواهند شد.
  • لطفاً از افزودن نظرات تکراری خودداری کنید.
  • نظرات مربوط به دوره‌ها فقط برای خریداران محصول است.

*
*