
解锁新技能,和学长一起学Pine Script
大家好,我是学长。 欢迎来到我的全新教学专题——【Pine Script 交易脚本学习】。 在过去很长一段时间里,博客中分享的内容,更多地围绕着MQL4这门MT4专用的编程语言。MQL4就像一台重型工业机床,它功能完备、性能可靠,能让我们打...
大家好,我是学长。 欢迎来到我的全新教学专题——【Pine Script 交易脚本学习】。 在过去很长一段时间里,博客中分享的内容,更多地围绕着MQL4这门MT4专用的编程语言。MQL4就像一台重型工业机床,它功能完备、性能可靠,能让我们打...
我们前面学习到,用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参数,就是为了解...
在之前的文章里,我们讨论过当一个overlay=true的指标数值范围和主图K线价格差异巨大时,会把K线压成心电图的图表问题,当时我们用scale=scale.left作为解决方案,完美解决了问题。今天我们就来系统地、深入地讲解scale这...
写脚本时你很可能踩过这个坑:明明在代码里写了precision=5,想让指标显示5位小数,结果一将它叠加到主图上(overlay=true),precision就好像彻底失灵了,指标的小数位数顽固地跟着主图的K线走。 这是怎么回事?这其实是...
写指标时,你是不是有时会觉得默认的小数位数太多或太少,影响了图表的美观?比如RSI指标的值明明取整显示就足够了,但图表上却偏偏跟着一长串无关紧要的小数。 Pine脚本中的precision参数,就是专门用来解决这个问题的,它能让你精确设定脚...
写脚本时你有没有想过,怎么让指标在价格坐标轴上显示的数字更美观、更符合它的类型?比如成交量能自动显示K(千)和M(百万)后缀,而不是一长串难看的零;或者一个百分比类的指标能自动带上%符号。 Pine脚本里的format参数,就是专门用来解决...
在Pine脚本里,overlay这个参数虽然不起眼,但它却是个总开关,决定了你的指标最终显示在哪个位置:是直接叠加在主图的K线上,还是在图表下方单独开辟一个窗口(副图/子窗口)来显示。 overlay参数接受两个非常简单的值: true会直...
刚开始写Pine脚本时,你可能会遇到一个很奇怪的问题:明明记得保存了脚本,但在“指标与策略”窗口里怎么搜都搜不到。别慌这通常不是什么大问题,你很可能只是混淆了脚本的两种名称。 一个TradingView脚本其实有两个名字: 显示名称: 这个...
我们都知道用 title 可以给脚本定一个完整的官方名称,但有时候,这个名字太长了,放在图表上会显得很拥挤,特别是当你同时加载好几个指标的时候。 为了解决这个问题,Pine Script提供了一个很贴心的参数:shorttitle。它允许我...
我们写好一个脚本,第一件事通常就是给它取个名字。这可不只是个代号,一个清晰、有意义的名字能让你的脚本在众多指标中脱颖而出,也方便自己日后管理和使用。 在Pine Script里,无论是指标、策略还是库,我们都通过 title 这个参数来给它...
当一个Pine脚本写好后,我们通常需要对它进行各种设置,比如修改指标的周期、颜色,或者策略的初始资金等等。你有两种方式来完成这件事: 手动修改:在图表上用鼠标点开脚本的“设置”窗口进行调整。 代码配置:在写代码的时候,就直接在indicat...
在PineScript的世界里,我们主要开发两种程序:“分析师”(指标)和“交易员”(策略)。 分析师的工作是观察市场、进行计算,并在图表上画出各种线条和信号来给你提供建议。它通过indicator()函数进行声明。交易员更进一步,不仅会分...
前面我们学习了str.format()中方便快捷的预设日期/时间格式(如date,short)。但你可能会发现,这些预设格式大多是美式风格(比如月/日/年),不一定符合我们的阅读习惯。 如果我们想实现年-月-日 时:分这种完全自定义的格式,...
上一节我们学习了str.format()中那些方便快捷的预设格式(如number,currency)。但如果你想实现更精细的效果,比如“强制保留4位小数”或者“显示带千位符的整数”,这些预设格式就不够用了。 这时,我们就需要进入str.fo...
我们已经学会了如何用str.format()的占位符{0}, {1}来做“完形填空”。但默认填进去的数字和时间可能格式很乱,比如小数位太多,或者时间戳是一长串看不懂的数字。 为了让我们的输出更专业、更易读,我们需要给这些“填空”的内容进行“...
上次我们学习了str.format()这个文本构建工具,它的核心思想就是完形填空。今天,我们就来深入研究一下这个填空题里面的占位符。理解了占位符的各种高级玩法,你才能真正驾驭str.format()的全部用法。 我们先来明确两个核心概念: ...
在量化交易中,时间就是一切。但程序眼里的时间(一个从1970年开始计算的巨大毫秒数,我们称之为“时间戳”)和我们人类习惯的年月日时分秒完全是两码事。更头疼的是,不同交易所还处于不同的时区。 如何把难懂的时间戳,转换成我们想要看的、特定时区的...
当我们想创建一段包含多个动态数据的复杂文本时,比如“BTCUSD在2025-07-27 20:00收盘于52345.67,上涨了1.23%”,如果用+号和str.tostring()一个个拼接,代码会变得非常混乱且难以阅读。 为了解决这个问...
在PineScript中,我们经常需要把各种计算结果,比如当前的价格、指标值,显示在图表的标签里,或者包含在警报消息中。但这里有一个基本规则:文本(字符串)不能直接和数字、布尔值等其他类型的数据“拼接”。 要解决这个问题,我们就需要一个万能...
上一节我们自己动手打造了判断全小写的StrIsLower()函数。有小写就有大写,今天我们就来完成它的姊妹篇:创建一个能精准判断字符串是否全大写的StrIsUpper()函数。 这在校验某些固定大写的品种代码(如外汇USDJPY)或处理特定...
在处理文本数据时,有时我们需要进行一种格式校验:判断一个字符串是否“纯粹”,比如,是不是所有的字母都符合小写规范。这在需要统一数据格式或验证用户输入时非常有用。 PineScript本身没有提供现成的函数来做这个检查,但这难不倒我们。今天,...
上一节我们学习了str.lower(),它可以将所有字母都转为小写。今天我们来认识它的“兄弟”函数——str.upper()。 它的功能正好相反:无论原始文本长什么样,它都会把所有字母强行转换成大写。这两个函数共同构成了我们处理文本大小写问...
在处理文本数据时,我们面临一个常见的问题:大小写。在程序看来,EURUSD、EurUsd和eurusd是三个完全不同的东西,这会给我们的比较和筛选带来巨大的麻烦。 为了解决这个问题,我们需要一个标准化工具,能无视原始文本的大小写,强行把它们...
上一节我们学会了如何自己动手“砍掉”字符串多余的前缀。有前就有后,这次我们来解决另一个常见的文本清理需求:如何移除字符串末尾的后缀。 比如,很多期货品种的描述都带有Futures或Perpetual Futures这样的后缀,我们可能只想保...
我们在处理交易品种信息时,经常会遇到一些带有固定前缀的文本,比如很多ETF的描述都以ProShares或iShares开头。在图表上显示标签或发送警报时,这些前缀往往是多余的“噪音”,我们真正关心的是后面的核心信息。 那么,如何智能地“砍掉...
继StrContains()和StrStartsWith()之后,我们来打造我们自定义工具箱里的最后一件利器:StrEndsWith()。顾名思义,它专门解决不区分大小写的“后缀匹配”问题。这个功能在根据计价货币(如USD)、合约类型(如P...
上一节我们自己动手创建了一个不区分大小写的文本包含函数StrContains()。但有时模糊包含还不够,我们需要更精确的“前缀匹配”,并且同样希望忽略大小写的干扰。 比如我想筛选出所有比特币相关的品种,BTCUSD和btceur都应该被选中...
前面我们讲了字符串比较的三剑客,但它们都有一个共同的毛病:太较真,严格区分大小写。比如,在它们眼里'BTC'和'btc'是完全不同的东西。 但在很多实际场景里,我们希望搜索能智能一点,忽略大小写的差异。比如,我想找到所有比特币相关的品种,不...
我们已经学会了用str.contains()做模糊搜索,用str.startswith()做前缀匹配。现在,我们来学习这个系列的最后一个工具:str.endswith()。 顾名思义,它专门用来判断一个字符串是否以某段特定的文字“结尾”。这...
上一节我们聊了str.contains(),它可以帮我们做模糊的“文本包含”搜索。但有时候,我们需要更精确的判断,比如,我只想找出所有以'EUR'开头的货币对,而不想匹配到'GBPEUR'。 这种要求“必须以…开头”的场景,就需...
在我们写的策略或指标里,经常需要像搜索引擎一样,去判断一段文字里是否“包含”某个关键词。比如,我想让我的脚本在所有和“原油”相关的品种上都自动应用某个设置,或者检查用户的自定义警报消息里是否包含了“买入”这个词。 要完成这种“文本搜索”任务...