
解锁新技能,和学长一起学Pine Script
大家好,我是学长。 欢迎来到我的全新教学专题——【Pine Script 交易脚本学习】。 在过去很长一段时间里,博客中分享的内容,更多地围绕着MQL4这门MT4专用的编程语言。MQL4就像一台重型工业机床,它功能完备、性能可靠,能让我们打...

大家好,我是学长。 欢迎来到我的全新教学专题——【Pine Script 交易脚本学习】。 在过去很长一段时间里,博客中分享的内容,更多地围绕着MQL4这门MT4专用的编程语言。MQL4就像一台重型工业机床,它功能完备、性能可靠,能让我们打...

我们经常有这样的需求:我想计算RSI的移动平均线,或者我想把布林带应用在MACD上。 新手的第一反应是:去复制RSI的全部源代码,然后在我新脚本里再对它计算均线,这是一个非常低效且难以维护的办法。 专业的做法,就是利用 input.sour...

我们都知道 input.bool() 可以创建一个简单的勾选框开关。 但有时候,这在视觉上不够专业,或者不够直观。 比如你可能更希望用户在一个下拉菜单中明确选择 开’或 关,而不是一个孤零零的复选框。 input.string(...

在Pine Script 的功能中,input.int() 负责周期,input.float() 负责精度,而 input.price() 则负责交互。 这是Pine Script中最接近手动划线的输入功能,它能为你的脚本设置面板,添加一个...

在Pine Script的输入功能中,input.time() 是实现精准时间点控制的核心工具,它能为你的脚本设置面板,添加一个日期和时间选择器。 它的实战用途非常明确和强大: 定义回测窗口: 这是它最核心的用途。通过两个 input.ti...

在Pine Script的输入功能中,input.timeframe() 是实现多时间周期分析的核心工具。 它能为你的脚本设置面板,添加一个时间周期下拉菜单。 它的实战用途非常明确和强大,加载高周期数据是它最核心的用途。 比如你可以在1小时...

在做日内交易时,我们最关心的就是特定时间。 比如,你可能只想在美股的交易时段执行策略,而过滤掉盘前和盘后的信号。 input.session() 函数就是Pine Script提供的、用来在输入面板上创建时间区间选择器的工具 。 它的实战用...

在 Pine Script 的“输入”功能中,input.symbol() 独树一帜。它不提供数字或开关,而是为你的脚本设置面板添加一个商品代码搜索框 。 这个功能非常强大,它就像TradingView主界面顶部的品种搜索框一样 ,是你连接...

我们在开发指标时,总会遇到一个经典问题: 我的均线是应该基于 close(收盘价)计算,还是应该基于 hl2(高低价均值)? 我的 RSI 到底是用 close 还是用 hlc3(高低收均值)更准? input.source() 函数就是P...

我们写指标,不仅要算得准,还得看得清。 input.color() 函数就是Pine Script提供的、用来在输入面板上创建颜色选择器的工具 。 你可能会问:我直接在脚本设置的样式标签页改颜色不就行了? 样式标签页只能修改 plot() ...

在Pine Script的参数控制面板中,input.string() 负责处理所有的文本(字符串)。 你可能会想,交易策略都是数字,为什么要输入文本? 答案是:警报与自动化。 这几乎是 input.string() 最核心的实战用途。 当...

我们写指标或策略时,经常需要一些开关——比如,是否显示这条均线?、是否开启这个交易时段? input.bool() 函数就是 Pine Script 提供的、用来创建这种布尔值输入选项的完美工具 。 所谓布尔值,就是它只有两个状态:true...

如果说 input.int() 负责的是周期长度、K线根数这类整数,那么 input.float() 负责的就是策略中所有关乎精度的计算。 在交易的世界里,小数无处不在。比如: 风控乘数: 1.75 倍的 ATR 止损。 资金管理: 0.5...

当我们在PineScript中搭建策略或指标时,最基本的需求就是能方便地调整参数,比如均线周期、RSI长度等。 你总不能每次想把20日线改成21日线,都去代码里硬修改。 这就是输入(Inputs)功能的核心价值。 而 input.int()...

我们在上一篇文章中,已经详细盘点过 input.int()、input.color() 等各种各输入函数。它们各自创建了独特的设置选项,但作为一个整体,它们都遵循着一些通用的规则和特性。 1. 代码顺序,决定了设置面板的顺序 你的脚本设置面...

当你好不容易写完一个策略,比如一个双均线系统,你总不能让你的用户(或者你自己)每次想测试不同周期时,都得去改代码吧? 这就太不专业了。 为了解决这个问题,PineScript 提供了一套强大的输入功能。它们就像是你为策略打造的一个控制面板,...

上一篇我们领略了calc_on_order_fills的强大威力,它能让策略在订单成交后即时反应,触发连锁下单。但很多开发者在实际使用中,会遇到一个极其困惑的现象:我明明在代码里写了 calc_on_order_fills=true,为什么...

在PineScript的世界里,存在一个终极开关,它能让你的策略从一个稳重的步兵,瞬间化身为一个反应速度快到极致的超级战士,这个开关就是 calc_on_every_tick。 正常情况下,你的策略只会在K线收盘时才思考和行动一次,但一旦你...

默认情况下,PineScript策略是个慢性子,它的工作模式是耐心等待一根K线走完,在收盘的瞬间进行一次计算,如果发现交易机会,就生成订单,但这个订单最快也要等到下一根K线开盘才能成交。整个过程规规矩矩,但总是慢半拍。 在很多交易场景下,这...

在PineScript的世界里,回测引擎的默认工作流程是谋定而后动。具体来说,是这样的: 等待K线走完: 策略会耐心等待当前这根K线完全收盘。 收盘后复盘: K线一收盘,策略立刻基于这个最新的收盘价进行计算,判断是否满足开仓或平仓条件。 如...

上一篇我们聊了 strategy.entry() 是如何因为生成 vs 执行的机制,在特定情况下绕过加仓限制的。今天我们来聊一个更直接、更霸道的原因——strategy.order() 函数。 strategy.entry() 和 stra...

你是否遇到过这样的困惑:在 strategy() 函数里明明白白地设置了 pyramiding=0(禁止加仓),结果回测一看,策略居然在同一根K线上开了好几笔同向订单,持仓量远超预期。 这并不是 TradingView 的Bug,而是其回测...

“为什么我的策略回测是条龙,一到实盘就成了虫?” 这是每个策略开发者都曾问过自己的问题。其中一个最常见的原因,就出在回测引擎对限价单过于理想化的成交假设上。 在默认情况下,TradingView的回测引擎认为,只要K线的价格哪怕只碰到你的限...

在交易中,当我们分批建仓后,平仓时通常遵循一个默认规则“先进先出”(FIFO)。你可以把它想象成排队出场:最早进场的仓位,在平仓时也最先被平掉,这是TradingView策略的默认行为,也符合大部分经纪商的执行规则。 但如果你的策略逻辑比较...

上一篇文章里,我们详细讨论了 Pine Script 中仓位管理的三种核心模式 (default_qty_type),但光有模式还不够,我们必须为这个模式注入灵魂,也就是设定一个具体的“数值”。这个关键任务,就由 default_qty_v...

聊完了入场信号和加仓规则,我们现在来谈一个更核心、也更关乎成败的话题:仓位管理。 你的策略每次到底该下多少手?是固定数量,还是根据账户资金动态调整?这正是交易系统的命脉所在。 在PineScript中,策略的默认订单规模由两个参数共同决定:...

在交易策略中,加仓是一种常见的技术,尤其是在趋势跟踪系统中。当市场朝着我们有利的方向发展时,顺势增加头寸可以极大地放大我们的盈利。然而,无节制的加仓也是一把双刃剑,会急剧增加我们的风险敞口。 因此如何在代码中精确控制策略的加仓次数,就成了一...

作为交易员,我们最常犯的一个错误,就是在回测时过度美化策略的表现。一个策略在图表上看起来天衣无缝,净值曲线一路向北,可一旦投入实盘,结果却往往不尽人意。这中间的差距,很多时候就出在被我们忽略的交易成本上,也就是手续费和佣金。 一个不考虑交易...

在交易这场游戏中,每一次出手无论盈亏,你都得向券商/平台交手续费,它是侵蚀你利润、放大你亏损的隐形杀手。一个专业的策略回测,如果连手续费都不算,那无异于掩耳盗铃,Pine策略里的commission_type和commission_valu...

在交易世界里理想与现实之间,隔着一道鸿沟,这道鸿沟的名字就是滑点。 你的策略回测再漂亮,如果不考虑滑点,那也只是理论模型,Pine策略里的slippage参数,就是把你从理想拉回现实的清醒剂。它专门用来模拟市价单和止损单在真实市场中,因各种...

我们前面学习到,用currency参数可以模拟跨币种回测,非常方便。但一个敏感的问题随之而来:TradingView用的是昨天的汇率来换算,而我的券商用的是实时汇率,这会导致我的回测报告失真吗?这个差异到底有多大?值得我们担心吗? 今天学长...

我们来设想一个真实的场景: 你是一位身在欧洲的交易员,账户里存的是欧元,但你每天都在交易美国的纳斯达克指数(以美元USD计价)。那么问题来了:你账户里的10万欧元,今天到底能买多少价值的纳指期货?明天呢?这个购买力是固定的吗? 今天我们就来...

你的交易账户是欧元区的,但你主要交易纳斯达克指数和美国股票,那么你最终关心的,不是策略赚了多少美元,而是这些美元换算成欧元后,对你的账户净值到底有多大贡献。 Pine策略里的currency参数,就是帮你自动完成这个关键换算的财务总管,它能...

上一篇我们讲了多头保证金 margin_long,今天我们来聊聊它的孪生兄弟margin_short。它们就像一把双刃剑的两面,作用机制完全相同,只不过 margin_short 专门用于定义空头订单的保证金要求。 它同样决定了你的策略是在...

保证金交易是交易世界里最迷人也最危险的工具,它是一把能放大收益的杠杆,但也是一把能让你瞬间爆仓的快刀。在Pine策略里margin_long参数就是这把快刀的保险开关,它专门用于定义多头订单的保证金要求。 简单来说,margin_long设...

在Pine Script里,initial_capital参数的作用,就像是给你的策略模拟账户存入第一笔本金,这笔钱不是越多越好,也不是越少越好,而是越真实越好。 为什么它如此重要?因为它直接决定了你的回测报告是否有参考价值,用100万的本...

本篇接上一篇也就是Pine Script(60),继续聊一下代码配置和手动配置,配置Pine策略就像调校一辆赛车。 我们有两种方式:一是代码配置 (strategy()函数)。这是策略的出厂设置或默认参数,你在这里定义策略的核心、可靠的基准...

在TradingView中,配置一个策略有两种方式:一是在strategy()函数里用代码写死,二是利用图表界面上的手动设置。 手动设置有两大好处,也是专业策略开发者频繁使用它的原因:一是高效调试,想快速测试某个参数的改变对策略有什么影响,...

写策略就像造车,strategy()里的参数就是发动机、悬挂、刹车系统的出厂调校。调校得好,策略才能在回测中跑出接近真实世界的成绩,调校得差,回测再漂亮也是空中楼阁。 今天学长就分享一套我的标准,帮你从一开始就打造一个专业级的回测环境。 t...

写一个Pine策略,就像是组建一支准备上战场的军队,strategy()函数里的各种设置,就是你为这支军队制定的作战条例和后勤规范。这些规则决定了你的策略如何交易、如何管理资金、以及回测报告的真实性。所有的策略设置我们可以清晰地分为两大类:...

在TradingView里,strategy()函数是每个策略脚本的心脏,每一个策略都必须调用它,否则脚本就只是个普通的指标,无法执行回测。 更重要的是,一些决定策略回测真实性的高级功能,比如滑点、手续费、保证金等,并没有手动设置的入口,只...

上次聊了用timeframe参数实现跨周期分析,但你可能很快就会发现一个小瑕疵:当你把日线周期的指标放到小时图上时,指标线变得断断续续,像掉线了一样。 今天教你如何搞定这个问题,让多周期指标线条重新变得更完善,要用到的就是timeframe...

TradingView的indicator() 函数参数多得让人眼花缭乱,但别被吓到,你根本不需要记住所有参数。在绝大多数情况下,你只需要掌握下面这4个核心设置,就能应对90%以上的场景了。 title:这是指标的“大名”,也是唯一必填的参...

在TradingView里,indicator()函数是每个指标脚本的开场白,你可以把它想象成在给你的脚本办一张身份证,它决定了脚本的名称、显示位置以及各种基础行为。 通过indicator()函数,我们不仅能设定那些在图表界面上可以手动调...

今天我们要聊的max_bars_back参数,可以说是一个“屠龙之技”——99%的情况下你都用不到它。因为TradingView的自动历史数据检测机制已经非常智能和准确,完全能满足绝大多数脚本的计算需求。但是了解它,能帮助你在那关键的1%...

前面几篇文章我们一直在讲,如何通过max_labels_count、max_lines_count和max_boxes_count来突破绘图的数量限制,把上限从默认的50提高到500。这时你可能会好奇:为什么TradingView要多此一举...

前面我们讲了如何突破标签(label)和趋势线(line)的数量限制,今天我们来聊聊它们的“亲兄弟”——方框(box)。 和前两者一样,如果你想用代码在图表上画很多方框来标记特定区间,比如盘整区域、波动范围或者订单块,你同样会遇到一个默认的...

你是否曾尝试用代码画线来连接各个高低点,或者标记某些特定区域,但发现图表往左一拉,最早画的那些线就不见了。这个问题,和我们之前讲的标签消失问题如出一辙,都是因为你触发了Pine脚本默认的绘图数量限制。max_lines_count这个参数,...

你有没有遇到过这样的情况:写了一个脚本,用来标记历史上每一次出现的特定K线形态,结果回测时发现,图表拉到最左边,最早的那些标记都消失了? 这通常不是bug,而是因为你遇上了Pine脚本默认的标签数量上限,max_labels_count这个...

你有没有遇到过这种情况:精心写了一个必须叠加在主图上才能正常使用的指标(比如某种K线形态识别),结果用户不知道,随手就把它拖到了副图,导致指标完全失效,还反过来问你是不是代码有bug?Pine脚本中的linktoseries参数,就是为了解...