ما هو Pine Script باختصار
Pine Script هي لغة TradingView المخصصة لكتابة مؤشرات واستراتيجيات فنية مخصصة تعمل داخل محرك الرسم البياني لـ TradingView. إنها ليست لغة برمجة متعددة الأغراض — كل سكريبت يُنفّذ مرة واحدة لكل شمعة عبر تاريخ الرسم البياني، مع إدارة الحالة ضمنياً من خلال سلسلة الشموع. إذا لم تستخدمها من قبل، فإن النموذج الذهني يستغرق حوالي يوم واحد؛ أما العقبات فتستغرق حوالي عام.
الإصدار 6، الصادر في 2025، هو الإصدار الإنتاجي الحالي. الإصدارات 4 و5 لا تزال تعمل لكنها لم تعد الافتراضية للسكريبتات الجديدة.
البدء — سكريبت v6 الأول لك
كل Pine Script يبدأ بتوجيه الإصدار في السطر 1. لإنشاء مؤشر v6:
//@version=6
indicator("My First v6 Indicator", overlay=true)
// Plot the close price as a line on the chart
plot(close, color=color.new(color.aqua, 0), linewidth=2)
احفظ هذا في محرر Pine على TradingView وأضفه إلى الرسم البياني. ستشاهد سعر الإغلاق مرسوماً كخط سماوي. ثلاثة أمور يجب ملاحظتها: //@version=6 التوجيه إلزامي ويجب أن يكون السطر الأول غير الفارغ؛ indicator() هو التصريح الذي يحدد ما إذا كان السكريبت الخاص بك مؤشراً (متراكب أو في لوحة منفصلة) أو استراتيجية (مع صفقات محاكاة)؛ و overlay=true يعني أن السكريبت يُرسم فوق الرسم البياني للسعر بدلاً من لوحة منفصلة أسفله.
ما الذي تغير من v5 إلى v6
1. نظام أنواع أكثر صرامة
التغيير الأكبر على الإطلاق. v6 يفرض فحص الأنواع الذي كان v5 يتجاهله أو يتعامل معه بصمت. الحالة الأكثر شيوعاً: v5 كان يسمح لك بتمرير series int حيث simple int كان متوقعاً وتخفيضه بصمت. v6 سيرمي خطأ عند وقت التجميع.
النتيجة العملية: عند ترحيل سكريبت v5 ولا يعمل فجأة، الخطأ يكون دائماً تقريباً عدم تطابق في نوع متغير دالة ما. الحل عادة هو تغليف القيمة في int(), float()، أو استخدم الدالة المدمجة المناسبة لتحويل الأنواع بشكل صريح.
2. أداء أسرع في وقت التشغيل
v6 قدم تحسينات المُجمّع التي تحسن بشكل ملموس سرعة التنفيذ لمعظم السكريبتات. التحسينات أكثر وضوحاً في السكريبتات ذات request.security() الاستخدام (التحليل متعدد الأطر الزمنية)، معالجة المصفوفات، أو عمليات المصفوفات. السكريبتات البسيطة للرسم والتلوين لن ترى فرقاً ملحوظاً.
3. تحسين request.security() السلوك
الدالة لطلب البيانات من إطار زمني مختلف حصلت على معالجة أنظف للمتغيرات وحماية أفضل ضد خطأ "التحيز المستقبلي" التاريخي. الخطأ الكلاسيكي في v4/v5 — استخدام lookahead=barmerge.lookahead_on دون فهم العواقب — الآن يُطلق تحذيراً أوضح عند نشر السكريبت.
4. دوال مدمجة جديدة
العديد من الدوال المساعدة التي كانت تتطلب سابقاً تنفيذاً يدوياً أصبحت الآن مدمجة. الإضافات البارزة: تحسين تنسيق النصوص، تقطيع أفضل للمصفوفات، ودوال ملائمة على نوع المصفوفة تقلل الكود الزائد.
الأنماط المهمة لمؤشرات SMC
إذا كنت تكتب مؤشرات مفاهيم الأموال الذكية (بلوكات الأوامر، FVG، كشف BOS، مسحات السيولة)، فإن ثلاثة أنماط Pine Script تظهر باستمرار. أتقن هذه الأنماط وستتمكن من بناء معظم ما هو موجود في مجموعات SMC التجارية.
النمط 1: اكتشاف القمم والقيعان المتأرجحة
أساس كل مؤشر لهيكل السوق. استخدم ta.pivothigh() و ta.pivotlow() مع نافذة شموع يسار/يمين:
//@version=6
indicator("Swing Detection", overlay=true)
length = input.int(5, "Pivot Length", minval=1)
ph = ta.pivothigh(high, length, length)
pl = ta.pivotlow(low, length, length)
// Plot circles at confirmed swing points
plotshape(not na(ph), location=location.abovebar,
style=shape.circle, color=color.red, size=size.tiny)
plotshape(not na(pl), location=location.belowbar,
style=shape.circle, color=color.green, size=size.tiny)
ملاحظة: يتم تأكيد النقاط المحورية length شموع بعد تشكلها. هذا تأكيد لا يُعاد رسمه — بمجرد طباعته، لا يتحرك المحور. المقايضة هنا هي التأخير: تعرف فقط أن المحور موجود بعد 5 شموع لاحقة (مع length=5).
النمط 2: رسم المناطق (مربعات لبلوكات الأوامر و FVGs)
استخدم box.new() مدمج لرسم المستطيلات. يمكن تحديث الصناديق، أو تمديدها لليمين مع طباعة شموع جديدة، أو حذفها عند إبطالها:
//@version=6
indicator("Bullish FVG Detector", overlay=true, max_boxes_count=500)
// Bullish FVG: low of current bar > high of bar 2 ago
fvg_top = low
fvg_bot = high[2]
isFVG = fvg_top > fvg_bot
if isFVG
box.new(left=bar_index[2], top=fvg_top, right=bar_index, bottom=fvg_bot,
bgcolor=color.new(color.green, 80),
border_color=color.new(color.green, 50))
أمران يصطدم بهما المطورون لأول مرة. أولاً، max_boxes_count افتراضياً يساوي 50 — ارفعه لأي مؤشر يرسم مناطق عبر سجلات طويلة. ثانياً، تُرسم الصناديق عند وقت التجميع لكل شمعة؛ إذا رسمت مربعاً على كل شمعة بدون منطق شرطي، ستستنفد الحد بسرعة.
النمط 3: تتبع الحالة عبر الشموع (الـ var الكلمة المفتاحية)
Pine Script يُنفّذ الكود مرة واحدة لكل شمعة، لكنك غالباً ما تحتاج إلى حالة مستمرة. الـ var الكلمة المفتاحية تعلن عن متغير يتم تهيئته مرة واحدة ويستمر عبر تنفيذات الشموع:
//@version=6
indicator("BOS Tracker", overlay=true)
// Persistent state: track the last confirmed swing high
var float lastSwingHigh = na
// Update when a new pivot high is confirmed
ph = ta.pivothigh(high, 5, 5)
if not na(ph)
lastSwingHigh := ph
// Detect BOS: close above the last swing high
isBOS = not na(lastSwingHigh) and close > lastSwingHigh
if isBOS
label.new(bar_index, high, "BOS",
color=color.new(color.green, 0), textcolor=color.white)
بدون var، سيتم إعادة تعيين المتغير في كل شمعة. مع var، تبقى القيمة محفوظة. هذا هو النمط الأساسي لأي مؤشر يحتاج إلى ذاكرة للأحداث السابقة — كل كاشف BOS، كاشف MSS، متتبع التخفيف، ونظام تقدم عمر بلوك الأوامر يستخدم هذا النمط بالأسفل.
الأخطاء الشائعة التي تواجه المطورين لأول مرة
lookahead=barmerge.lookahead_on في request.security() استدعاءات أو استخدام تركيبات تطلعية مثل ta.pivothigh() دون حساب تأخير تأكيد الشمعة. إذا بدت إشارات مؤشرك مثالية على البيانات التاريخية، فاشتبه بإعادة الرسم أولاً.
format.mintick لتسميات الأسعار. الدقة العشرية الثابتة تتعطل عند تطبيق الكود على أدوات ذات أحجام علامات مختلفة (BTC مقابل EURUSD مقابل ES). استخدم str.tostring(price, format.mintick) لأي سعر يُعرض في التسميات أو التنبيهات.
max_lines_count, max_boxes_count، إلخ في indicator() التصريح بشكل صريح عندما تحتاج إلى المزيد.
= للتعيين الأول و := لإعادة التعيين. x = 5 في موضعين ينشئ متغيرين محليين. x := 5 يعيد تعيين متغير موجود. اخلط بينهما وستقضي ساعة في تصحيح قيم لن تتحدث.
النشر على TradingView
بمجرد أن يعمل السكريبت، يمكنك نشره في المكتبة العامة لـ TradingView — إما كمصدر مفتوح (يمكن لأي شخص قراءة ونسخ الكود) أو بدعوة فقط (أنت تتحكم في الوصول). كلا الخيارين يصل إلى قاعدة مستخدمي TradingView؛ المنشورات مفتوحة المصدر تُراجع وفقاً لقواعد المنصة وتُصنّف في قائمة اختيارات المحررين إذا كانت الجودة عالية.
ثلاثة قواعد أساسية تواجه المؤلفين الجدد غالباً: لا تضمّن روابط ترويجية خارجية في عناوين أو أوصاف السكريبت، لا تستخدم تقنيات إعادة الرسم دون الإفصاح عنها، ولا تشير إلى علامتك التجارية داخل مخرجات الرسم البياني (بدون شعارات، بدون علامات مائية). القاعدتان الأوليان تقنيتان؛ الثالثة تنفيذية وتعثر الناشرين التجاريين بانتظام.
الأسئلة الشائعة
هل أحتاج إلى ترحيل أكواد v5 الخاصة بي إلى v6؟
أكواد v5 الحالية تستمر في العمل على TradingView إلى أجل غير مسمى — لا يوجد إيقاف إجباري. يُنصح بالترحيل فقط عندما تحتاج إلى ميزة خاصة بـ v6 (نظام أنواع محسّن، أداء أفضل، دوال مدمجة جديدة) أو عند بدء كود جديد من الصفر. بالنسبة للمؤشرات المنشورة، نادراً ما تستحق تكلفة الترحيل الفائدة إلا إذا كنت تقوم بصيانة الكود بشكل نشط.
ما هو أكبر تغيير جذري في Pine Script v6؟
نظام الأنواع المُحكَم. v6 يفرض فحصاً أشد صرامة للأنواع — التحويلات الضمنية التي كانت تعمل بصمت في v5 ستُصدر الآن أخطاء. مشكلة الترحيل الأكثر شيوعاً هي عدم تطابق أنواع series مقابل simple في متغيرات الدوال التي لم تكن تُكتشف سابقاً.
هل Pine Script v6 أسرع من v5؟
نعم، في المتوسط. يقوم مُجمّع v6 بتحسينات أكثر فعالية ولديه وقت تنفيذ أسرع لمعظم الأنماط الشائعة. يكون التحسن ملحوظاً بشكل خاص في السكريبتات التي تتضمن معالجة كثيفة للمصفوفات أو العديد من request.security استدعاءات.
هل يمكنني استخدام v5 و v6 في نفس الكود؟
لا. يتم تحديد الإصدار في أعلى السكريبت (//@version=6 أو //@version=5) وينطبق على الكود بأكمله. لا يمكنك دمج الإصدارات داخل مؤشر أو استراتيجية واحدة.
أين يمكنني نشر مؤشرات Pine Script v6؟
مكتبة TradingView العامة تقبل سكريبتات v5 وv6. السكريبتات مفتوحة المصدر تُراجع من قبل مشرفي TradingView وفقاً للقواعد الأساسية — نفس القواعد تنطبق بغض النظر عن الإصدار. السكريبتات مغلقة المصدر (بالدعوة فقط) تخضع لمراجعة أقل لكن لا يمكن الترويج لها في المكتبة العامة.
شاهد مؤشرات v6 الإنتاجية أثناء العمل
محرك Neural Confluence المجاني من Quantum Algo ومجموعة Zeno الكاملة مكتوبان بلغة Pine Script v6. السكريبت المجاني مفتوح المصدر — استنسخه، ادرسه، عدّله كمرجع تعليمي.
عرض على TradingView →