آموزش SQL Server DDL Triggers
در این آموزش، نحوه استفاده از SQL Server data definition language trigger (DDL) برای نظارت بر تغییرات ایجاد شده در Object هایی دیتابیس خواهید آموخت.
مقدمه ای بر SQL Server DDL Triggers
SQL Server DDL triggerها به رویدادهای سرور یا data base به جای تغییرات داده های جدول پاسخ می دهند. این رویدادها توسط دستور Transact-SQL ایجاد میشوند که معمولاً با یکی از کلیدواژههای CREATE، ALTER، DROP، GRANT، DENY، REVOKE یا UPDATE STATISTICS شروع میشوند.
برای مثال، میتوانید هر زمان که یک کاربر دستور CREATE TABLE یا ALTER TABLE را صادر میکند، یکtriggerDDL بنویسید تا لاگین کنید.
تریگرهای DDL در موارد زیر مفید هستند:
- ثبت تغییرات در اسکیمای پایگاه داده
- از برخی تغییرات خاص در اسکیمای data baseجلوگیری کنید.
- به تغییر در اسکیمای data baseپاسخ دهید.
شکل زیر نحو ایجاد یکtriggerDDL را نشان می دهد:
Trigger_Name
نامtriggerتعریف شده توسط کاربر را بعد از کلمات کلیدی CREATE TRIGGER مشخص کنید. توجه داشته باشید که لازم نیست یک اسکیمای برای یکtriggerDDL مشخص کنید زیرا به جدول یا view data baseمربوط نمی شود.
DATABASE | ALL SERVER
اگرtriggerبه رویدادهای محدوده data baseپاسخ می دهد از DATABASE یا اگرtriggerبه رویدادهای محدوده سرور پاسخ می دهد از ALL SERVER استفاده کنید.
ddl_trigger_option
ddl_trigger_option عبارت ENCRYPTION و/یا EXECUTE AS را مشخص می کند. ENCRYPTION تعریفtriggerرا رمزگذاری می کند. EXECUTE AS زمینه امنیتی را کهtriggerتحت آن اجرا می شود، تعریف می کند.
event_type | event_group
event_type یک رویداد DDL را نشان میدهد که باعث میشود trigger فعال شود، مانند CREATE_TABLE، ALTER_TABLE و غیره.
رویداد_گروه گروهی از رویدادهای نوع رویداد مانند DDL_TABLE_EVENTS است.
یک trigger می تواند در یک یا چند رویداد یا گروه رویداد مشترک شود.
مثالی از پیاده سازی DDL Trigger
فرض کنید می خواهید تمام تغییرات ایجاد شده در فهرست پایگاه داده را ثبت کنید تا بتوانید عملکرد سرور پایگاه داده را که به این تغییرات شاخص مربوط می شود نظارت کنید.
ابتدا یک جدول جدید به نام index_logs ایجاد کنید تا تغییرات ایندکس را ثبت کنید:
سپس، یک trigger DDL برای ردیابی تغییرات ایندکس و درج داده های رویدادها در جدول index_logs ایجاد کنید:
در بدنه trigger، از تابع EVENTDATA استفاده کردیم که اطلاعات مربوط به رویدادهای سرور یا پایگاه داده را برمی گرداند. این عملکرد فقط در داخل DDL یا trigger ورود به سیستم موجود است.
سپس، برای ستون های first_name و last_name جدول sales.customers ایندکس ایجاد کنید:
پس از آن، دادهها را از جدول index_changes کوئری بزنیدتا بررسی کنید که آیا رویداد ایجاد ایندکس به درستی توسطtriggerثبت شده است یا خیر:
اگر روی سلول ستون event_data کلیک کنید، می توانید داده های XML رویداد را به صورت زیر مشاهده کنید:
در این آموزش، یاد گرفتید که چگونه یک SQL Server DDL trigger ایجاد کنید که به یک یا چند رویداد DDL پاسخ دهد.
آموزش PL/SQL قسمت دوازدهم TRIGGER در اوراکل PL/SQL
در این قسمت TRIGGER و روش استفاده از آن را توضیح می دهیم. TRIGGER یک بلاک برنامه ذخیره شده در دیتابیس اوراکل است که همزمان با رخدادهای خاص به صورت اتوماتیک اجرا (FIRE) می شود.
رخدادهایی که سبب اجرای یک TRIGGER می شوند عبارتند از:
1.رخداد دستورات DML
2.رخداد دستورات DDL
3.رخدادهای خاص در دیتابیس مانند LOGON، LOGOFF، STARTUP و SHUTDOWN
در چه سطحی می توان TRIGGER را تعریف نمود؟
چرا از TRIGGER استفاده می شود؟
-جلوگیری از تراکنش های اشتباه
-اطلاعات مربوط به دسترسی یا دستکاری ذخیره شوند(auditing).
-تولید برخی مقدارهای خاص به صورت اتوماتیک
1.ساخت TRIGGER برای دستورات DML
در ادامه فرمت کلی ساخت TRIGGER برای دستورات DML را می بینید.
CREATE [OR REPLACE ] TRIGGER trigger_name
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
DECLARE
Declaration-statements
BEGIN
Executable-statements
EXCEPTION
Exception-handling-statements
END;
– با استفاده ازBEFORE و یا AFTER می توان مشخص نمود که زمان اجرا شدن TRIGGER قبل یا بعد از رخداد باشد. عبارت INSTEAD OF برای ساخت TRIGGER بر روی VIEW استفاده می شود.
– در قسمت عملیات DML مورد نظر را مشخص می کنیم و عبارت [OF col_name] نام ستونی که دستکاری می شود را مشخص می کند. می توان یک یا چند DML را مشخص نمود.
– قسمت ON table_name نام جدولی است که TRIGGER برای آن اجرا می شود
–با استفاده از [REFERENCING OLD AS o NEW AS n] یعنی n و o می توان به مقدارهای قبل و بعد از دستور DML اشاره نمود. اگر از این عبارت استفاده نشود از OLD و NEW می توان استفاده کرد. همچنین توجه شود که این مقادیر فقط برای TRIGGERهای از نوع ROW-LEVEL قابل استفاده هستند.
– اگر از عبارت [FOR EACH ROW] استفاده گردد TRIGGER برای هر سطر که دستکاری شده است اجرا می شود (ROW-LEVEL TRIGGER). در غیر این صورت TRIGGER فقط یکبار برای تمام دستور DML اجرا می شود(TABLE-LEVEL TRIGGER).
– اگر TRIGGER به صورت ROW-LEVEL تعریف شود دستور شرطی WHEN برای هر سطر بررسی می شود در غیر این صورت نمی توان از WHEN استفاده تمود.
نکته: نمی توان برای OBJECTهایی که کاربر SYS و SYSTEM مالک آنها هستند TRIGGER تعریف کرد.
مثال 1: یک TRIGGER به صورت ROW-LEVEL برای هرگونه عملیات DML برای جدول costumers بسازید.
CREATE OR REPLACE TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON customers
FOR EACH ROW
WHEN (NEW.ID > 0)
sal_diff := :NEW.salary – :OLD.salary;
dbms_output.put_line(‘Old salary: ‘ || :OLD.salary);
dbms_output.put_line(‘New salary: ‘ || :NEW.salary);
dbms_output.put_line(‘Salary difference: تریگر (Trigger) چیست؟ ‘ || sal_diff);
با اجرای دستور DML زیر این TRIGGER را FIRE می کنیم.
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, ‘Kriti’, 22, ‘HP’, 7500.00 );
Old salary:
New salary: 7500
Salary difference:
مقدار OLD برای دستور قبلی برابر با NULL بود. در ادامه، یک دستور UPDATE اجرا می کنیم.
UPDATE customers
SET salary = salary + 500
WHERE >
Old salary: 1500
New salary: 2000
Salary difference: 500
نکته: توجه شود که از علامت : قبل از دستیابی به مقدارهای NEW و OLD استفاده می شود.
مثال 2: هر عمل INSERT در جدول ORDERS توسط چه شخصی و در چه تاریخی انجام می شود؟ این اطلاات را در همان سطر از جدول و در ستونهای CREATED_BY و CREATE_DATE ذخیره کنید.
CREATE OR REPLACE TRIGGER orders_before_insert
BEFORE INSERT
ON orders
FOR EACH ROW
— Find username of person performing INSERT into table
SELECT user INTO v_username FROM dual;
— Update create_date field to current system date
:new.create_date := sysdate;
— Update created_by field to the username of the person performing the INSERT
:new.created_by := v_username;
نکته 1: در داخل برنامه TRIGGER از نوع BEFORE می توان مقدارهای NEW را عوض کرد ولی مقدارهای OLD قابل تغییر نیستند. برای مثال می توان از دستور زیر استفاده نمود:
نکته 2: در داخل TRIGGER های از نوع AFTER هیچ کدام از مقدارهای NEW و OLD قابل تغییر نیستند.
نکته 3: اگر می خواهیم در داخل برنامه TRIGGER که برای جدول A تعریف شده است، جدول A را پرس و جو کنیم می بایست از TRIGGER از نوع AFTER استفاده شود در غیر این صورت نمی توان از آن جدول QUERY گرفت.
2.ساخت TRIGGER برای دستورات DDL
برای دستورات DDL نیز می توان TRIGGER ساخت. در ادامه سینتکس ساخت TRIGGER برای دستورات DDL را می بینید که در سطح دیتابیس یا SCHEMA اعمال می شوند.
CREATE [OR REPLACE] TRIGGER trigger name
مثال: در سطح SCHEMA اطلاعات هر دستور CREATE را ثبت کنید
CREATE OR REPLACE TRIGGER bcs_trigger
BEFORE CREATE
ON SCHEMA
DECLARE
oper ddl_log.operation%TYPE;
BEGIN
INSERT INTO ddl_log
SELECT ora_sysevent, ora_dict_obj_owner,
ora_dict_obj_name, NULL, USER, SYSDATE
FROM DUAL;
END bcs_trigger;
/
3.ساخت TRIGGER برای رخدادهای خاص
در ادامه سینتکس ساخت TRIGGER برای رخدادهای خاص در سطح دیتابیس یا SCHEMA را ملاحظه می کنید:
تفاوت For و After Trigger در SQL Server
در واقع در SQL Server دو نوع Trigger وجود دارد:
نوع After Trigger در واقع معادل For Trigger می باشد که در نسخه های قدیمی تر از SQL Server 2000 وجود داشت و در واقع تنها نوع trigger موجود در SQL Server بود. به این نکته توجه داشته باشید که نوع For Trigger در نسخه های بعد از SQL Server 2000 منسوخ شده و باید از After Trigger استفاده شود.
همچنین نوع After Trigger تنها زمانی اجرا می شود که دستور insert, update, delete که منجر به اجرا شدن trigger شده است، با موفقیت اجرا شده باشد و دستور اصلی در تمام جداول زیر مجموعه cascade شده و تمام constraint ها و check ها با موفقیت Pass شده باشند. در این حالت After Trigger اجرا خواهد شد. همچنین این نوع Trigger را تنها می توان بر روی Table ها تعریف نمود و امکان تعریف After Trigger بر روی View ها ممکن نیست.
شهاب ساری اصلانی
از سال 1385 به صورت جدی مشغول تدریس در حوزه های برنامه نویسی دات نت و طراحی بانک های اطلاعاتی بوده ام. تدریس به عنوان یک حرفه همیشه برایم جذاب بوده و یادگیری جدیدترین مباحث لذت بخش است.
قیمت ماشه (Trigger Price) چیست و چگونه تعیین می شود؟
قیمت ماشه یا ترایگر پرایس همان سطح قیمتی است که معامله گر می خواهد توقف ضرر او در آن اجرا شود. گفتیم که به آن قیمت حد ضرر نیز گفته می شود که معمولاً به عنوان درصد قیمت خرید یا فروش معامله گر محاسبه می شود.
برخی از سیستم عامل های معاملاتی به معامله گر اجازه می دهند این قیمت را به صورت درصدی تنظیم کنند (10٪ در مثال بالا) ، در حالی که برخی دیگر از سیستم عامل های معاملاتی به کاربران امکان می دهند رقم دقیق قیمت را وارد کنند (180 دلار در مثال بالا).
با استفاده از قیمت ماشه (Trigger Price)، کاربران نیازی به مراقبت از بازار در تمام مدت و اختصاص تمام زمان خود به نظارت بازار ندارند، در عوض، آنها می توانند پیش نویس سفارشات خود را برای فروش یا خرید در زمان معین انجام دهند که این امر به سودآوری و جلوگیری از ضرر کمک شایانی می کند.
در کنار سفارشات معمول مانند خرید فروش که توسط هر معامله گر در بازارهای مالی استفاده می شود، ثبت سفارشاتی مانند سفارش توقف ضرر (Stop-loss Order) نیز می تواند به سهولت انجام معاملات کمک کند.
سفارش توقف ضرر برای محدود کردن ضرر سرمایه گذار در موقعیت های خاص طراحی شده است. معامله گران تریگر (Trigger) چیست؟ با تنظیم یک قیمت ماشه (Trigger Price) در سفارش، از ضرر بیشتر جلوگیری می کنند. البته نوسانات قیمت کوتاه مدت می تواند قیمت ماشه را فعال کند و فروش غیر ضروری را فعال کند.
سفارش توقف ضرر (Stop-loss Order) چیست؟
منظور از دستور یا سفارش توقف ضرر این است که معامله گر از طریق بستر معاملاتی خود دستورالعمل هایی را ارائه می دهد که وقتی قیمت به یک سطح از پیش تعیین شده می رسد یا پایین تر از آن می رود، سیستم باید دارایی او را به طور خودکار بفروشد. در موقعیت های شورت (Short) (وقتی سود خود را از کاهش قیمت بدست می آورید) ، با افزایش قیمت در سطح از پیش تعیین شده، Stop-Loss فعال می شود.
سطح از پیش تعیین شده می تواند یک قیمت یا یک رقم درصدی باشد. اگر رقم قیمت باشد ، قیمتی است که کاربر می خواهد توقف ضرر او اجرا شود. اگر این رقم درصدی باشد، از درصد ارزش خرید یا فروش معامله گر در آن معامله محاسبه می شود.
بیایید یک مثال سریع برای این مفهوم ببینیم. یک معامله گر ارز دیجیتال X را به تریگر (Trigger) چیست؟ قیمت 200 دلار خریده است و دوست دارد بیش از 10٪ این مبلغ را از دست ندهد. 10 درصد 200 دلار 20 دلار می شود. معامله گر این ده درصد که معادل ۲۰ دلار است را از قیمت خرید 200 دلار کم می کند و عدد ۱۸۰ دلار به دست می آید. این بدان معناست که اگر قیمت آن ارز دیجیتال به 180 دلار برسد، معامله گر باید ارز دیجیتال خود را بفروشد. این قیمت حد ضرر یا توقف ضرر معامله گر در این معامله خواهد بود.
تفاوت بین stop-Loss و stop-limit چیست؟
تصور کنید یک معامله گر ارز دیجیتال X را دوباره به قیمت 200 دلار خریداری کرده است. هنگامی که معامله گر یک سفارش حد ضرر و زیان با قیمت 180 دلار (Stop Loss) تنظیم می کند، به سادگی این مفهوم را می رساند که به کارگزار خود می گوید: «اگر می بینید کسی این ارز دیجیتال را با قیمت 180 دلار معامله کرده است، ارز دیجیتال x من را بفروشید».
حال ببینیم Stop-Limit چگونه معنای متفاوتی ایجاد می کند؟
در اصل استاپ لیمیت ترکیبی از یک دستور Stop-Loss و یک حد مجاز است. به زبان ساده، استاپ لیمیت گویای این عبارت است که «اگر می بینید کسی ارز دیجیتال x را با قیمت 180 دلار معامله کرده است، این ارز دیجیتال را از سبد من بفروشید، اما هرگز آن را پایین تر از 160 دلار نفروشید».
Stop-Loss و Stop-Limit می تواند به صورت درصد (از قیمت خرید) و به عنوان یک قیمت دقیق تنظیم شود. این گزینه به کارگزار بستگی دارد ، هیچ استانداردی برای این کار وجود ندارد. کارگزاری ها برای سرمایه گذاران حرفه ای یا معامله گران با تجربه معمولاً امکان تنظیم قیمت های دقیق را فراهم می کنند.
چه زمانی از Stop-Loss استفاده می شود؟
موارد بسیاری وجود دارد که کاربران بهتر است و توصیه می شود که از یک دستور توقف ضرر یا حد ضرر استفاده کنند. اما از کجا بدانیم که این همان زمانی است که باید از آن استفاده کرد؟ ابتدا باید بدانیم که هدف اصلی تعیین حد ضرر چیست: نجات معامله گر از ضررهای بزرگ.
به عنوان یک قاعده کلی باید به خاطر داشت که همه معامله گران به جز سرمایه گذارانی که به صورت بلند مدت معامله و سرمایه گذاری می کنند، بهتر است از این تکنیک استفاده کنند. این یک تکنیک بسیار مناسب معاملاتی است. سرمایه گذاران بلند مدت معمولا از حد ضرر استفاده نمی کنند زیرا در بلند مدت نوسانات کوتاه مدتی آنها را آزار نمی دهد و تصمیمات خرید یا فروش خود را در بازه ی طولانی تری تنظیم می کنند.
به کارگیری این تکنیک همچنین به نوع دارایی ای که معامله گر با آن سروکار دارد نیز بستگی دارد (مانند فارکس، سهام و ارز دیجیتال). به طور مثال حد ضرر و زیان با سهولت بیشتری می تواند در بازار سهام نسبت به اوراق قرضه ایجاد شود.
مزایای استفاده از سفارش Stop-Loss و قیمت ماشه (Trigger Price)
مهمترین مزیت سفارش توقف ضرر این است که اجرای آن هزینه ای ندارد. کارمزد عادی و معمول کاربر تنها پس از رسیدن به قیمت ماشه و فروش سهام باید شارژ شود و از او دریافت می شود.
یک مزیت دیگر در سفارش توقف ضرر این است که اجازه می دهد تصمیم گیری معامله گر در خصوص خرید و فروش از هرگونه تأثیر عاطفی آزاد و جدا باشد. مردم تمایل دارند عاشق سهام یا ارز دیجیتال خود شوند. به عنوان مثال، آنها ممکن است این باور غلط را همیشه در ذهن داشته باشند که اگر فرصت سرمایه گذاری در دارایی دیگری را به خود بدهند قطعا پشیمان خواهند شد یا دوباره به دارایی قبلی خود باز خواهند گشت. اما در واقعیت، این تاخیر در تصمیم گیری ممکن است فقط باعث افزایش ضرر شود.
صرف نظر از اینکه معامله گر از چه نوع سرمایه گذاری باشد، باید بتواند به راحتی دلیل خرید و نگهداری دارایی خود را تشخیص دهد. معیارهای یک سرمایه گذار کوتاه مدت با معیارهای یک سرمایه گذار بلند مدت متفاوت خواهد بود، که این ها نیز با معیارهای یک معامله گر روزانه متفاوت هستند. مهم نیست که چه استراتژی ای انتخاب شده است، استراتژی فقط در صورتی جواب می دهد که معامله گر به استراتژی پایبند باشد. بنابراین ، اگر یک سرمایه گذار سخت گیر در خرید و نگهداری یک دارایی باشد ، سفارشات حد ضرر و زیان و قیمت ماشه او در این مرحله بی فایده است. اما در پایان، اگر قرار است یک سرمایه گذار در مسیر خود موفق باشد ، باید از استراتژی خود اطمینان کامل داشته باشد. این به این معنی است که برنامه و استراتژی خود را ادامه دهد. مزیت سفارشات حد ضرر این است که آنها می توانند به کاربر کمک کنند تا در مسیر خود باشد و مانع از مداخله احساسات او شود.
سرانجام، مهم است که درک کنیم تعیین سفارشات ضرر و زیان و قیمت ماشه تضمین نمی کند که در بازارهای مالی درآمد کسب کنیم. معامله گر هنوز هم باید علاوه بر استفاده از این تکنیک، تصمیمات هوشمندانه در مورد سرمایه گذاری بگیرد. اگر این کار را نکند ، به همان اندازه که این تکنیک ضرر او را متوقف می کند، از راه دیگری ضرر خواهد کرد (فقط با سرعت بسیار کندتر).
سفارشات توقف ضرر و زیان به طور سنتی به عنوان راهی برای جلوگیری از ضرر در نظر گرفته می شود. با این حال ، استفاده دیگر از این ابزار، قفل کردن سود است. در این حالت، گاهی اوقات از دستورات توقف ضرر به عنوان ” trailing stop” یا توقف عقب افتادن یاد می شود. در اینجا ، سفارش ضرر و زیان در درصدی کمتر از قیمت فعلی بازار تنظیم می شود (نه قیمتی که آن را خریداری کرده اید). قیمت توقف ضرر با نوسان قیمت دارایی تنظیم می شود و تغییر می کند (چون به صورت درصدی تنظیم می شود). مهم است که به خاطر داشته باشید که اگر ارزش یک دارایی صعود کند، یک سود بالقوه به دست می آید. اما کاربر هنوز تا وقتی که دارایی را بفروشد پول نقد را در دست ندارد. استفاده از یک trailing stop به معامله گر اجازه می دهد تا سود او ادامه یابد، در حالی که در عین حال، حداقل سود واقعی تحقق یافته را نیز تضمین می کند.
در ادامه برای درک بهتر این مثال را در نظر بگیرید: فرض کنید معامله گر یک دستور trailing stop برای 10٪ زیر قیمت فعلی تعیین کرده است و دراریی او در طی یک ماه به 30 تریگر (Trigger) چیست؟ دلار افزایش می یابد. سفارش trailing stop در هر سهم 27 دلار (30 دلار – (٪10* ۳۰دلار)) = 27 دلار قفل می شود. از آنجا که این پایین ترین قیمتی است که دارایی در آن فروخته می شود ، حتی اگر دارایی یک افت غیر منتظره داشته باشد، معامله گر ضرر نمی کند.
البته ، به خاطر داشته باشید که دستور ضرر و زیان همچنان یک سفارش در بازار است و به سادگی در حالت خاموش باقی می ماند و فقط با رسیدن به قیمت ماشه فعال می شود. بنابراین ، ممکن است قیمتی که فروش معامله گر در آن انجام می شود کمی متفاوت از قیمت ماشه تعیین شده باشد.
معایب سفارشات توقف ضرر
گفتیم که یک مزیت سفارش توقف ضرر این است که معامله گر نیازی به نظارت بر عملکرد روزانه دارایی خود ندارد. این راحتی به خصوص هنگامی که معامله گر در تعطیلات به سر می برد یا در شرایطی است که مانع نظارت بر دارایی خود برای مدت طولانی می شود، بسیار مفید است. اما عیب اصلی این ویژگی این است که نوسان کوتاه مدت قیمت سهام می تواند حد ضرر را فعال کند. نکته کلیدی حل این مشکل، انتخاب درصدی حد ضرر است که به سهام اجازه می دهد روز به روز نوسان داشته باشد و در عین حال از خطر نزول هرچه بیشتر جلوگیری می کند. تعیین سفارش توقف ضرر 5٪ در دارایی هایی که سابقه نوسان 10٪ یا بیشتر در یک هفته را داشته باشد ممکن است بهترین استراتژی نباشد و به احتمال زیاد معامله گر در کارمزد دریافت شده حاصل از اجرای سفارش توقف ضرر، ضرر خواهد کرد.
هیچ قانون درست و سریعی برای تعیین حد ضرر وجود ندارد. تعیین این عدد کاملا به سبک سرمایه گذاری فردی هر معامله گر بستگی دارد. یک معامله گر فعال ممکن است از حد ضرر 5٪ استفاده کند ، در حالی که یک سرمایه گذار بلند مدت ممکن است 15٪ یا بیشتر را انتخاب کند.
یکی دیگر از معایب این روش که باید بدانید این است که هنگامی که دارایی به قیمت ماشه خود رسید، سفارش توقف ضرر به یک سفارش باز تبدیل می شود. بنابراین ممکن است قیمتی که دارایی در آن فروخته می شود بسیار متفاوت از قیمت ماشه که توسط معامله گر تعیین شده، باشد. این واقعیت به ویژه در یک بازار پر سرعت و پر نوسان مانند ارزهای دیجیتال که قیمت دارایی ها می تواند به سرعت تغییر کند، صادق و در عین حال پر ریسک است.
محدودیت دیگر در مورد سفارش توقف ضرر این است که بسیاری از کارگزاران به معامله گران اجازه نمی دهند در برخی از اوراق بهادار مانند سهام تابلوی OTC سفارش توقف ضرر ایجاد کنند.
علاوه بر موارد گفته شده، سفارشات توقف ضرر محدود خطرات بالقوه بیشتری نیز دارند که معامله گران باید با توجه به هر دارایی و میزان نوسان و دامنه تغییرات آن، نسبت به تنظیم یا عدم تنظیم قیمت ماشه، تصمیم درستی اتخاذ کنند.
شرح پارامترها
قیمت ماشه / ماشه (Trigger Price/ Trigger): هنگامی که آخرین قیمت معامله شده به Trigger Price/ Trigger رسید ، سفارش از پیش تریگر (Trigger) چیست؟ تعیین شده اجرا می شود.
قیمت سفارش (Order price): قیمتی که کاربران برای قرارداد خرید و فروش وارد می کنند. هنگامی که آخرین قیمت معامله شده به Trigger رسید ، سیستم به طور خودکار سفارش را در Order Price از پیش تعیین شده در دفتر سفارشات انجام می دهد.
مبلغ قرارداد (Contracts Amount): مقدار یا حجمی که کاربران برای فروش / خرید قراردادها وارد می کنند. هنگامی که آخرین قیمت معامله شده به Trigger رسید، سیستم بطور خودکار سفارش این حجم از قراردادهای از پیش تعیین شده را در دفتر سفارش ثبت می کند.
اکنون با یک مثال مفهوم پارامترها را روشن می کنیم:
یک کاربر دارای 100 عدد قرارداد سه ماهه ارز دیجیتالی با موقعیت Long، با متوسط قیمت موقعیت باز 12000 USD است. او فکر می کند حمایت مهم و کلیدی نزدیک تریگر (Trigger) چیست؟ به 10000 دلار باشد. اگر قیمت به زیر 10000 دلار برسد ، افت زیادی خواهد داشت. برای جلوگیری از ضرر و زیان بیشتر ، کاربر می تواند از تکنیک Trigger Order برای جلوگیری از ضرر استفاده کند.
حال با جزییات ببینیم این روش چگونه پیاده سازی می شود:
متد سفارش شماره ۱: انتخاب ” Trigger order ” تعیین قیمت ماشه 10000 دلار ، و برنامه ریزی برای فروش 100 عدد قرارداد برای موقعیت Long (تعداد قرارداد) با 9980 دلار (قیمت سفارش) ، پس از وارد کردن اعداد، مرحله بعد کلیک کردن روی ” Close Long”برای ثبت سفارش. هنگامی که آخرین قیمت معامله شده به 10000 دلار برسد ، سیستم سفارش Trigger را اجرا می کند و آن را با قیمت 9980USD ، یعنی سفارش Limit Order به بازار می فروشد.
متد سفارش شماره ۲: انتخاب ” trigger order” ، تعیین قیمت ماشه 10000 دلار و انتخاب سطح قیمت مورد نظر از میان 5 قیمت برتر (top 5 optimal BBO price) یا 20 قیمت برتر (top 20 optimal BBO price) و سپس کلیک بر روی گزینه “Close Long “و سپس منعقد کردن قرارداد. وقتی آخرین قیمت معامله شده به 10000USD رسید ، سیستم سفارش Trigger را اجرا می کند و در اسرع وقت با قیمت BBO انتخاب شده سریع معامله می کند تا قیمت بازار را از دست ندهد.
چگونگی بررسی وضعیت سفارش
پس از تنظیم و بستن قرار دادن سفارش ماشه (Trigger Order)، کاربر می تواند سفارش را در بخش “” Open Orders – Trigger Orders پیدا کند تا وضعیت سفارش را بررسی کند.
نکات مهم
1. هنگامی که قراردادهای مورد نظر در مرحله تحویل ، تسویه حساب یا تعلیق قرار دارند ، کاربران نمی توانند سفارشات ماشه را راه اندازی کنند ، این بدان معنی است که عملکرد سفارش ماشه فقط برای قراردادهای وضعیت معامله (trading-status) موجود است.
2. برای سفارشات ماشه محدودیت سفارش وجود دارد. هنگام عبور از حد سفارش آن نوع قرارداد ، کاربران نمی توانند سفارشات ماشه را چندین بار برای یک نوع قرارداد ثبت کنند.
3. هنگامی که آخرین قیمت معامله شده به “Trigger” رسید، سفارش از پیش تعیین شده اجرا می شود. اما اگر قیمت سفارش از پیش تعیین شده در محدوده قیمت نباشد (یعنی کاربران یک قیمت خرید بالاتر از بالاترین قیمت خرید یا یک قیمت فروش پایین تر از پایین ترین قیمت فروش تعیین کنند)، در این صورت ، سفارش ماشه شکست می خورد .
4. ممکن است سفارشات ترایگر به دلیل نوسانات شدید ، محدودیت قیمت ، محدودیت موقعیت ، حاشیه ناکافی ، نبود موقعیت کافی برای بستن قرارداد، وضعیت غیر عادی ، مشکلات شبکه یا سایر مشکلات سیستم فعال نشود.
۵. قبل از اینکه سفارش فعال شود و تا زمانی که سفارش ماشه در موقعیت های باز / بسته شدن با قیمت و مقدار سفارش از پیش تعیین شده آغاز شود حاشیه یا موقعیت های دیگر مسدود نمی شوند.
۶. هنگامی که سفارش ماشه فعال شد ، به سفارش محدود منتقل می شود و در سفارش دفتر کل با قیمت از پیش تعیین شده توسط کاربر قرار می گیرد.
لطفا توجه داشته باشید که امکان انجام موفقیت آمیز سفارش ماشه، کاملا بستگی به شرایط بازار در آن زمان دارد که آیا می توان در آن موقعیت سفارش را با موفقیت انجام داد یا خیر.
تریگر چیست و در لاراول چگونه باید ازش استفاده کرد
تریگر (یا رهانا) در sql باعث میشه ما رویه جدولی که میخواهیم نظارت کنیم و اکشنی در قبال رخدادی که روی جدول ما اتفاق میوفته رو مدیریت کنیم مثلا جدولی ساختیم که با x رابطه داره ولی از نوع foreign key تعریف نشده ! من در صورتی که میخوام اطلاعات سمت راست رابطه رو تریگر (Trigger) چیست؟ هم حذف کنم مجبورم یا از کد sql استفاده کنم یا از کد php داخل لاراول وقتی ما میخواهیم از php استفاده کنیم باید از model event استفاده کنیم و خودمونو در گیر مسائل دیتابیس نکنیم . ولی لاراول این امکان رو میده من تو migration ها هم تریگر بسازم که چیز جالبیه و در ادامه میگم
خوب برای شروع ساخت تریگر در دیتابیس ما باید با سینتکسش آشنا بشیم
در نمونه کد بالا ما حالتی که قرار اتفاق بیوفته و نظارت کنیم داخل براکت نوشته شده ولی اینجا ما باید با چند مفهوم اصلی اشنا بشیم :
- OLD : همونطور که از اسمش معلومه مقدار گذشته فیلد رو هدف قرار میده زمانی به کار ما میاد که میخواهیم یه ستون رو آپدیت کنیم و یا حذف کنیم و در بعضی مواقع ما میخواهیم بر اساس فیلدی جدولی بسازیم
- NEW : زمانی که ستونی اپدیت میشه ! در حقیقت دو مقدار قدیمی و جدید وجود داره New به مقدار جدید اشاره میکنه
برای مثال ما میخواهیم جدول users رو هدف بگیریم و افرادی که حذف شدن رو مشخصات mobile رو در جدولی لاگ بگیریم به راجتی ما میتوانیم این کار رو انجام بدیم :
در کد بالا با دو مفهوم جدید اشتا دارید میشید BEGIN , END دقیقا شبیه براکت ها در زبان برنامه نویسی باعث ساخت یک بلاک میشوند
ولی ما باید زمانی ازشون استفاده کنیم که چندین خط کد داشته باشیم. در کد ما حلقه ای ساختیم تا رکورد ها رو تغییر روشون اعمال شد پیشمایش کنه پس کد اصلا ما اینطوری میش ولی باید داخل براکت خودمون این رکورد های حذف شده رو تو جدول دیگه ای بنویسیم برای
پس در کد بالاما وقتی که سطری رو از جدول users پاک میکنیم مشخصات username,email,mobile به جدول لاگ فرستاده میشود و در اونجا ذخیره میشه !
یه مثال از new میخوام بزنم : یه تریگر برای من بساز زمانی که کاربر مقدار username شو تغییر username قبلی , جدیدشو داخل جدول لاگ ذخیره کن ؟
پس الان ما تونستیم لاگ اطلاعات کاربر رو بگیریم و برای حذف تریگر هم ما میتونیم از کد زیر استفاده کنیم
ولی قضیه در لاراول فرق میکنه ! ما میتونیم خیلی راحت از model event استفاده کنیم یا یک مایگریت جدید بسازیم !
برای model event داکیومنت پر بار لاراول بهتر توضیح داده ولی من قسمت ساخت مایگریشن رو میگم برای ساخت تریگیر باید دستور زیر رو داخل کنسول بزنید
و بعد مایگریت کنید تا به دیتابیس اضافه بشه
و بعد فایل مایگریشن رو باز کنید ولی ما درمتد up , down باید چی وارد کنیم ؟!
خوب از اونجایی که لااورل توانایی ساخت تریگر رو به وسیله کلاس blueprint به ما نداده پس ما باید از کلاس DB استفاده کنیم ! پس ما در متد up باید بنویسیم
پس ما کد SQL خودمونو به متد unprepared اضافه میکنیم همین کار رو باید متد down انجام بدیم تا تریگر رو موقع حذف کنیم .
دیدگاه شما