# Deepwick Script

Deepwick Script هي لغة الرسوم البيانية والاختبارات بأثر رجعي في Deepwick. وهي
**مجموعة فرعية من Pine Script v5/v6**: معظم استدعاءات `ta.*` و`math.*` و`str.*`
و`array.*` و`map.*` و`input.*` و`plot*` و`strategy.*` تعمل تماماً كما في Pine.
وDeepwick ليست تابعة لـ TradingView؛ وPine Script علامة تجارية لشركة TradingView, Inc.

ويُنفَّذ السكربت مرة واحدة لكل شمعة، من الأقدم إلى الأحدث، ويحتفظ كل متغيّر بسجلّه:
نفس دلالة السلاسل كما في Pine.

## القواعد المهمة عند توليد الشيفرة

- **راجع قائمة غير المدعوم قبل أن تكتب.** استدعاء غير مدعوم هو أغلى خطأ هنا: معظمها تُترجَم وتُرجع `na` بصمت، فقد يبدو السكربت صحيحاً ولا يرسم شيئاً.
- **`request.security()` تعمل لإطار زمني أكبر من الرمز نفسه الموجود في الشارت.** `request.security(syminfo.tickerid, "240", close)` تعطي آخر إغلاق *مُغلق* لأربع ساعات، وقد يكون التعبير استدعاءً لـ `ta.*`. أما الرمز **الآخر** فيُرجع `na`: فالمحرك لا يملك إلا شموع الشارت، ولن يذهب ويجلب رمزاً آخر.
- **لا نظر إلى المستقبل.** لا يملأ وسيط الاختبار بأثر رجعي أي أمر ببيانات من المستقبل: فطلبات السوق تُملأ عند *افتتاح الشمعة التالية*.
- **التكاليف حقيقية.** كل تنفيذ يدفع عمولة وانزلاقاً كما هو معلَن في `strategy()`. واستراتيجية مربحة بلا تكاليف قد تخسر مع التكاليف.
- **أوامر الوقف والحدّ تتبع الشمعة**، بالترتيب: الافتتاح، الطرف الأقرب إلى الافتتاح، الطرف الآخر، الإغلاق. والأمر الذي تجاوزه السعر بفجوة يُملأ عند الافتتاح.
- **يُعلَن بـ `=`، ويُسند من جديد بـ `:=`.** استخدم `var` للحالة التي يجب أن تبقى بين الشموع.
- **المسافة البادئة أربعة أحرف مسافات.** لا أقواس في Pine؛ وأجسام الدوال `if`/`for`/`while`/`switch` كتلٌ بمسافة بادئة.
- **الوسائط المسماة تذهب في النهاية.** بمجرد أن تكتب `name=` يجب أن تكون بقية الوسائط مسماة أيضاً: `plotshape(series=x, title="t", style=shape.circle)` صالح، أما `plotshape(x, "t", style=…)` فلا. وخلط وسائط موضعية بعد وسائط مسماة يوقف السكربت بخطأ نحوي.
- **لا يمكن لِخروجٍ أن يُطلق على الشمعة التي أصدرته.** يُملأ `strategy.entry` عند *افتتاح الشمعة التالية*، فلا يمكن لـ `strategy.exit` مكتوب على تلك الشمعة أن يُملأ إلا من الشمعة التالية فصاعداً. والسعر الذي انخفض تحت وقف الخسارة أصلاً في الشمعة التي أصدرته لا يُملأ ضدك.
- **الخروج ذو الساقين يُطلق مرة واحدة.** حين تُملأ إحدى ساقَي `strategy.exit(stop=…, limit=…)` تُلغى الأخرى معها: صفقة واحدة، لا اثنتان. وإذا بلغت الشمعة المستويين معاً، فالفائز هو الذي بلغه أول مسار الشمعة.
- **أوقف التتبّع:** `strategy.exit(trail_points=N, trail_offset=M)`. كلاهما بالتكات، لا بوحدات السعر. و`trail_offset` هو الربح الذي يجب أن يُمسح قبل أن يعمل الوقف، و`trail_points` هو المسافة المحفوظة من أفضل سعر وصل إليه السعر. ولا يتحرّك الوقف إلا في صالحك، ولا يتحرّك إلا على شموع مُغلَقة.

## مرجع الدوال

التوقيعات وما تفعله كل دالة. الوسائط بالترتيب الذي تكتبها به.

### اللغة

يشغّل Deepwick Script مجموعة فرعية من Pine Script، منها الأنواع التي تعداد (enums) والأنواع التي يعرّفها المستخدم والأساليب وmap؛ ولا يُتحقَّق من سطر //@version. ويُنفَّذ السكربت مرة واحدة لكل شمعة، من الأقدم إلى الأحدث، ويحتفظ كل متغيّر بسجلّه.

- `x = expr / x := expr` — يُعلن متغيّراً ثم يُسند إليه من جديد بـ :=. ويمكن أن يسبق الاسم نوع اختياري (int، float، bool، string، color، series، simple، const، line، label).
- `var / varip` — يُهيَّأ مرة واحدة على الشمعة الأولى ويبقى أثره في الشموع التالية. وسلوك varip هو سلوك var، لأن السكربتات تعمل على شموع مغلقة.
- `x[n]` — معامل التاريخ: قيمة x قبل n شمعة (na قبل الشمعة الأولى).
- `if / else` — كتل شرطية، بمسافة بادئة أربعة أحرف مسافات. ويمكن استخدام if تعبيراً أيضاً.
- `cond ? a : b` — عامل الشرط الثلاثي.
- `switch` — تفرّع متعدّد الفروع، مع قيمة للمقارنة أو بدونها.
- `for i = a to b [by step]` — حلقة بعدّاد. كل من break وcontinue مدعوم.
- `while cond` — حلقة ما دام الشرط قائم.
- `f(x, y) => expr` — دالة يعرّفها المستخدم، في سطر واحد أو ككتلة بمسافة بادئة يُرجَع فيها آخر تعبير. ولكل موضع استدعاء حالته الخاصة من ta.*، كما في Pine.
- `[a, b] = f()` — الأزواج (tuples): يمكن للدوال أن تُرجع عدّة قيم، وكذلك الدوال المدمجة مثل ta.macd() وta.bb().
- `and / or / not` — العوامل المنطقية. الحساب: + - * / %؛ المقارنة: == != < <= > >=.

### الإعلانات

- `indicator(title, shorttitle, overlay, precision)` (study) — يُعلن مؤشراً: يرسم على الشارت ولا شيء فيه يُختبَر. وقُبل study() اسماً بديلاً.
- `strategy(title, overlay, initial_capital, default_qty_type, default_qty_value, commission_type, commission_value, slippage, pyramiding)` — يُعلن استراتيجية. القيم الافتراضية: initial_capital 100000، عقد واحد لكل أمر، عمولة 0، انزلاق 0 تكة، pyramiding 1. وتُتجاهل الوسائط الأخرى مثل process_orders_on_close.

### المدخلات

تظهر المدخلات بجوار المحرّر وفي إعدادات المؤشّر، فتغيّرها دون المساس بالكود.

- `input.int(defval, title, minval, maxval, step)` — عدد صحيح.
- `input.float(defval, title, minval, maxval, step)` — عدد عشري.
- `input.bool(defval, title)` — مربّع اختيار.
- `input.string(defval, title, options)` — نص، أو قائمة خيارات.
- `input.session(defval, title)` — جلسة تداول مثل "0930-1600"، أو أيام مثل "23456". تُمرَّر إلى session.ismarket() وإلى بقية أحكام session.*.
- `input.source(defval, title)` — مصدر سعر: open أو high أو low أو close أو hl2 أو hlc3 أو ohlc4 أو hlcc4.
- `input.color(defval, title)` — منتقي اللون.
- `input(defval, title)` — مدخل عام؛نوعه يتبع القيمة الافتراضية.

### بيانات الشمعة والوقت

الأوقات بمللي ثانية بتوقيت UTC. وتقبل hour() ودوال الوقت الأخرى وقتاً اختيارياً؛ كما تقبل hour() منطقة زمنية من قائمة ثابتة من الإزاحات، من دون التوقيت الصيفي.

- `open, high, low, close, volume` (open, high, low, close, volume) — أسعار الشمعة الحالية وحجمها.
- `hl2, hlc3, ohlc4, hlcc4` (hl2, hlc3, ohlc4, hlcc4) — متوسطات الأسعار الشائعة.
- `bar_index, last_bar_index` (bar_index, last_bar_index) — رقم الشمعة الحالية (0 هي الأقدم) ورقم آخر شمعة.
- `time, time_close` (time, time_close) — وقت افتتاح الشمعة وإغلاقها. وكدوال — time("D")، time(timeframe.period, "0000-0900:23456", "UTC") — تعطي بداية (أو نهاية) الشمعة ذات الإطار الزمني الأكبر التي تحتوي هذه، أو na إذا كانت الشمعة خارج الجلسة. الجلسات: "HHMM-HHMM"، ومنها ما يمتد عبر الليل، ونوافذ مفصولة بفواصل، وأيام اختيارية بعد النقطتين (1 = الأحد … 7 = السبت)، و"24x7".
- `timeframe.change(timeframe)` — صحيح على أول شمعة من كل فترة جديدة، مثل timeframe.change("D") على أول شمعة من كل يوم (يبدأ الأسبوع يوم الاثنين).
- `timestamp(timezone?, year, month, day, hour, minute, second)` — وقت بمللي ثانية من أجزائه، أو من نص تاريخ: timestamp("2026-01-05T09:30:00Z").
- `dayofweek.sunday … dayofweek.saturday` (dayofweek.monday, dayofweek.tuesday, dayofweek.wednesday, dayofweek.thursday, dayofweek.friday, dayofweek.saturday) — ثوابت أيام تُقارن بـ dayofweek (1 … 7).
- `session.ismarket, isfirstbar, islastbar, ispremarket, ispostmarket` (session.ismarket, session.isfirstbar, session.islastbar, session.ispremarket, session.ispostmarket) — حالة الجلسة. الأسواق هنا تعمل على مدار الساعة، فكل شمعة تنتمي إلى جلسة التداول؛ وisfirstbar وislastbar يحدّدان أول وآخر شمعة في كل يوم بتوقيت UTC.
- `year, month, weekofyear, dayofmonth, dayofweek, hour, minute, second` (year, month, weekofyear, dayofmonth, dayofweek, hour, minute, second) — أجزاء التقويم من وقت الشمعة؛ ويمكن استدعاؤها بوقت أيضاً، مثل hour(time, "America/New_York"). وdayofweek: 1 = الأحد … 7 = السبت.
- `barstate.isfirst, islast, isnew, isconfirmed, ishistory, isrealtime` (barstate.isfirst, barstate.islast, barstate.isnew, barstate.isconfirmed, barstate.ishistory, barstate.isrealtime) — أين يقع السكربت في سجل الشموع.
- `timeframe.period, multiplier, isintraday, isdaily, isweekly, ismonthly` (timeframe.period, timeframe.multiplier, timeframe.isintraday, timeframe.isdaily, timeframe.isweekly, timeframe.ismonthly) — الإطار الزمني للشارت.
- `syminfo.ticker, tickerid, mintick, pointvalue` (syminfo.ticker, syminfo.tickerid, syminfo.mintick, syminfo.pointvalue) — رمز الشارت، وخطوة السعر فيه، وقيمة النقطة.

### التحليل الفني (ta.*)

يحتفظ كل موضع استدعاء بحالته الخاصة، كما في Pine: استدعاءان لـ ta.ema() على سطرين مختلفين هما متوسطان مستقلان. وتكون النتيجة na حتى تتوفّر شموع كافية.

- `ta.sma(source, length)` — المتوسط المتحرك البسيط.
- `ta.ema(source, length)` — المتوسط المتحرك الأسي.
- `ta.rma(source, length)` — متوسط ويلدر المتحرك، ويستخدمه RSI وATR.
- `ta.wma(source, length)` — المتوسط المتحرك المرجّح.
- `ta.vwma(source, length)` — المتوسط المتحرك المرجّح بالحجم.
- `ta.hma(source, length)` — متوسط هول المتحرك.
- `ta.linreg(source, length, offset)` — قيمة خط الانحدار الخطي.
- `ta.vwap(source)` — متوسط السعر المرجّح بالحجم، ويعاد ضبطه عند 00:00 UTC كل يوم.
- `ta.rsi(source, length)` — مؤشر القوة النسبية، من 0 إلى 100.
- `ta.macd(source, fastlen, slowlen, siglen)` — يُرجع [macd، signal، histogram].
- `ta.stoch(source, high, low, length)` — ستوكاستك %K، من 0 إلى 100.
- `ta.cci(source, length)` — مؤشر قناة السلع.
- `ta.mfi(series, length)` — مؤشر تدفّق الأموال.
- `ta.wpr(length)` — ويليامز %R، من -100 إلى 0.
- `ta.dmi(diLength, adxSmoothing)` — يُرجع [+DI، -DI، ADX].
- `ta.supertrend(factor, atrPeriod)` — يُرجع [supertrend، direction]؛ ويكون الاتجاه -1 في الاتجاه الصاعد و1 في الاتجاه الهابط.
- `ta.sar(start, inc, max)` — SAR المكافئ.
- `ta.mom(source, length)` — الزخم: المصدر ناقص المصدر قبل length شمعة.
- `ta.roc(source, length)` — معدل التغيّر، مئويةً.
- `ta.change(source, length)` — الفرق عن القيمة قبل length شمعة (1 افتراضياً).
- `ta.tr / ta.tr(handle_na)` — المدى الحقيقي.
- `ta.atr(length)` — متوسط المدى الحقيقي (ويلدر).
- `ta.bb(series, length, mult)` — نطاقات بولنجر: يُرجع [middle، upper، lower].
- `ta.bbw(series, length, mult)` — عرض نطاق بولنجر: (upper - lower) / middle.
- `ta.kc(series, length, mult)` — قنوات كيلتنر: يُرجع [middle، upper، lower]، مع متوسط متحرك أسي للمدى الحقيقي.
- `ta.stdev(source, length, biased)` — الانحراف المعياري.
- `ta.variance(source, length, biased)` — التباين.
- `ta.dev(source, length)` — متوسط الانحراف المطلق.
- `ta.median(source, length)` — الوسيط.
- `ta.highest(source, length) / ta.highest(length)` — أعلى قيمة على آخر length شمعة (الـ high افتراضياً).
- `ta.lowest(source, length) / ta.lowest(length)` — أدنى قيمة على آخر length شمعة (الـ low افتراضياً).
- `ta.highestbars(source, length)` — الإزاحة عن أعلى قيمة: 0 أو سالبة.
- `ta.lowestbars(source, length)` — الإزاحة عن أدنى قيمة: 0 أو سالبة.
- `ta.rising(source, length)` — صحيح إذا كان المصدر فوق كل واحدة من قيمه السابقة وعددها length.
- `ta.falling(source, length)` — صحيح إذا كان المصدر تحت كل واحدة من قيمه السابقة وعددها length.
- `ta.crossover(source1, source2)` — صحيح على الشمعة التي يعبر فيها source1 فوق source2.
- `ta.crossunder(source1, source2)` — صحيح على الشمعة التي يعبر فيها source1 تحت source2.
- `ta.cross(source1, source2)` — صحيح عند أي تقاطع، في أي من الاتجاهين.
- `ta.pivothigh(source, leftbars, rightbars)` — سعر قمة المحور (pivot high)، يُعرف بعد rightbars شمعة من المحور؛ وقبل ذلك na. والمصدر اختياري (الـ high افتراضياً).
- `ta.pivotlow(source, leftbars, rightbars)` — سعر قاع المحور (pivot low)، يُعرف بعد rightbars شمعة من المحور؛ وقبل ذلك na. والمصدر اختياري (الـ low افتراضياً).
- `ta.valuewhen(condition, source, occurrence)` — قيمة المصدر في أقرب شمعة كانت فيها الحالة صحيحة، وهي المرّة رقم occurrence من الأحدث.
- `ta.barssince(condition)` — عدد الشموع منذ أن كانت الحالة صحيحة آخر مرة.
- `ta.cum(source)` — المجموع التراكمي منذ الشمعة الأولى.

### الاستراتيجيات (strategy.*)

أوامر السوق تُنفَّذ عند افتتاح الشمعة التالية. وأوامر الوقف والحدّ تُنفَّذ على امتداد الشمعة: الافتتاح، ثم الطرف الأقرب إلى الافتتاح، ثم الطرف الآخر، ثم الإغلاق. وإذا تجاوز السعر الأمر بفجوة، نُفِّذ عند الافتتاح. وتُحتسب العمولة على كل تنفيذ؛ وينطبق الانزلاق على أوامر السوق والوقف.

- `strategy.entry(id, direction, qty, limit, stop, comment)` — يفتح مركزاً أو يزيده؛ وهو أمر سوق ما لم يُحدَّد limit أو stop.
- `strategy.order(id, direction, qty, limit, stop, comment)` — نفس وسائط strategy.entry().
- `strategy.exit(id, from_entry, qty_percent, profit, limit, loss, stop, trail_points, trail_offset, comment)` — جني الربح ووقف الخسارة ووقف التتبّع لدخول معيّن: الربح والخسارة بالتكات، وlimit وstop بالأسعار. وtrail_points هو المسافة بالتكات من أفضل سعر وصل إليه السعر؛ وtrail_offset هو الربح بالتكات الذي يجب أن يُمسح قبل أن يعمل الوقف التتبّعي. ولا يتحرّك الوقف إلا في صالحك، ولا يتحرّك إلا على شموع مُغلَقة، فلا تستطيع شمعة أبداً أن تنفّذ الوقف الذي وضعه قمّها هي.
- `strategy.close(id, comment, qty_percent)` — يغلق دخولاً بالسوق في الشمعة التالية.
- `strategy.close_all(comment)` — يغلق كل المراكز المفتوحة.
- `strategy.cancel(id) / strategy.cancel_all()` (strategy.cancel_all) — يلغي الأوامر المعلّقة.
- `strategy.position_size, position_avg_price` (strategy.position_size, strategy.position_avg_price) — المركز الحالي (موجب للشراء، سالب للبيع) ومتوسط سعره.
- `strategy.opentrades.entry_bar_index(n), entry_price, entry_time, entry_id, size, profit, commission, max_runup, max_drawdown` (strategy.opentrades.entry_price, strategy.opentrades.entry_time, strategy.opentrades.entry_id, strategy.opentrades.size, strategy.opentrades.profit, strategy.opentrades.commission, strategy.opentrades.max_runup, strategy.opentrades.max_drawdown) — تفاصيل الصفقة المفتوحة رقم n (0 هي الأقدم)؛ وna إن لم توجد. وsize سالب في صفقات البيع. مثلاً للخروج بعد 10 شموع: bar_index - strategy.opentrades.entry_bar_index(0) >= 10.
- `strategy.closedtrades.entry_bar_index(n), exit_bar_index, entry_price, exit_price, entry_time, exit_time, entry_id, size, profit, commission, max_runup, max_drawdown` (strategy.closedtrades.exit_bar_index, strategy.closedtrades.entry_price, strategy.closedtrades.exit_price, strategy.closedtrades.entry_time, strategy.closedtrades.exit_time, strategy.closedtrades.entry_id, strategy.closedtrades.size, strategy.closedtrades.profit, strategy.closedtrades.commission, strategy.closedtrades.max_runup, strategy.closedtrades.max_drawdown) — تفاصيل الصفقة المغلقة رقم n (0 هي الأقدم؛ والأخيرة هي strategy.closedtrades - 1).
- `strategy.equity, netprofit, openprofit, grossprofit, grossloss, initial_capital` (strategy.equity, strategy.netprofit, strategy.openprofit, strategy.grossprofit, strategy.grossloss, strategy.initial_capital) — أرقام الحساب.
- `strategy.closedtrades, opentrades, wintrades, losstrades` (strategy.closedtrades, strategy.opentrades, strategy.wintrades, strategy.losstrades) — عدد الصفقات.
- `strategy.long, strategy.short` (strategy.long, strategy.short) — الاتجاهات.
- `strategy.fixed, strategy.cash, strategy.percent_of_equity` (strategy.fixed, strategy.cash, strategy.percent_of_equity) — قيم default_qty_type.
- `strategy.commission.percent, cash_per_order, cash_per_contract` (strategy.commission.percent, strategy.commission.cash_per_order, strategy.commission.cash_per_contract) — قيم commission_type.

### الرسوم والتنبيهات

- `plot(series, title, color, linewidth, style)` — يرسم سلسلة على الشارت أو في لوحة منفصلة.
- `plotshape(series, title, style, location, color, text)` — يرسم شكلاً على الشموع التي تكون فيها series صحيحة.
- `plotchar(series, title, char, location, color)` — يرسم حرفاً على الشموع التي تكون فيها series صحيحة.
- `hline(price, title, color, linestyle)` — خط أفقي عند مستوى ثابت.
- `fill(plot1, plot2, color)` — يملأ بين رسومين أو بين خطي hline.
- `bgcolor(color)` — يلوّن خلفية الشمعة.
- `barcolor(color)` — يلوّن الشمعة نفسها.
- `alertcondition(condition, title, message)` — يعلن شرطاً يمكنك تحويله إلى تنبيه بالبريد أو Telegram أو Discord أو webhook.
- `plot.style_*` (plot.style_line, plot.style_linebr, plot.style_stepline, plot.style_histogram, plot.style_columns, plot.style_circles, plot.style_cross, plot.style_area) — line، linebr، stepline، histogram، columns، circles، cross، area.
- `hline.style_*` (hline.style_solid, hline.style_dashed, hline.style_dotted) — solid، dashed، dotted.
- `shape.*` (shape.triangleup, shape.triangledown, shape.arrowup, shape.arrowdown, shape.circle, shape.xcross, shape.cross, shape.diamond, shape.square, shape.flag, shape.labelup, shape.labeldown) — triangleup, triangledown, arrowup, arrowdown, circle, xcross, cross, diamond, square, flag, labelup, labeldown.
- `location.*` (location.abovebar, location.belowbar, location.top, location.bottom, location.absolute) — abovebar، belowbar، top، bottom، absolute.
- `size.*` (size.auto, size.tiny, size.small, size.normal, size.large, size.huge) — auto، tiny، small، normal، large، huge. مقبولة، لكن الأشكال تُرسم بحجم واحد.

### الخطوط والمربعات

- `line.new(x1, y1, x2, y2, extend, color, style, width)` — يرسم خطاً بين رقمَي شمعة وسعرين؛ ويُرجع مُعرّفه.
- `line.set_x1, set_y1, set_x2, set_y2, set_xy1, set_xy2, set_color, set_style, set_width` (line.set_x1, line.set_y1, line.set_x2, line.set_y2, line.set_xy1, line.set_xy2, line.set_color, line.set_style, line.set_width) — يغيّر خطاً.
- `line.delete(id)` — يحذف خطاً.
- `box.new(left, top, right, bottom, border_color, bgcolor, extend)` — يرسم مستطيلاً؛ ويُرجع مُعرّفه.
- `box.set_left, set_top, set_right, set_bottom, set_bgcolor, set_border_color, set_extend` (box.set_left, box.set_top, box.set_right, box.set_bottom, box.set_bgcolor, box.set_border_color, box.set_extend) — يغيّر مربعاً.
- `box.delete(id)` — يحذف مربعاً.
- `line.style_*, box.style_*` (line.style_solid, line.style_dashed, line.style_dotted, box.style_solid, box.style_dashed, box.style_dotted) — solid، dashed، dotted.
- `extend.*` (extend.none, extend.left, extend.right, extend.both) — none، left، right، both.

### الرياضيات والنصوص والألوان

- `math.abs, ceil, floor, round(number, precision), sign, sqrt, exp, log, log10, pow(base, exponent)` (math.abs, math.ceil, math.floor, math.round, math.sign, math.sqrt, math.exp, math.log, math.log10, math.pow) — الحساب.
- `math.max(...), math.min(...), math.avg(...)` (math.min, math.avg) — لأي عدد من القيم.
- `math.sum(source, length)` — المجموع على آخر length شمعة.
- `math.pi, math.e` (math.pi, math.e) — الثوابت.
- `na, na(x), nz(x, replacement), fixnan(x)` (na, nz, fixnan) — القيمة المفقودة، واختبارها، وبديلها، وآخر قيمة ليست na.
- `int(x), float(x), bool(x)` (float, bool) — التحويلات.
- `str.tostring(value, format), str.format(text, ...), str.length(s), str.contains(s, part)` (str.format, str.length, str.contains) — النصوص. يستبدل str.format ‎{0} و{1}… بالوسائط.
- `color.new(color, transp), color.rgb(red, green, blue, transp)` (color.rgb) — يبني لوناً؛ والشفافية من 0 إلى 100.
- `color.*` (color.red, color.green, color.blue, color.orange, color.yellow, color.purple, color.aqua, color.lime, color.fuchsia, color.teal, color.maroon, color.navy, color.olive, color.gray, color.silver, color.white, color.black) — red, green, blue, orange, yellow, purple, aqua, lime, fuchsia, teal, maroon, navy, olive, gray, silver, white, black.

### المصفوفات (array.*)

- `array.new_float, new_int, new_bool, new_string, new_color, new_line, new_box, new_label, new_table(size)` (array.new_float, array.new_int, array.new_bool, array.new_string, array.new_color, array.new_line, array.new_box, array.new_label, array.new_table) — ينشئ مصفوفة.
- `array.get, set, insert, push, pop, shift, unshift` (array.get, array.set, array.insert, array.push, array.pop, array.shift, array.unshift) — يقرأ العناصر ويغيّرها.
- `array.size, first, last, sum, avg, min, max, stdev` (array.size, array.first, array.last, array.sum, array.avg, array.min, array.max, array.stdev) — الحجم والإحصاءات.

### الـ maps والأنواع التي يعرّفها المستخدم

الأنواع التي يعرّفها المستخدم ومجموعة `map.<fn>` مدعومان. وكلاهما إعلان على المستوى الأعلى؛ وطرق النسخة على قيمة تُكتب بصيغة `obj.method(args...)`.

- `enum Name
    Member
    Member = N
    ...` — إعلان enum على المستوى الأعلى. والأعضاء الذين بلا قيمة يزدادون آلياً من 0؛ والقيم الصريحة قد تكون أرقاماً أو نصوصاً. ويُشار إليهم بـ `Name.Member` في أي موضع تعبير. وقيم enum أرقام (أو نصوص) عادية، فتصلح مع عوامل المقارنة ومع `int()` دون تحويل.
- `type Name
    field1
    field2: int
    field3 = default` — نوع يعرّفه المستخدم على المستوى الأعلى. تُكتب الحقول واحداً في كل سطر؛ وقُبلت أجزاء `: type` و`= default` للتوافق مع المستقبل لكنها لا تُتحقَّق بعد. ويُبنى بـ `Type.new(arg1, arg2, ...)` وتُقرأ حقوله بـ `instance.field`.
- `m = map.new<int, float>()` (map.new) — ينشئ map فارغاً. وتُقبل وسائط النوع `<K, V>` لكن تُتجاهل أثناء التشغيل.
- `m = map.put(m, key, value)` (map.put) — يضع مفتاحاً. ويُرجع الـ map بحيث يمكن ربط الاستدعاءات أو إعادة إسنادها.
- `v = map.get(m, key)` (map.get) — يقرأ قيمة. ويُرجع na إن كان المفتاح مفقوداً.
- `n = map.size(m)` (map.size) — عدد المدخلات.
- `keys = map.keys(m), values = map.values(m)` (map.keys, map.values) — يُرجع المفاتيح أو القيم كمصفوفة Pine (بترتيب الإدراج).
- `map.contains(m, key), map.remove(m, key)` (map.remove) — اختبار الانتماء والحذف. كلاهما يُرجع الـ map.

## غير متاح بعد

دالة لا يعرفها المحرك توقف السكربت بـ «Unknown function» مع رقم السطر والعمود.

- `label.new(), table.new()`: غير متاح بعد. أما الخطوط والمربعات فمتاحة.
- `import, matrix.*, array.new<type>()`: المكتبات والمصفوفات (matrices) والمصفوفات المُنمَّطة بمُنشئاتها لم تُنفَّذ بعد.
- `strategy.risk.*`: قواعد المخاطر (max_position_size، max_intraday_loss، max_drawdown، allow_entry_in) غير مدعومة. أما أوقف التتبّع في strategy.exit() فمدعومة: استعمل trail_points وtrail_offset.

## أمثلة قابلة للتشغيل

سكربتات مرفقة تُترجَم مقابل هذا المحرك:

**RSI Mean Reversion**

```pine
//@version=5
strategy("RSI Mean Reversion", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1)
len = input.int(14, "RSI length", minval=2)
oversold = input.float(30, "Oversold")
exitLevel = input.float(50, "Exit level")
stopPct = input.float(2, "Stop loss %", minval=0, step=0.1)
tpPct = input.float(6, "Take profit %", minval=0, step=0.1)
if strategy.position_size > 0
    strategy.exit("Risk", stop=stopPct > 0 ? strategy.position_avg_price * (1 - stopPct / 100) : na, limit=tpPct > 0 ? strategy.position_avg_price * (1 + tpPct / 100) : na)
r = ta.rsi(close, len)
if strategy.position_size == 0 and r < oversold
    strategy.entry("Long", strategy.long)
if strategy.position_size > 0 and r > exitLevel
    strategy.close("Long", comment="RSI exit")
plot(r, "RSI", color=color.purple)
hline(oversold, "Oversold", color=color.green)
hline(exitLevel, "Exit", color=color.gray)
```

**MACD Crossover**

```pine
//@version=5
strategy("MACD Crossover", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1)
fast = input.int(12, "Fast", minval=1)
slow = input.int(26, "Slow", minval=2)
sig = input.int(9, "Signal", minval=1)
stopPct = input.float(2, "Stop loss %", minval=0, step=0.1)
tpPct = input.float(6, "Take profit %", minval=0, step=0.1)
if strategy.position_size > 0
    strategy.exit("Risk", stop=stopPct > 0 ? strategy.position_avg_price * (1 - stopPct / 100) : na, limit=tpPct > 0 ? strategy.position_avg_price * (1 + tpPct / 100) : na)
[m, s, h] = ta.macd(close, fast, slow, sig)
if ta.crossover(m, s)
    strategy.entry("Long", strategy.long)
if ta.crossunder(m, s)
    strategy.close("Long", comment="MACD cross")
plot(h, "Histogram", color=h >= 0 ? color.new(color.green, 40) : color.new(color.red, 40), style=plot.style_columns)
plot(m, "MACD", color=color.orange)
plot(s, "Signal", color=color.blue)
```

**Bollinger Bounce**

```pine
//@version=5
strategy("Bollinger Bounce", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1)
len = input.int(20, "Length", minval=2)
mult = input.float(2, "StdDev", minval=0.5, step=0.1)
stopPct = input.float(2, "Stop loss %", minval=0, step=0.1)
tpPct = input.float(6, "Take profit %", minval=0, step=0.1)
if strategy.position_size > 0
    strategy.exit("Risk", stop=stopPct > 0 ? strategy.position_avg_price * (1 - stopPct / 100) : na, limit=tpPct > 0 ? strategy.position_avg_price * (1 + tpPct / 100) : na)
[basis, upper, lower] = ta.bb(close, len, mult)
if strategy.position_size == 0 and close <= lower
    strategy.entry("Long", strategy.long)
if strategy.position_size > 0 and close >= basis
    strategy.close("Long", comment="Back to mean")
u = plot(upper, "Upper", color=color.blue)
plot(basis, "Basis", color=color.gray)
l = plot(lower, "Lower", color=color.blue)
fill(u, l, color=color.new(color.blue, 92))
```

## Elsewhere

- Human reference: https://deepwick.com/ar/docs/script
- Try a script with no signup: https://deepwick.com/try
