كيفية دمج FXMacroData مع TradingView عن طريق Pine Script banner image

Implementation

How-To Guides

كيفية دمج FXMacroData مع TradingView عن طريق Pine Script

دليل خطوة بخطوة لتغطية إعلانات ماكرو FXMacroData ، ومعدلات السياسة ، وموقع COT على مخططات TradingView باستخدام مولد رمز Python و Pine Script v5.

متوفر أيضًا في English

يعد TradingView منصة الرسوم البيانية المفضلة لمعظم تجار الفوركس التجزئة ، و Pine Script هي اللغة التي تجلب مؤشرات مخصصة وإشارات استراتيجية إلى الحياة على هذه الرسيمات. التحدي هو أن Pine Script تعمل بالكامل داخل مربع الرمل في TradingVIEW لا يمكنها إجراء مكالمات HTTP خارجية إلى واجهات برمجة التطبيقات الخارجية في وقت التشغيل. يلبي هذا الدليل هذه الفجوة بتدفق عمل من جزأين: يجمع برنامج Python صغير بيانات الإعلان الكلي من FXMacroData ، ويولد رمز Pine Script جاهز لللصق ، ويتضمن المؤشر الناتج هذه النقاط البيانات مباشرة على الرسم البياني الخاص بك في Trading VIEW مع علامات الأحداث ، وخط إشارة ، وجدول بيانات ماكرو حية.

ما الذي ستبنيه

  • برنامج Python الذي يحصل على إعلانات سعر السياسة، مؤشر أسعار المستهلك، و PMI لأي عملة من FXMacroData و يولد رمز مصدر Pine Script تلقائيًا
  • مؤشر Pine Script v5 الذي يحدد تواريخ الأحداث الكبرى على الرسم البياني الخاص بك مع الماس الملصق، يرسم خط تداخل القيمة الكبرية ويظهر جدول البيانات تلخيص آخر العديد من الطبعات
  • تحذير من TradingView → جسر webhook الذي يرسل نقطة نهاية صغيرة في فلاسك كلما تم إطلاق شرط برنامج Pine Script الخاص بك ، مما يسمح لك بالرجوع إلى الإشارة مع سياق FXMacroData الجديد تلقائيًا

الشروط المسبقة

  • بايثون 3.10+ مع requests تم تركيبها
  • مفتاح FXMacroData API التسجيل في / اشترك؛ بيانات مؤشر الدولار الأمريكي مجانية بدون حاجة إلى مفتاح
  • حساب TradingView الدول المجانية تدعم Pine Script v5 والمؤشرات المخصصة
  • معرفة أساسية بكتابة الصنوبر ال (باين سكريبت) v5 تغطي المفاهيم الأساسية في أقل من ساعة

الخطوة الأولى

الخطوة 1 فهم نقطة نهاية إعلان FXMacroData

كل مؤشر في FXMacroData يتبع نفس شكل REST. طلب سعر سعر السياسة لـ EUR يبدو هكذا استخدم مفتاح API الخاص بك كمعلم استفسار:

curl "https://fxmacrodata.com/api/v1/announcements/eur/policy_rate?api_key=YOUR_API_KEY&start=2023-01-01"

استجابة JSON هي كائن مسطح مع data صف:

{
  "currency": "eur",
  "indicator": "policy_rate",
  "data": [
    {
      "date": "2025-03-06",
      "val": 2.65,
      "announcement_datetime": "2025-03-06T13:15:00Z"
    },
    {
      "date": "2025-01-30",
      "val": 2.90,
      "announcement_datetime": "2025-01-30T13:15:00Z"
    },
    {
      "date": "2024-12-12",
      "val": 3.15,
      "announcement_datetime": "2024-12-12T13:15:00Z"
    }
  ]
}

كل سجل يحمل date (سنة سنة سنة-ممم-د د تاريخ الإصدار المحلي) ، رقم valو UTC من المستوى الثاني announcement_datetimeالشكل المتسق عبر جميع العملات والمؤشرات هو ما يجعل مولد الرموز سهلاً في البناء. أسعار سعر العملة في اليورو واستكشاف كتالوج المؤشر لعملة الهدف الخاصة بك.


الخطوة الثانية

الخطوة 2 احضر بيانات الماكرو باستخدام Python

أنشئ ملفًا يدعى generate_pine.pyهذا البرنامج النصي يسترد بيانات الإعلان للعملة المختارة والمؤشر، ثم يسلسل النتائج إلى صفوف برنامج Pine Script التي تقوم لصقها في ملف المؤشر.

"""
generate_pine.py — fetch FXMacroData announcements and output Pine Script arrays.

Usage:
    python generate_pine.py --currency eur --indicator policy_rate --start 2023-01-01
"""
import argparse
import json
import os
from datetime import datetime, timezone

import requests

BASE_URL = "https://fxmacrodata.com/api/v1"
API_KEY = os.environ.get("FXMD_API_KEY", "")


def fetch_announcements(currency: str, indicator: str, start: str) -> list[dict]:
    url = f"{BASE_URL}/announcements/{currency}/{indicator}"
    params: dict = {"start": start}
    if API_KEY:
        params["api_key"] = API_KEY
    resp = requests.get(url, params=params, timeout=15)
    resp.raise_for_status()
    return resp.json().get("data", [])


def ts_to_pine_timestamp(iso_str: str) -> int:
    """Convert an ISO-8601 UTC string to a Unix timestamp (milliseconds for Pine)."""
    dt = datetime.fromisoformat(iso_str.replace("Z", "+00:00"))
    return int(dt.timestamp() * 1000)


def build_pine_arrays(records: list[dict]) -> str:
    """Render the data as Pine Script array literals."""
    ts_list = []
    val_list = []
    for r in records:
        ann = r.get("announcement_datetime") or f"{r['date']}T00:00:00Z"
        ts_list.append(str(ts_to_pine_timestamp(ann)))
        val_list.append(str(r["val"]))

    ts_str = ", ".join(ts_list)
    val_str = ", ".join(val_list)
    n = len(records)

    return f"""
// ── Auto-generated by generate_pine.py — do not edit manually ──
// Currency: {records[0].get('currency', '?').upper() if records else '?'}
// Indicator: {records[0].get('indicator', '?') if records else '?'}
// Records: {n}

var int[] _ann_ts  = array.from({ts_str})
var float[] _ann_val = array.from({val_str})
"""


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--currency", required=True)
    parser.add_argument("--indicator", required=True)
    parser.add_argument("--start", default="2023-01-01")
    args = parser.parse_args()

    print(f"Fetching {args.indicator} for {args.currency.upper()} from {args.start} …")
    records = fetch_announcements(args.currency, args.indicator, args.start)
    print(f"  {len(records)} records returned.")
    pine = build_pine_arrays(records)
    print(pine)

    output_file = f"pine_data_{args.currency}_{args.indicator}.txt"
    with open(output_file, "w") as f:
        f.write(pine)
    print(f"Arrays written to {output_file}")


if __name__ == "__main__":
    main()

احفظ مفتاح واجهة برمجة التطبيقات و اطلق النص:

export FXMD_API_KEY="YOUR_API_KEY"
python generate_pine.py --currency eur --indicator policy_rate --start 2023-01-01

الملف الخارجي pine_data_eur_policy_rate.txt سوف تحتوي على حرفيات صفوف النص النحاسي جاهزة للوقوع في المؤشر. يمكنك تشغيل النص نفسه لـ CPI (--indicator inflation), مؤشر مؤشرات المشتريات (--indicator pmi) أو أي مؤشر آخر من كتالوج FXMacroData.


الخطوة الثالثة

الخطوة 3 بناء مؤشر Pine Script

افتح TradingView، والتنقل إلى محرر النص الصنوبر (فايل "محرر الصنبور" في أسفل الرسم البياني) ، وملص المؤشر التالي. _ann_ts و _ann_val المصفوفات في الأعلى مع الناتج من الخطوة 2.

// @version=5
// FXMacroData Overlay — policy rate event markers + value line
// Replace the arrays below with output from generate_pine.py

indicator("FXMacroData Macro Overlay", overlay=true, max_labels_count=50, max_lines_count=50)

// ── User inputs ──
i_show_labels   = input.bool(true,  "Show event labels")
i_show_line     = input.bool(true,  "Show macro value line")
i_show_table    = input.bool(true,  "Show data table")
i_label_color   = input.color(color.new(color.orange, 0), "Label colour")
i_line_color    = input.color(color.new(color.orange, 30), "Line colour")

// ── Paste generated arrays here ──
// ---- BEGIN GENERATED SECTION ----
var int[]   _ann_ts  = array.from(1672531200000, 1675209600000, 1677628800000)
var float[] _ann_val = array.from(2.50, 2.65, 3.00)
// ---- END GENERATED SECTION ----

// ── Helper: find the most recent announcement value at or before this bar ──
f_current_val() =>
    float result = na
    int bar_t = time
    for i = 0 to array.size(_ann_ts) - 1
        if array.get(_ann_ts, i) <= bar_t
            result := array.get(_ann_val, i)
            break
    result

// ── Macro overlay line ──
float macro_val = f_current_val()
plot(i_show_line ? macro_val : na, title="Macro value", color=i_line_color,
     linewidth=2, style=plot.style_stepline)

// ── Event marker labels ──
if i_show_labels
    for i = 0 to array.size(_ann_ts) - 1
        int   ts  = array.get(_ann_ts, i)
        float val = array.get(_ann_val, i)
        if ts >= chart.left_visible_bar_time and ts <= chart.right_visible_bar_time
            label.new(
                x       = ts,
                y       = high * 1.002,
                text    = str.tostring(val, "#.##"),
                style   = label.style_diamond,
                color   = i_label_color,
                textcolor = color.white,
                size    = size.small,
                xloc    = xloc.bar_time
            )

// ── Summary table (top-right corner) ──
var table t = table.new(position.top_right, 2, 6,
    bgcolor       = color.new(color.navy, 85),
    border_width  = 1,
    border_color  = color.new(color.gray, 60))

if i_show_table and barstate.islast
    table.cell(t, 0, 0, "Date",  text_color=color.silver, text_size=size.small)
    table.cell(t, 1, 0, "Value", text_color=color.silver, text_size=size.small)
    int rows = math.min(5, array.size(_ann_ts))
    for i = 0 to rows - 1
        int   ts  = array.get(_ann_ts, i)
        float val = array.get(_ann_val, i)
        string date_str = str.format("{0,date,yyyy-MM-dd}", ts)
        table.cell(t, 0, i + 1, date_str, text_color=color.white, text_size=size.tiny)
        table.cell(t, 1, i + 1, str.tostring(val, "#.##"), text_color=color.orange, text_size=size.tiny)

لماذا ؟ stepline- لا ، لا

قيم مؤشر الكلي هي وظائف الخطوة لا تتداخل أسعار الفائدة بين الاجتماعات بسلاسة، بل تتسارع. plot.style_stepline يبقي التغطية صادقة: الحبل يبقى مستواها حتى يتم طباعة إعلان جديد، يطابق بالضبط البيانات المنشورة.

انقر إضافة إلى الرسم البياني. سيضع المؤشر خطًا خطيًا يطابق تقدم القيمة الكلية ويضع علامة ماسة ملصقة في كل تاريخ إعلان. قم بالتمرير مرة أخرى عبر التاريخ لمعرفة كيفية تحديد كل سعر سعر العملات المحدد مع حركة السعر على زوج العملات الذي اخترته.


الخطوة الرابعة

الخطوة 4 طبقة في مؤشرات متعددة

يخبر مؤشر واحد جزءًا من القصة. تأتي الحافة الحقيقية من طبقة معًا لمعدل السياسة ومؤشر أسعار المستهلك ومؤشرات التداول. كرر الخطوة 2 لكل مؤشر وإضافة قسم إضافي إلى Pine Script ، أو إنشاء ثلاثة مؤشرات منفصلة وتجميعها على نفس لوحة الرسم البياني.

للحصول على ثلاثة مؤشرات في مرة واحدة، وتوسيع النص بايثون:

INDICATORS = ["policy_rate", "inflation", "pmi"]
CURRENCY   = "eur"
START      = "2023-01-01"

for ind in INDICATORS:
    records = fetch_announcements(CURRENCY, ind, START)
    pine    = build_pine_arrays(records)
    with open(f"pine_data_{CURRENCY}_{ind}.txt", "w") as f:
        f.write(pine)
    print(f"Written pine_data_{CURRENCY}_{ind}.txt  ({len(records)} records)")

يمنحك كل ملف إخراج قسمًا متدفقًا لمؤشر Pine Script منفصل. أضف كل منهما إلى الرسم البياني الخاص بك وخصص لونًا متميزًا لكل مؤشر على سبيل المثال ، البرتقالي للسعر السياسي ، الأزرق لـ CPI ، والأخضر لـ PMI حتى تتمكن من رؤية النظام الكلي المعمول به في لمحة واحدة. يمكنك استكشاف جميع المؤشرات المتاحة لـ EUR من خلال ملفات مؤشر مؤشر أسهم المشتريات و كتالوج أكبر من المؤشرات.


الخطوة الخامسة

الخطوة 5 تلقائي التحديثات مع فحص تقويم الإصدار

تصبح بيانات الماكرو في صفوف Pine Script قديمة في اللحظة التي يتم فيها طباعة إعلان جديد. قم بتلقائي التجديد عن طريق الاتصال بنقطة نهاية تقويم الإصدار في FXMacroData قبل كل جلسة تداول للتحقق من ما إذا كان هناك أي شيء تم طباعته منذ آخر تجديد لك. إذا كان كذلك ، قم بإعادة تشغيل مولد وتحديث Pine Script الخاص بك.

"""
check_and_refresh.py — Re-generate Pine arrays if new announcements have printed.
Run this before each session, e.g. via cron or GitHub Actions.
"""
import subprocess
import requests
import os
from datetime import date, timedelta

BASE_URL = "https://fxmacrodata.com/api/v1"
API_KEY  = os.environ.get("FXMD_API_KEY", "")
PAIRS    = [
    ("eur", "policy_rate"),
    ("eur", "inflation"),
    ("eur", "pmi"),
]

def latest_release_date(currency: str, indicator: str) -> str | None:
    """Return the most recent announcement date for this indicator."""
    params: dict = {"start": str(date.today() - timedelta(days=7))}
    if API_KEY:
        params["api_key"] = API_KEY
    r = requests.get(
        f"{BASE_URL}/announcements/{currency}/{indicator}",
        params=params, timeout=10
    )
    r.raise_for_status()
    data = r.json().get("data", [])
    return data[0]["date"] if data else None

def refresh_all() -> None:
    for currency, indicator in PAIRS:
        latest = latest_release_date(currency, indicator)
        if latest and latest >= str(date.today() - timedelta(days=1)):
            print(f"New print detected: {currency.upper()} {indicator} on {latest}. Regenerating …")
            subprocess.run(
                ["python", "generate_pine.py",
                 "--currency", currency,
                 "--indicator", indicator,
                 "--start", "2023-01-01"],
                check=True,
            )
        else:
            print(f"{currency.upper()} {indicator}: no new prints since yesterday.")

if __name__ == "__main__":
    refresh_all()

حدد موعد تشغيل هذا البرنامج النصي يوم الاثنين/الجمعة الساعة 08:00 بالتوقيت العالمي، قبل فتح لندن، باستخدام وظيفة كرون، أو سير عمل أفعال GitHub، أو أي جدولة مهمة. عند تشغيلة التحديث، نسخ التحديث pine_data_*.txt المحتويات إلى محرر الصنوبر في TradingView ونقر حفظسوف تعكس علامات الرسم البياني الخاص بك على الفور أحدث بيانات الإعلان.


الخطوة السادسة

الخطوة 6 إرسال تنبيهات TradingView إلى سياق FXMacroData

سير العمل حتى الآن يدفع بيانات الكلية إلى TradingView. الخطوة 6 تغلق الحلقة في الاتجاه الآخر: عندما يقوم برمجية Pine Script بإطلاق إشارة تداول (على سبيل المثال اختراق فوق المقاومة بعد طباعة مؤشر سعر المشتريات) ، يقوم نظام تنبيه فلاش التداول بتحويل هذا الحدث إلى نقطة نهاية صغيرة من Flask ، والتي تقوم على الفور باستفسار FXMacroData للحصول على سياق جديد أحدث اتجاه مؤشر السعر المشترك ، الإصدارات القادمة ، وموقع COT الحالي وتسجل أو تخطرك بالصورة الكاملة للماكرو.

إبتكر webhook_server.py:

"""
webhook_server.py — Receive TradingView alert webhooks and enrich with FXMacroData context.
Run with: python webhook_server.py
Expose to the internet via ngrok or deploy to a cloud function / VPS.
"""
import os
import json
from datetime import date, timedelta

import requests
from flask import Flask, request, jsonify

app = Flask(__name__)
BASE_URL  = "https://fxmacrodata.com/api/v1"
API_KEY   = os.environ.get("FXMD_API_KEY", "")

def get_macro_context(currency: str) -> dict:
    """Fetch latest policy rate + CPI for the given currency."""
    params: dict = {"start": str(date.today() - timedelta(days=90))}
    if API_KEY:
        params["api_key"] = API_KEY

    ctx: dict = {}
    for indicator in ("policy_rate", "inflation"):
        try:
            r = requests.get(
                f"{BASE_URL}/announcements/{currency}/{indicator}",
                params=params, timeout=10
            )
            r.raise_for_status()
            data = r.json().get("data", [])
            ctx[indicator] = data[0] if data else {}
        except Exception as exc:
            ctx[indicator] = {"error": str(exc)}
    return ctx

@app.route("/tradingview/alert", methods=["POST"])
def receive_alert():
    payload = request.get_json(force=True, silent=True) or {}
    currency = payload.get("currency", "usd").lower()
    signal   = payload.get("signal", "unknown")

    ctx = get_macro_context(currency)
    result = {
        "received_signal": signal,
        "currency": currency.upper(),
        "macro_context": ctx,
    }
    print(json.dumps(result, indent=2))
    return jsonify(result), 200

if __name__ == "__main__":
    app.run(port=5050, debug=False)

قم بتثبيت فلاسك و تشغيل الخادم:

pip install flask
python webhook_server.py

تعرض الميناء المحلي للإنترنت مع نروك.

ngrok http 5050

في TradingView، افتح تنبيهات → إنشاء تنبية، حدد حالة النص الصنوبر الخاص بك، وتمكين عنوان URL لـ Webhook، وملصق عنوان URL HTTPS ngrok ينتهي بـ /tradingview/alert. ضع رسالة التحذير على حمولة JSON:

{
  "currency": "eur",
  "signal": "breakout_long",
  "ticker": "{{ticker}}",
  "price": {{close}}
}

في كل مرة يتم فيها تشغيل شرط Pine Script ، تقوم TradingView بنشر JSON إلى نقطة النهاية الخاصة بك. يحصل معالج webhook على أحدث سعر سعر السياسة EUR و CPI من FXMacroData ويسجل سياق الماكرو الكامل إلى جانب الإشارة. يمكنك توسيع هذا لإرسال إشعار Telegram أو Slack باستخدام البيانات المثرية.

نصيحة الإنتاج

لتنفيذ دائم، مضيف webhook_server.py على وحدة آلية تشغيل سحابة، سكة حديد، أو تقديم. استخدم متغير البيئة ل FXMD_API_KEY و إضافة التحقق الأساسي HMAC على حمولة webhook لمنع التنبيهات المزيفة. TradingView لا يوقع حمولات webhooks بشكل أصلي، لذلك سرك المشترك الخاص في مسار URL (مثل /tradingview/alert/SECRET_TOKEN(إنه أبسط حارس


الخطوة السابعة

الخطوة 7 توسيع مع وضع COT والسياق الفوري للعملات الأجنبية

بيانات الإعلان الكلي هي طبقة واحدة من الصورة. للحصول على إشارة أكثر اكتمالا، أضف مواقف التزام التجار من CFTC وسياق اتجاه الفوركس الفوري من FXMacroData.

تحديد موقع البيع على العقود الآجلة لـ EUR:

curl "https://fxmacrodata.com/api/v1/cot/eur?api_key=YOUR_API_KEY&start=2024-01-01"
{
  "currency": "eur",
  "data": [
    {
      "date": "2025-03-18",
      "net_noncommercial": 48320,
      "long_noncommercial": 182500,
      "short_noncommercial": 134180
    }
  ]
}

إضافة سلسلة تحديد موقع الشبكة COT إلى مولد Pine Script الخاص بك باستخدام نفس النمط كما الخطوة 2. net_noncommercial يُشير التجار المضاربون إلى أنّ العقود الآجلة الطويلة للـ EUR صافية وهي خلفية معنوية تضيف الإيمان عندما تُجمع مع إشارة سياسة البنك المركزي الأوروبي الصقورية. لوحة أدوات COT قبل أن تضعها في مؤشرك

توسيع مولد بايثون لتشمل قسم COT:

def fetch_cot(currency: str, start: str) -> list[dict]:
    url = f"{BASE_URL}/cot/{currency}"
    params: dict = {"start": start}
    if API_KEY:
        params["api_key"] = API_KEY
    resp = requests.get(url, params=params, timeout=15)
    resp.raise_for_status()
    return resp.json().get("data", [])


def build_cot_pine_arrays(records: list[dict]) -> str:
    ts_list  = [str(int(datetime.fromisoformat(r["date"] + "T00:00:00+00:00").timestamp() * 1000)) for r in records]
    net_list = [str(r.get("net_noncommercial", 0)) for r in records]
    ts_str   = ", ".join(ts_list)
    net_str  = ", ".join(net_list)
    return f"""
var int[]   _cot_ts  = array.from({ts_str})
var float[] _cot_net = array.from({net_str})
"""

في خط الصنوبر، المخطط _cot_net في لوحة منفصلة (مجموعة overlay=false لذلك يمكنك أن ترى اتجاه الموقع المضاربة جنبا إلى جنب مع الإعلانات السعر والماكرو.


- خلاصة المقال -

ما بنيت

  • ✅ برنامج برمجي بايثون الذي يحضر إعلانات FXMacroData ويولد حرفيات صفوف Pine Script
  • ✅ مؤشر Pine Script v5 الذي يحدد تواريخ الأحداث الكبرى على مخطط TradingView الخاص بك مع الملصقات، وتغطية خط خط، وجدول البيانات
  • ✅ برنامج تصميم تحديث تلقائي يتحقق من وجود طبعات جديدة قبل كل جلسة ويعيد إنشاء صفوف الصنوبر عند الحاجة
  • ✅ نقطة نهاية فلاسك webhook التي تتلقى تنبيهات TradingView وتثريها مع سياق ماكرو مباشر من FXMacroData
  • ✅ تمديد موقع COT الذي يضيف مشاعر تكهنية إلى الصورة

الخطوات التالية: تمديد معالج شبكة الإنترنت لتحويل البريد إلى تلغرام أو سلاك، إضافة فحص تقويم الإصدار حتى يبرز المؤشر القادمة أو الجمع بين عملتين (مثل أسعار العملات السياسية لليورو والدولار الأمريكي) لاستخرج التداخل في أسعار الفائدة على اليورو/الدولار الأميركي. /api-data-docs /أبي بيانات لإيجاد سلسلة الكليات التي تناسب استراتيجيتك بشكل أفضل.

AI Answer-Ready

Key Facts

Page
How To FXmacrodata Tradingview Pine Script
Section
Articles
Canonical URL
https://fxmacrodata.com/articles/how-to-fxmacrodata-tradingview-pine-script
Source
FXMacroData editorial and official publisher references
Last Updated
2026-04-22 12:36 UTC

Provenance And Trust

Cite the canonical URL and source field above. Where available, this page maps to official publisher releases and timestamped updates.

Quick Q&A

What is this page about? This page explains How To FXmacrodata Tradingview Pine Script with directly usable context for trading, research, and API workflows.

What source should be cited? Use the canonical URL and the listed source field; cite official publisher references when available.

How fresh is this content? The last updated value above reflects the page metadata or latest available data timestamp.

Can this be used in AI assistants? Yes. This section is intentionally structured for retrieval and citation in chat assistants.

Prompt Packs

Use these in ChatGPT, Claude, Gemini, Mistral, Perplexity, or Grok for consistent source-aware outputs.

Blogroll