矿工指引:如何安全的硬分叉到Bitcoin Unlimited

由于 Bitcoin Unlimited 并没有程序来控制硬分叉启动的条件,所以硬分叉到 Bitcoin Unlimited 需要参与的矿池联合起来,达成一致行动。另外矿池如果配置不当可能会造成遭受大块攻击,或者造成比特币网络突然的提前分叉,这是非常危险的。随着越来越多的矿池对 Bitcoin Unlimited 感兴趣,我建议矿池按照下面所述的步骤来实施硬分叉。

整个硬分叉过程应该分为三步。第一步:算力投票阶段,如果在一个完整的难度周期中,由 Bitcoin Unlimited 挖出的区块占比等于或大于 75% 则进入下一步骤。第二步:锁定阶段,共两个难度周期,供比特币社区升级他们的软件到 Bitcoin Unlimited, 如果两个难度周期内任何一个难度周期中 Bitcoin Unlimited 的区块没有满足 75% 条件,则回到第一步。第三步:实施阶段,开始硬分叉。

在第一步中,如果矿池配置不当或者使用 Bitcoin Unlimited 的默认配置,可能会遭受到别有用心的人发出的大区块攻击。如果这时候 Bitcoin Unlimited 算力占比比较小,会造成 Bitcoin Unlimited 一方工作在错误的链上,造成严重损失。如果双方势均力敌,那么比特币会面临分裂的危险。如果已经到了第二步,那么分叉会发生在预定的时间之前,这会造成混乱。

我的建议是矿池在第一步和第二步的时候,把 Bitcoin Unlimited 配置为 EB1/AD6, 其含义为接受 1MB 大小的区块,如果有更大的区块,只有在该大区块之后有 6 个或以上的区块,并且包含大块的链为最长链,那么比特币节点会切换到包含大区块的链上。可以通过在 Bitcoin 配置文件中添加下面两行来实现:

excessiveblocksize=1000000
excessiveacceptdepth=6

在这样的设置下,攻击者必须要有 51% 以上的算力才可以实现大区块攻击,已经足以保证安全了。AD 不宜设置的过大,因为在到达到第三步的时候,矿池不大可能在同一时间切换,AD6 的设定保证矿池即使没有及时修改配置,也可以及时切换到最长链,降低损失。

另外,矿池还需要设置区块版本号和挖出的区块大小。Bitcoin Unlimited 的默认版本号为 Bitcoin Classic 的版本号 0x30000000,这是容易引起误解的,建议改为 0x20000000. 另外,挖出的区块大小应配置为 1MB. 可以通过在 Bitcoin 配置文件中添加下面两行来实现:

blockversion=536870912
blockmaxsize=1000000

到达第三步之后,矿池修改接受的区块大小和挖出的区块大小,开始硬分叉。我建议先硬分叉到 2MB,这是经过充分测试证明网络能够支持的大小,是风险最低的选择。可以通过修改 Bitcoin 配置文件来实现:

excessiveblocksize=2000000
blockmaxsize=2000000

相信通过这样的步骤和配置,可以让硬分叉变得更安全。

为什么比特币需要区块扩容以及为什么选择Unlimited

在2016年10月10日,也就是比特币在米兰的第三次扩容会议刚刚结束之后,我选择了把 ViaBTC 矿池的 Bitcoin 版本从 Bitcoin Core 切换到了 Bitcoin Unlimited. 当然,这一决定是在争取到绝大部分矿池用户的同意之后做出的,我不能把我的意志强加到用户身上。比特币区块扩容与否,是由所有比特币矿工所决定的。但是在扩容这件事情上,矿池的管理员相比于矿工有更多的专业能力,能够做出更好的选择。并且从以往的经验来看,矿工参与投票的积极性非常低。所以,我认为矿池管理员应该负起责任,做出自己的选择。

ViaBTC 在 Coinbase 中投票支持 2MB 区块大小,目前仍然挖 1MB 大小的区块,以保证与比特币主链的兼容。不需要为这个大小担心,因为这只是一个开始,一旦硬分叉成功实施,再升级区块大小就很容易了。我还特意的设置了区块版本号,没有使用 Bitcoin Unlimited 默认的 BIP109 区块版本号,因为 Bitcoin Unlimited 并没有实现 Bitcoin Classic 的 BIP109,我们也不想实现 BIP109. 也希望 Bitcoin Unlimited 开发者后续能够去掉这个默认的版本号,防止引起误解。

在我们发现第一个 Bitcoin Unlimited 区块之后,比特币社区引起了很大的反应,有很多争议和猜测,所以我觉得有必要说些什么,来澄清一些事实,阐述我的看法。

为什么比特币需要区块扩容?

很简单,如果比特币区块不扩容,那么比特币将走向失败。这不是说加密电子货币会失败,也许会有新的币替代比特币的地位。比特币还远远处于它的发展的早期,越来越多的人开始使用比特币。然而,由于临时性的 1MB 区块大小的限制,比特币开始拒绝新的用户的加入,在我看来,这是一种自杀行为。慢慢的,比特币交易费会变得高的不可接受,人们会转向其它竞争币。用户的流失对比特币的发展是致命的打击,这不是猜测,是正在发生的事情。另一方面,没有足够多的链上交易,比特币矿工获取不到足够多的交易费,若干年后,比特币挖矿变得无利可图,这会让比特币系统安全性大大降低。无论如何,这都会导致比特币的失败。

为什么隔离验证是垃圾?

人们说隔离验证能够安全的让比特币扩容到1.7MB,所以应该支持隔离验证,这种想法真是一叶障目。1.7MB的扩容只是减缓了比特币的死亡而已,并没有根本的解决了这个问题。并且就算隔离验证真的激活了,并不代表所有人都会马上使用隔离验证交易,真正达到1.7MB需要1年以上的时间,根本没法解决目前交易拥堵问题。另外,隔离验证给比特币社区带来了巨大的技术债务,大幅修改了比特币交易格式,需要所有的比特币节点、矿池、区块浏览器、钱包、交易所等比特币应用进行升级。这样的代价远远大于硬分叉,而这所有的一切,仅仅是为了1.7MB的扩容?别忘了,Bitcoin Core 提出隔离验证是为了阻止比特币通过硬分叉的方式扩容。一旦隔离验证得到激活,那么Core团队再也不会有硬分叉扩容了。比特币区块大小将会锁定在1MB的大小,不可避免的走向死亡。

为什么闪电网络行扩容行不通?

首先,闪电网络应用场景非常有限。想想人们为什么要使用比特币,是为了更快的交易确认速度还是因为比特币是一种去中心化的货币?比特币牺牲了速度和效率,带来了去中心化的安全,缓慢的确认速度对于比特币来讲并不是问题。其次,闪电网络上的交易并不是真正的比特币交易,和交易所内部的发生在数据库上的交易没有本质的区别。部署闪电网络对于普通用户来讲非常困难。如果闪电网络真的部署成功,成为比特币交易的主要形式,那么最后会形成多个中央节点,用户需要把币寄存在这些中央节点里面,这和现存的银行系统有什么本质的区别?最后,把比特币当做结算网络的想法非常可笑,比特币先是数字货币,然后才是结算网络,一旦比特币失去了货币属性,那结算属性立刻崩溃。闪电网络也不是一无是处,能够解决一部分问题,可以替代一部分比特币交易,但想把闪电网络作为主要的比特币交易通道行不通。

为什么选择Bitcoin Unlimited?

我们在区块大小这个问题上,浪费了太多的时间,我们需要一劳永逸的方案解决区块大小的问题。过大或者或小的区块都不合适,这应该交由市场来选择,随着比特币网络和技术的进步动态的调整。Bitcoin Unlimited 的扩容方案把区块大小的选择交给了矿工,符合我们的需要。Bitcoin Unlimited 允许矿工设置自己挖掘的区块大小和接受的区块大小,并通过 Coinbase 对区块的大小进行投票。如果节点发现有更大区块的链长度大于当前的链4个区块(默认)长度,会自动切换到最长的链而忽视区块的大小,这让比特币再次升级区块大小变得很容易。

为什么硬分叉并不危险?

硬分叉最大的危险在于,有可能出现两条链。但据我所知,在比特币扩容这件事情上,人们没有本质的分歧,绝大数人希望扩容,只是选择的方式不同。以太坊出现两条链是因为人们出现了本质的分歧,那就是:区块链是否可以被修改?并且,由于比特币难度调整的滞后性和10分钟1个区块的设定,在绝大部分算力支持硬分叉的情况下,出现两条链的可能性很小。原链会由于过慢的处快速度变得不可用,理性用户会选择新链,留下的矿工收益会大大降低,理性的选择也是切换到新链。

应该如何实施硬分叉?

对于 Bitcoin Unlimited 来讲,并没有一个程序自动设定的阈值。理论上来讲,只要有矿池愿意,任何时间都可以启动分叉,但这很危险并且意义不大。在 Bitcoin Unlimited 硬分叉这件事情上,矿池需要联合起来,达成一致行动。

首先,什么条件下启动硬分叉?我建议使用 Bitcoin Classic 的 75%的阈值,就是支持 Bitcoin Unlimited 的算力占比达到 75% 以上的时候再启动硬分叉。如果阈值过高,共识几乎永远不可能达成。75%的算力支持足以进行安全的硬分叉。

其次,什么时间启动硬分叉?我建议,首先,留够最少1个月的时间,为比特币社区升级自己的节点做准备。其次,我们应该选择在一次难度调整之后的马上进行分叉,让留在原链的算力调整难度变得异常困难,不得不放弃原链。

写在最后

纵观 Core 以及 BlockStream 在米兰比特币扩容会议上的种种提案,都是以杀死比特币和矿工为己任。在关系到比特币矿工和用户的切身利益时候,我们需要联合起来,让比特币重生。

在止损最小时开仓,在市场疯狂时平仓

这简单的两句话,就构成了一个简易的交易系统。

首先谈谈止损。是否会止损,是衡量一个交易员是否入门的标准。交易最大的错误,就是开仓的时候不明确设止损。没有止损保护的仓位,会让自己的交易账户失控,变得和赌博无异。但是,胡乱的设置止损对账户的伤害也很大。比如根据盈亏额度或者比例来止损,往往导致止损在震荡的高点或者低点。或者在大行情到来之前,确因为一个小回撤就止损出局。设置了止损,不严格执行也是白搭。严格执行止损不仅包括止损条件到了就平仓,还有要严格执行交易计划,不随便更改止损位置。想必有经验的交易者对这几句话都有感触。

什么是成功的止损?简单的来说,成功的止损就是在止损后,市场趋势反转,或者给你带来一个更好的进场位置。那么,最好的止损位置,就是最容易明确判断市场走向的位置。如何判断市场的转折点,就要靠技术分析了。技术分析通过趋势线,压力线,形态或者指标来判断市场的转折,往往是很明确的。价值投资因为信息不透明或者很难衡量信息的分量,所以很难确定止损位置,这是价值投资的劣势。

那么很显然,止损最小的时候就是最好的进场时候,这里说的止损当然是成功的止损,瞎止损不算。较小的止损我们能够通过较小的风险来博取较大的收益。我们需要做的就是寻找最小止损的时候交易。什么时候止损最小,就是技术分析的范畴了,我这里说几个把握比较大的方法:

缩量横盘很久后向一个方向突破。横盘时因为市场多空力量处于势均力敌之中,向一个方向突破是因为有新的力量打破了这一僵局。所谓横有多长,竖有多高。在价格突破近期的高点或低点开仓,止损很简单,市场突破后又回到原来的震荡区间,说明是假突破。这种例子在市场中非常常见。

三角整理区突破。三角整理区一般发生在趋势的进行的中间,也可以构成市场的反转,突破后往往意味着趋势的继续或反转。这时候往往是一个比较好的入场时机。在突破时开仓,止损很简单,没有有效突破止损。

压力/支撑线突破。压力线就是把市场连续几个波峰的高点练成的一条线,支撑线就是市场连续几个低点连成的一条线。最明显的例子就是2014年底上证指数突破数年的压力线,后面的事情大家都知道了:

新高新低突破。前期的高点/低点往往会变成重要的压力/支撑位,如果突破该点位形成新低或新高,说明有重要的力量打破该预期,顺着突破的方向开仓。《海龟交易法则》一书中所用的交易系统就是一套新高新低突破交易系统。还以上证指数为例,在今年三月份上证指数突破3400点得时候,就和朋友说,这可是能最好的买点了(但指数并不代表个股,指数突破不代表个股突破,比如金三胖在当时表现并不好,这也是股市的复杂之处):


上面说的这几种方法,所用的周期越长越有效,最少应该看日K线。周期越长越难被人为操纵,其突破往往代表重要趋势的变化。

俗话说,会买的是徒弟,会卖的是师傅。平仓了才能把账面利润变成实际利润。什么时候卖,确实是一个很复杂的问题。卖早了,可能价格涨了10倍,自己只赚了1倍,卖晚了,辛辛苦苦的利润化为灰烬。我也没法告诉你这个问题的答案,因为我也不知道。但在市场疯狂地时候,卖总是没错的。市场成交量放大,价格飞速上涨的时候,就是市场疯狂的时候。比如今年5月份的A股,比如13年底的比特币。这时候就是要最小心的时候了,一旦价格出现巨大回落,就要准备离场了。

2014~2015 年的A股:

2013~2014 年的比特币:

2015年末的比特币:

如何使用Mysql正确的处理财务数据

财务数据相比于普通的互联网应用数据,对数据的一致性有更高的要求。因为涉及到用户金钱的流动,出现问题就意味金钱和声誉上的损失。在用 Mysql 处理财务数据时,我认为应该遵循以下原则:

  1. 使用 DECIMAL 数据类型存储金额。因为浮点数精度是有限的,并且无法精确的表示一些数字。应用程序也应该使用 Decimal 函数库来进行金额的加减乘除的运算,比如 Python 的 decimal 模块,C++ 的 boost Multiprecision 库。
  2. 使用事务来更新数据库。涉及到数据库多个记录更新时,事务能够做到要么全部成功,要么全部失败,这保证了数据的一致性。Mysql 使用事务需要 InnoDB 引擎。
  3. 更新数据库时使用悲观锁。更新数据前使用 SELECT …  FOR UPDATE; 来查询,这样防止并发的请求读到脏数据,导致数据错乱。虽然加锁会影响性能,但为了数据的一致性也是值得的。
  4. 记录资金变化的流水日志。不能简单的只记录用户的金额,还要记录每笔资金的来龙去脉,包括变化的大小、时间、业务、更新前金额、更新后金额、备注等,另外还有记录业务ID防止重复更新金额。这样在对账的时候才能有理有据。

下面以一个完整的示例来说明如何设计一个完备的记账系统用来记录人民币余额,这里精度只需要2位小数就可以了。

假设已经有一个用户表,每个用户有一个唯一ID。我们需要创建两张表,一张余额表,一张流水表:

CREATE TABLE `balance` (
  `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `user_id` int NOT NULL,
  `item` varchar(10) NOT NULL,
  `balance` decimal(20,2) NOT NULL
) ENGINE=InnoDB;

CREATE TABLE `history` (
  `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `user_id` int NOT NULL,
  `item` varchar(10) NOT NULL,
  `amount` decimal(20,2) NOT NULL,
  `befor` decimal(20,2) NOT NULL,
  `after` decimal(20,2) NOT NULL,
  `business` varchar(30) NOT NULL,
  `business_id` varchar(100) NOT NULL,
  `detail` text
) ENGINE=InnoDB;

为了加快查询速度,另外为了有效利用 InnoDB 的行级锁,我们需要给两张表加上联合索引。另外,我们需要保证流水记录中 user_id, item, business, business_id 的组合是唯一的,避免重复更新数据。

ALTER TABLE balance ADD INDEX `user_item_idx` (`user_id`, `item`);

ALTER TABLE history ADD INDEX `user_item_idx` (`user_id`, `item`);

ALTER TABLE history ADD UNIQUE update_unique (user_id, item, business, business_id);

假设这时候用户 ID 为 1 的用户充值了 100 元人民币,我们需要把用户的人民币余额加上 100 元,我们要如何处理呢?

这里我们还需要一个充值表用来保存用户的充值记录,同时,我们再创建一个提现表来表示用户提现记录,如下所示:

CREATE TABLE `deposit` (
  `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `user_id` int NOT NULL,
  `item` varchar(10) NOT NULL,
  `amount` decimal(20,2) NOT NULL
) ENGINE=InnoDB;

CREATE TABLE `withdraw` (
  `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `user_id` int NOT NULL,
  `item` varchar(10) NOT NULL,
  `amount` decimal(20,2) NOT NULL
) ENGINE=InnoDB;

首先,开始一个事务,创建充值记录:

START TRANSACTION;

INSERT INTO deposit VALUES (NULL, 1, 'CNY', '100')

插入成功后,我们可以使用 MYSQL 的 API 获取到上次插入后生成的自增 ID 的值,假设这里也为 1. 然后我们需要从数据库查询当前余额。查询的时候注意要使用 FOR UPDATE 来锁住该记录,避免其它并发的请求读到脏数据。即使当前该记录不存在,在事务提交之前,其它读请求仍然被阻塞读不到数据的。

SELECT id, balance FROM balance where user_id = 1 and item = 'CNY' FOR UPDATE;

由于用户是新注册的,查询到的数据为空,所以我们创建新的记录:

INSERT INTO balance VALUES (NULL, 1, 'CNY', '100');

然后我们要在流水表中记录下这次的变更操作:

INSERT INTO history VALUES (NULL, NULL, 1, 'CNY', '100', '0', '100', 'deposit', '1', '');

最后提交事务:

COMMIT;

事务提交后,所有的数据都写入到数据库中了,中间如果有异常发生,则执行

ROLLBACK;

来放弃所有的变更。

假设过了一段时间用户要求提现 50 元,操作流程如下:

START TRANSACTION;

SELECT id, balance FROM balance where user_id = 1 and item = 'CNY' FOR UPDATE;

假设读出的 id 也为 1. 由于用户之前充值了 100 元还没有使用,所以余额是 100,大于 50 满足提现条件。如果不满足的话需要执行 ROLLBACK. 然后:

INSERT INTO withdraw VALUES (NULL, 1, 'CNY', '50');

UPDATE balance set balance = '50' WHERE id = 1;

INSERT INTO history VALUES (NULL, NULL, 1, 'CNY', '-50', '100', '50', 'withdraw', '1', '');

COMMIT;

这就完整的实现了整个充值和提现的流程。

当然,这里示例的充值和提现是最简化的流程,实际业务中,充值和提现往往涉及到多种状态的流转。并且在提现中,用户发起提现和实际进行转账不可能是同时进行的,中间可能会取消操作,直接扣除资金不太妥当,更妥当的做法是把待提现的资金冻结起来,冻结操作其实就是创建一个新的 item: CNY_FREEZE, 在 CNY 上扣减,然后在 CNY_FREEZE 上增加来实现。转账后再从 CNY_FREEZE 中扣除。如果取消操作则取消冻结,从 CNY_FREEZE 扣减,增加到 CNY 上面,这样整个流程在流水日志上都有体现。

深圳车牌竞价分析

前不久拿到了驾照,就琢磨着买辆代步车。但现在深圳车牌限号,买车需要有车牌指标,车牌指标可以通过摇号或竞价获得。看了一下上期摇号结果,中签率不到1%,平均需要接近9年才能中签。并且从往期来看,参与摇号的人数是越来越多的,中签的概率会越来越低,入下图所示:(数据来源:http://xqctk.sztb.gov.cn/gbl/index.html

摇号人数

所以目前来看,通过竞价是比较靠谱的获取车牌指标的方式,所以研究了一下过去所有8期的车牌竞价数据。车牌竞价本质上也是一种公开市场,卖方为市政府,买方为有购车需求者,买卖标的为车牌指标。市场的价格通常是由供需共同决定,但这个市场供给是固定的,那么影响价格走势的就是需求的变化了。

如果政策保持不变,长期来看,积累的有购车需求的人会越来越多,那么势必会推高车牌的竞价价格。但短期来看,影响车牌竞价价格的因素很多,除了供需之外,还有人们的情绪。既然是一种公开市场,那么短期的价格走势就可以通过技术分析的手段进行分析。

技术分析就是对过往成交的量价分析。从官网的公告中整理了感兴趣的一些数据,分别是投放指标数,竞拍人数,最低价,平均价,成交量。

QQ20151009-1@2x

其中除了最早2期因为政策刚开始施行,供给大于需求之外,之后的几期都是供给小于需求的,这也将是常态,所以研究投放指标和成交量意义不大。那么这里研究的量应该为参与竞拍人数,而最低价最能反映该市场的有效价格。下图为量价走势:

竞拍人数与最低价

从上图可以清晰的看出,从第3期到第6期,参与竞拍人数和最低价是同步上升的,典型的量价齐升。从第7期开始,参与人数开始下滑,但价格仍然继续攀高到了5w,出现量价背离现象。到第8期,参与人数进一步下滑,最低成交价也大幅跳水。我们可以从参与者心理来分析这种现象:如果往期车牌价格走高,但在自己心理价位之内,由于会担心车牌价格继续走高,所以会选择高价竞拍车牌,这会进一步推高价格;但如果车牌价格超过了自己心理价位,会选择放弃短期内购车的欲望,通过摇号去碰运气。从走势来看,转折点在第六期,平均成交价接近3w,这说明3w是目前市场参与者的一个平均心理价位。

由于竞价市场的特殊规则,最低价并没有太大参考价值,平均价才能反映出参与者实际付出的价格。在一个有效的市场中,最低价和平均价应该很接近才比较正常,下图为最低价和平均价的走势:

最低价与平均价

可以看出从第3期到第7期,最低价和平均价都比较接近。但在第8期,最低价与平均价之间的差额极为悬殊,这种极端情况肯定是不可持续的。仔细看下官方的公告,还有这样一个数据:实际参与报价的人数为3016个。而车牌数量为2945个,两者差额非常小。但因为参与者并不知道该情况,参与者能获取到信息只有两次播报的平均报价。参与者强烈的购车需求导致平均价仍然超过了5w。这让我联想到了股票市场上的曾经出现的逼空行为:股票价格连续上涨,远远超出了其实际价值,于是开始有人对其大量抛空,由于当时可以裸空,实际卖空数量甚至超出了股本数,这时有人用大量的资金不计代价的继续拉高股票,买光了市场中所有流动股票,卖空者为了避免破产,不得不计代价从逼空者手中买回股票以履行合约。车牌价格连续4个月上涨,强买车需求者不得不计代价的拍入车牌,这也算是一种逼空行为。极端情况总是不会持续太久的,最高价与平均价的大幅偏离肯定会被市场修复。

由于上期最低价很低,低于了很多人的心理价位,会有很多潜在需求者从摇号转为竞拍,所以接下来参与竞拍的人数可能会上升,这会让市场变得更加有效,最低价会上升。目前市场平均心理价位在3w左右,但在过去5期的逼空行情中,愿意出高价的参与者已经消耗殆尽,所以短期内平均成交价可能会降低到2w到3w之间。长期来看,有购车需求的人会越来越多,竞拍价格可能会继续上涨。所以,如果半年内有购车计划的话,在接下来几期内竞拍车牌应该是比较划算的。

如何有效的进行趋势跟踪

投机市场中,标的的价格通常以趋势的方式变化的。趋势是分级别的,15分钟周期的趋势在日K线上可能只是震荡而已。根据道氏理论,市场中存在三种趋势:主要趋势,次级趋势和日内趋势。通过追踪趋势进行交易的交易者称为趋势交易者。严格来说,所有的交易者都是趋势交易者,只是追踪的周期不同而已。但通常来说,趋势交易通常是指的追踪中长周期的趋势,持仓周期从几天到几个月不等。与之对应的是日内交易者,日内交易者通常不会持仓过夜。

趋势交易者通常会在趋势启动时建仓,在趋势确认反转时平仓。通常来说,市场中大部分时间是没有趋势的,只是无序的震荡。对于趋势交易者而言,可能绝大部分的利润来自于少数的几次交易,而这几次交易有幸捕捉到了市场中少有的大趋势,其它的交易都是不断的试错而已。所以,对于趋势交易者而言,如何追踪到主要趋势是非常重要的。如果错失了主要趋势,那么整体收益可能就会大打折扣了。

如何量化趋势

均线可能是最好的趋势量化指标了。均线是通过计算过去N个周期的平均收盘价然后相连生成的一条线。使用均线来量化趋势有多种用法。最简单的是使用一条均线,价格在均线之上表明当前为多头市场,价格在均线之下表示当前为空头市场。另外一种用法是使用两条均线,一条短周期均线,一条长周期均线,短周期均线向上穿越长周期均线表示多头市场的开始,反之表示空头市场的开始。另外一种用法是使用多条均线,当短周期均线和长周期均线依次从上向下排列时,表示现在为强烈地多头市场,反之,则表示现在为强烈地空头市场,其他情况表示当前市场没有趋势,处于震荡中。

如何选择均线的周期是一个重要的问题,需要结合市场情况来定。首先,趋势交易者需要排除掉交易不活跃,流动性差,盘子小的市场,因为这些市场通常没有明显的趋势,并且价格容易被主力操纵。一般来说,20日均线是一条非常重要的均线。我个人比较倾向于使用双均线法,双均线法相对假信号比较少,并且反应比较灵敏。我一般采取5日均线和20日均线。采用什么周期的均线,需要通过对该市场的回测来确定,选择出现信号相对稳定的周期。

持续跟踪

趋势跟踪需要保持高度的专注,成功的交易者一般都是专注于一个或少数几个市场的。同时追踪的标的不能太多,个人认为不超过3个为宜。因为人的精力毕竟有限,追踪过多的标的容易错过大趋势。很多新手刚进入股票市场喜欢买一堆股票,啥股票都想买点,这是很不好的做法。对于股票市场,最好的做法是选择两到三只股票作为长期跟踪对象,轻易不换。怎么样才算是做到了持续跟踪呢?我认为,做到任何时候知道该标的当前价格,知道该标的过去最少一年中的整体走势,说得出最近几次重大转折,才称得上是持续跟踪。

资金管理

趋势交易做的是长线交易,为了避免市场的突发状况,风险控制是非常重要的,而仓位控制是风险控制中最重要的一环。对于股票这种全保证金市场来说,仓位控制不是什么大问题。对于期货,外汇这种高杠杆市场,控制杠杆比例就非常重要了。控制风险是为了保证我们遇到极端情况,能在市场中生存下去。毕竟,我们能赚无数个100%,但永远只能亏1个100%。只有在市场中生存下去,才可以谈盈利,否则本金都没了,还怎么赚钱。

对于趋势交易而言,可能大部分交易都是不赚钱甚至是亏钱的,只有少数的交易赚了大钱。趋势交易是通过低胜率,高赔率获胜的。所以,如何保证在错误的时候少亏钱非常重要,需要采用试探,加码的买进策略和严格的止损策略。在指标发出买入信号时,买入初始仓位,如果价格继续上涨确认了这个信号,则继续加码,直到满仓为止。所以,对于趋势交易来说,通常是买高卖低的,这和通常人们理解的逢低买入,逢高卖出是相悖的。

遵守纪律,机械操作

对于趋势交易者而言,交易的机会是相当少的,大部分时间都是在等待,等待市场发出买入和卖出信号。所以,在市场没有信号的时候耐心等待是非常重要的。另外,在市场发出信号的时候,坚决进行操作也是非常重要的,因为你不知道这次是否是大趋势的开始,错过趋势对于趋势交易者来说是最可怕的事情。可能这时候信号和你的感觉是相反的,但你要相信市场发出的信号,而不是自己的感觉,因为你的感觉大部分情况下是错误的。

永远保留底仓

对于跟踪趋势的交易者,除了错过趋势之外,跟丢趋势也是非常可怕地。这通常是过早的止盈导致的,结果失去了后面更大段的利润。趋势交易要求交易者在趋势启动时跟进,在趋势反转时平仓。但在趋势运行中,价格通常会有重大的反向运动,满仓看着浮动盈利损失大半是一件非常煎熬的事情。这也是趋势交易最难的一部分,很多人因此选择了日内交易而非趋势交易。为了保护利润,提高资金利用率,可以根据次周期的其他技术指标或K线形态来进行止盈,波段操作。但是,止盈不是清仓,在趋势没有结束之前,要永远保留一定比例的底仓,并且在合适的时候,补回止盈的仓位。这部分底仓,是趋势交易者的根基,一定要留到趋势确认反转之后再平。丢失自己的仓位,也就是丢了自己的根基,对于趋势交易者是件危险的事情。