
新用户的几个小窍门
介绍
有句俗话说的好:从来不犯错误的人将一事无成。这一点应该无法反驳,除非你认为闲着什么都不做也是一种错误。但是俗话说吃一堑长一智,你可以通过分析过去的错误(包括你自己的和他人的)来减少你将来可能会犯的错误。让我们来试着看看我们工作中可能会遇到的一些情景吧,这里所说的工作指的是站内的“工作”服务项目。
我们的目标是尽量客观,无论如何,它代表了执行方-开发者的角度。在我们正式开始之前,我需要指出下面几点:
如果出现相同的名字,昵称,图像或者其他素材,那纯属巧合. 所有下面的判断,统计分析只是表明作者的个人观点,不表明一定正确无疑。
1. 工作服务 - 我们为什么需要它?
是否使用 工作 服务呢 - 仁者见仁,智者见智吧。要是换我说的话,肯定要使用. 下面是我对这个问题的几点看法. 针对客户方和执行方之间交互出现的主要问题,我们可以着重看以下几点:
- 不清晰或者模棱两可的需求规范导致执行方的工作成果和客户所需要的差异很大。
- 客户担心执行方获得预付款以后不去做工作或者只做其中一部分;
- 执行方担心客户取得全部工作成果后不付清余款。
- 双方出现争议后,都觉得自己百分百有理,也无法找到折衷方案.
上面的后三点情况可以完全解决,需求不明确的状况也有办法处理. 基本上唯一的弱点是 - 这需要客户和执行方都多做一些步骤 - 下单,转帐,经过一些中间步骤等等. 但是我相信,为了自己放心而且确定花出去的钱不会浪费,工作确定完成,这点付出还是值得的.
这样你最终决定使用工作服务,下个订单,开发或者修改一个自定义指标,智能交易程序或者一段脚本. 在你正式开始之前,请熟悉一下: 使用工作服务的规则. 如果你还没有看过,现在是时候补补课了.
进一步来说,我还要推荐以下两篇文章 "怎样买到你想要的智能交易程序" 和 "怎样购买MQL5和MQL4下的交易机器人" - 这两篇文章会帮助你了解怎样进行严谨和高效的工作,毕竟您是个严谨和训练有素的交易人员,因为这项职业需要的是细心和严谨的工作.
2. 常见订单种类
让我们把常见的出问题的订单分分类,做个不完全统计, 这些有问题的订单大致由以下几类构成.
2.1. 认为外汇交易很简单
如果一个客户并不真正清楚他需要什么而且也不知道其工作原理,通常情况,他可能是一个外汇交易新手,七拼八凑地学习了一些知识,然后认为做外汇交易很简单,在一个感兴趣的图表上加上两条交叉的 移动平均线(МА's) ,也在上面加上 MACD指标 (甚至还不知道这个和两条 移动平均线(МА's)是一回事), 然后就确信他找到了一个好的交易系统,只需要根据这个系统编写代码做成智能交易程序(EA),然后就能开始大赚特赚了。
这种客户下的订单通常是这样写的:简单的智能交易程序,简单的自定义指标或者其他各种包含“简单”或者“不算复杂”字眼的需求文字。相应地,开出的价格一般10到20点积分. 要知道,“工作”服务不允许更低的报价了。
和这一类客户讨论的时候,他一般不会承认自己是新手,也不会认为自己的订单没有什么意义,报价不合理。因为一些原因,欧美国家说英语的人中更倾向于承认这些缺点甚至寻求一些关于他们系统操作方面的建议。
我这里能给的唯一建议是,在使用“工作”服务之前,你需要在更长的时间段里面(至少一年以上)认真手动测试你的系统。或者,也可以在测试器的可视测试模式下面使用已有的智能交易程序进行交易的测试,比如Trading SIMULATOR 2 或者其他某些程序。
2.2. 盲目使用指标
另外一种新手的常见特点是,使用很多各种各样的指标,结果产生相反的信号。还有一种很常见的情况是,在同一个指标窗口中把多个不同尺度的指标组合在一起(有的时候是用不同顺序),然后观察信号出现时候这些指标相互交叉的情况。外汇交易新手还有其他比这更多的习惯。
如果你试图向他解释这是不可行或者没有意义,因为他缺乏相关的知识和理解,可能直接驳回,认为开发人员做这些很容易。也就是说,使用交易终端的时间越少,就越确定缺乏相互理解,这两者大概成反比。
让我们看一个组合指标的例子。把在0到100范围内规范化后的 相对强弱指数指标(RSI)和一个没有在一定范围内(从0到某个未知数)规范化的 平均真实波动范围指标(ATR) 组合在一起。在ATR线在下一个柱的下方和RSI交叉的时候我们买进,下图中有个灰色的长方形(图1) 表示一个新出现的购买信号,
我们用点竖线标一下,看看下面出现什么情况。
图1. 买入信号出现
下面一张图片(图2) 也显示了一个买入信号而且更强,只是由于某些原因它转到左边了( 点竖线在时间轴上的位置并没有改变),看起来我们应该进场更早一些,这里有问题了。.
图2. 买入信号还在那里
第三幅图片(图3) 令人完全摸不到头脑 - 信号消失了,似乎从来就没有出现过似的。这就是使用不同尺度指标的结果(当几个不同范围取值的指标需要显示在同一个图表中时以便它们能够通知显现)。
图3. 信号消失了
另外一个常见场景是,拘泥于在历史数据中看某个指标的表现而产生错觉。他并不明白,很多指标的数值变化依赖于一定范围的价格改变,而他们最终的数值形成是根据图表中几个柱的数据计算的,这个时候进场可能已经太晚了。这就是所谓的“重画”。最典型的例子指标是之字转向指标(Zig指标或者Zig Zag).
和这类客户讨论就像在黑屋子里面找一个丢了的黑帽子,要花很多时间,最终双方要很有耐心才能同意妥协甚至成为了心理学测试。.
这里有个很简单的技巧 - 在动态环境下检测指标。看图表根据时间和价格变化的时候信号是否会消失。看当价格改变的时候,前面指标的曲线或者柱状图有没有改变?你可以在测试器的可视模式的图表中加入你所需的指标,然后检查它们的变化。任何终端附带的EA智能交易程序都可以在这里使用。
2.3. 人工系统的自动化
这是最复杂的类型之一。,一个人可能是训练有素而且成功的交易高手,但是他把他的交易系统变成某种算法的时候,可能最终要把图标中的每个价格和指标的数值都描述清楚。这是因为他是根据直觉来交易的,交易信息的处理是隐藏在潜意识中,输出的是最终结果。这样的交易人员并不知道结果是如何导出的。
如果系统建立失败了,最好的选择是逐步自动化交易过程。任何系统都是有标准的元素组成的(打开/关闭 仓位/订单, 风险控制, 仓位管理等等)。把你的工作分成阶段,然后分别处理每个阶段。这样交易过程逐步就能够全部自动化.
第二个选择是立马放弃全自动系统的想法,专注于开发一个半自动系统. 大致过程是这样的: 交易人员决定什么时候在哪里开启仓位,其他部分由EA智能交易程序完成。要不然,你也可以设定进场的时间和/或价格范围,定义成一定的条件,然后智能交易程序监测这些条件,当条件在范围之内的时候开启仓位。
这样的话,最好分两步进行. 第一步是从开发半自动系统开始,用来处理主要的常规的交易操作. 第二步把你的工作分成几个阶段,每个阶段都是最终版本智能交易程序中独立的行为。前面两步也可以相结合来做.
2.4. 使智能交易程序去泡茶
有的时候,有些订单只是在需求规格的一小部分中列出一系列关于交易模式的功能,而其余大部分写的是监测计算机环境和网络,发短信息和通知电子邮件,跟踪各种故障包括交易程序环境的细微改变。然后用声音(或者语音)通知给客户.
以上这些,如果客户和执行方都想去做的话是可行的,但是客户一般不会愿意花钱做这些功能,智能交易程序真的需要做这些吗?我相信不需要。这样的智能交易程序也不能保证能够独立工作, 因为总有可能发生致命错误(比如断电)。
所以这一类功能在智能交易程序中只要很简单就可以了,这样的话,开发智能交易程序不仅需要的钱会少一些,而且也会使程序更可靠,因为功能越少,错误也会越少。
2.5. 做那个,不知道做哪个
这句话的前一部分 - "去那儿,不知道去哪儿",常用在客户和执行者之间工作即将做完的时候。因为交易系统并不会考虑周全, 在开发智能交易程序(或者指标)的时候,客户会要求进行修改,增加和删除需求规格。
我认为,如果这样的变化从编程角度上看不需要很多精力,那是可以接受的。一些细节是很容易忽视或者忘记的。然而,有些从客户角度看起来很应当的改变实际上需要修改智能交易程序的基本部分,最关键的是,这些改变会要求改变程序的逻辑。常见的例子是,智能交易程序从原来的直接从市场下单改为挂限价单。
这里能给的建议只能是,需求规格对执行者和客户都要完整清晰。对需求规格的修改时间有的时候可能比开发工作本身还要长 . 而且我相信,确定目标也是工作的一部分,所以这很正常。
3. 理想的需求规格,是什么样的?
一般来说,从为开发而写需求规格的结构角度,理想的需求规格大致如下:
3.1. 操作环境
需要开发的终端 (是MetaTrader 4或者MetaTrader 5). 这是订单中最重要的,也是通常在需求规格中被忽视的。这应该在订单主题中说明,因为不是每个开发人员都同样熟悉MQL5语言,或者相反,开发人员可能直接学习了MQL5而没有学习MQL4。
3.2. 开发所要对应的交易中心或者交易经纪公司
这个信息在开发EA智能交易程序或者脚本的时候需要。不同的交易中心或经纪人可能有不同的特点,比如:订单的执行,最小/最大手数, 隔夜仓位, 报价的小数位数, 账户的币别, 跨周报价是否需要额外处理, 固定点差或者浮动点差, 运作是基于新柱开启还是每一订单, 等等。
客户最好根据自己的交易中心或经纪人的特点,用所需的币别开一个模拟账户,然后在给开发人员使用。这是必要的,因为有些交易中心(比如Oanda)在开模拟账户的时候还是需要在它的网站注册并且填写一些资料等等。这将会节约开发人员的时间,可能在程序调试和测试工作中需要。
3.3. 开发是需要针对真实账户还是只需要测试或者模拟账户
这点区别其实很关键. 测试过程中,速度是最关键的 (它会影响优化的时间), 而且为真实账户做开发的话,有一部分重要的工作是做错误处理和恢复机制,当EA交易程序遇到各种连接失败或者终端重启后能够重建回正常状态。也就是说,测试针对真实账户的智能交易程序,需要的时间可能多几倍甚至几十倍。这也会很大程度上影响所需开发经费的多少。
所以这个时候你需要问自己 - 我真的需要针对真实账户的智能交易程序吗?如果开发只是做试验或者验证算法而没有最终确定不做修改,就没有必要特别定制为针对真实账户。而且这可能使优化过程变得很慢。你可以在算法确定以后再定制一个针对真实账户的开发项目,这样并不会贵多少。
3.4. 操作算法描述
还应该提供一个外部参数的临时列表(如果可能需要的话),指定想要的名字和默认值。这会很大程度加快开发人员的日常工作,也帮助避免询问一些不必要的问题或者寻求客户方的解释。
3.5. 显示信息的类型
这里应该特别制定,因为客户可能不希望显示所有信息. 所以最好在完成需求规格的时候把它排除. 如果需要在智能交易程序或者指标工作过程中显示某些信息,最好提供适当的格式,指出图表执行操作时的背景颜色(黑,高亮,白或者其他)。
如果需要插图来更好的解释操作算法,也应该提供给开发人员。用插图配合以对应的注释来解释算法,比用几页文字都更加简单和清楚。
准备得很好的需求规格,毫无疑问将会有助于开发的完成,获得期待的结果。所以,在处理您需求规格的要点是,不要试图节约时间,否则在开发过程中你需要额外的精力。
3.6. 其他杂项部分
这里你通常可以找到常规的条款和要求,可能是要求在工作的最后阶段提供源文件(代码),源文件中提供注释,修改错误的期限和其他要求。
4. 关于调试和测试
这是根据需求规格,检查指标或者智能交易程序是否实际符合要求的阶段。你可能知道,计算机编程的墨菲定律里面有一条就是:每个程序至少都有一个错误。还有个推论的说法是: 每个被发现和修改的错误都说是最后一个。当然,上面的定律像是个笑话,但是当程序(包括指标和智能交易程序)比较复杂的时候,其实和事实还是很接近的。
从而可以引申出另外一个结论:如果在你接收了工作以后发现一个或者多个错误的时候,你不应该怀疑开发人员有不良的企图或者能力不够。我相信,衡量执行人员提供服务的质量,主要还是看他在工作中是否能迅速有效的改正那些错误。
我认为,针对使用多种逻辑条件和分支算法实现的复杂系统,在测试的时候最好使用渐进式开发和测试。那些问题应该被分割成逻辑相互独立的几个部分,然后由客户挨个解决和测试,最后一起执行。最后,关于部分间相互关联的测试部分,应该早点测试保证能够一起工作。
工作简单还是复杂的概念理解主要取决于执行方的经验以及客户方对工作细节的理解程度。MetaTrader 4 和 MetaTrader 5 都提供了多种多样的测试方法和技术,一些用户并不了解(或者忘记了,其实我之前也提过一些)可以在历史数据上面运行智能交易程序. 而其中最重要的是测试器可以在 可视测试模式下运行.
这种测试方法非常强大也很方便,自定义指标和智能交易程序可以通过几分钟的快速测试模式在历史数据下作测试,而且可以直接看到执行交易的相关信息来监测测试的成绩和结果. 行情的表现还可以放慢甚至暂停,从而给您时间来分析某些交易的细节。
通过测试器中的测试,您可以在模拟账户中验证智能交易程序的工作效率。模拟账户中用一天半时间进行实时工作,通常就足够确认了。另外,尽管提供了很长的时间区段设置选项(如星期图或者更长的),这些图表不大会用于测试。
5. 描述发现的错误
对于描述用户所发现错误的最佳方式,我还想提几点。看个极端的例子吧,错误不应该这样描述:你的智能交易程序完全不工作,它应该能开多个仓位的,可是一个都没有。
如果不提供任何关于资产,时间区段,参数表的相关信息,开发人员只能够猜测在客户终端中到底发生了什么。
我认为,发现的错误或者缺陷最好用图片来描述. MetaTrader 4 和 MetaTrader 5 都提供选项可以把图表保存成图片,MT4支持GIF和BMP格式的图片,MT5支持GIF, BMP和PNG格式的图片。PNG格式是推荐的格式,因为它能够完全保持图片的清晰度.
图片的清晰度对于正确访问图标中的线条和数据非常重要。
在MT4终端里面,大致如下图所示(图4). 您只需要用鼠标右键点击所需的图标,然后弹出菜单就显示出来了.
图4. 把图表图片保存成文件
在MetaTrader 5中,有类似的过程,使用相同的命令,在菜单中选择 另存成图片,其实这个命令包含的内容不大一样 。
当选择了这个菜单命令后,会出现一个新的对话框,用来设置分辨率和图片范围。如下面图5所示:
图5. 设置存储图片的参数
保存图标所在窗口的图片, 选择 活动图表. 选中活动工作区 选项的话,将会保存整个终端窗口,有些时候需要同时看几个图标的情况下比较有用。
这里不推荐修改分辨率,因为这可能损害保存图片的质量。
图片也可以通过使用Alt+PrtScr 快捷键或者单个 PrtScr 键来保存当前窗口或者整个屏幕截图到剪贴板,再进一步用图像编辑器修改。
然后你就可以在图像编辑器中打开和编辑(如果需要)完成的图片文件了,比如增加一个图表中对应地方可能出现错误的文字说明。最简单的编辑图片的方法就是使用Windows附带的画笔程序。这个还是看个人习惯。
6. 需求规格说明中隐藏的陷阱
作为一个规则,他们会因为各种原因:缺乏股票交易和外汇交易中价格细节的理解,缺乏对尺度以及时间轴价格轴的理解。在讨论需求规格的时候,开发人员是否会注意这些要点或者选择一个正规的方法是非常依赖于他是否了解市场交易的细节知识的。当然,还要诚实。
用民间艺术的比喻,当书写需求规格的时候,客户经常天马行空,而不是理性地注重在外汇交易或者财务市场中的价格规律。
6.1. 价格变化的离散性
让我们看一下下面的实际例子. 需求规格上的一句话基本上有以下作用: 当价格达到某个外部参数指定的数值时,开启一个买进仓位. 一个人可能会认为,这没有问题,这里有个价格,当数值达到的时候,就激发一个条件,很简单。
这里被忽视的一点“小事”是,图表中价格的变化是分离的(从一个点到另外一个)而不是连续的,激活了用折线方式显示图表的选项,我们就能在屏幕上看清楚了,价格变化并不连续,图标中真实的价格系列包含了分离的点,
下面的订单图表实例(在简单形式下)也表现出来这一点。
图6. 分离的价格变化
特定的价格用水平实线表示,而真实价格用红色和蓝色的点来表示。仔细看看这个图表,你可以发现,从技术上看价格 从来都没有 恰好达到指定的级别。所以,从最初的需求规格逻辑上看,条件从来都没有触发。
一个重要注意事项 - 所有价格的比较陡应该准确到一个点的单位。举个例子,如果市场报价在小数点后有五位,一个点等于0.00001 - 这将作为价格比较的精确度。你应该记住,分离的价格变化是不只一个点的,
所以,就算我们看到的价格看起来达到一定的级别,在需求规格中条件从来都没有遇到过。为了把需求规格中指出的理想价格拉回现实,你需要这样做:给价格上下加上两个限制。它们在图6中显示为虚线。限制的范围依赖与交易系统,大部分情况下,要满足2到3个单位的平均点差。
这样,在虚线之间的点位都将被认为达到了某个特定的数值。在上图中它们都被绿圈圈上了。
让我们回到需求规格去修改一下: 当价格数值达到由外部参数指定的正负区间的时候,开启一个买进仓位.现在这就好多了。
另外在现实中还要考虑到的是,和交易经纪人服务器的连接可能在任何时候中断,价格可能偏离到任何距离直到连接恢复。在上图中,这个区域(丢失了和经纪人服务器的连接)用粉色长方形框出了。显然,这一类情况在需求规格中也要考虑到。
让我们再修改一下需求规格: 当前面的价格低于外部参数指定的负差值,而且现在的价格在 外部参数指定的正负区间之内,在一定时间范围内价格也没有高于指定价格的话,开启一个买入仓位。 现在所有方面都正确了。
6.2. 在特定时间激发
一个需求规格说: 在由外部参数指定的时间,使用某个价格距离挂起两个买进和卖出的单。这里,你要分清楚两种不同的终端 - MT4和MT5。MetaTrader 5中允许使用最小一秒的计时器和同等精度的倒计时,而MQL4和MetaTrader 4不提供计时器。
所以,在MT4中为了做标准的时间倒计时,我们通常在EA交易程序或者指标中通过市场报价时间来获得。因为报价时间并不均匀,而且连续的报价单之间的时间间格可能大于很多秒,在不活跃的市场甚至超过几分钟,所以我们不能保证绝对准确地在某个特定时间激发订单。另外一个在MT4中标准的倒计时方法是使用一个循环的EA交易程序,但是这很不方便也有一些缺点。
所以这部分需求规格最好被这样修改:在由外部参数指定的时间 允许一定误差的情况下挂两个一定价格距离的买进卖出单 .
6.3. 使用通常和多义的名词
这里有个典型例子: 当市场平坦的时候,这样做。当出现明显趋势的时候,那样做。. 这样指定好以后,客户就认为不需要什么其他细节了,后面就是直接而简单的编程任务来确定趋势/平坦了。我相信这里不需要做其他说明了。
还有另外一个例子: 在极限情况下挂一个单。很显然,客户对极限情况的解释没有包含在需求规格中。事实上,可以从图表上引申出来的内容何必解释呢,实际上这些极限情况可以用一些不同的算法得到,而其中的优缺点可能使客户很惊讶。
6.4. 使用通用词语表示普遍的意义
这里指的是一些日常生活中看起来很清楚的词语在需求规格中绝对不合适。这里是一些例子。一个需求规格写道: 如果指标线形成两个一个接一个的凸起,第二个比第一个矮... 之类, 这样应该给一个分离之类的描述.
读到前面的时候会产生很多问题:什么样子可以认为是凸起,这种凸起之前最大/最小距离有什么要求才能被认为在一起,第二个凸起要比第一个矮多少,等等。
类似于很多/很少,小/大之类的词语也会经常被使用。你要明白,编程是基于数学的,它需要明确数量的定义,没有其他方法。
7. 什么时候求助仲裁?
很明显,您应该在工作完成之前申请仲裁,比如最后一步-交付工作或付款之前,否则财务相关因素将会束缚住客户方和执行方,这个条件是基本的。
一般说来,唯一求助仲裁的原因是出现的问题没有办法由客户和执行方私下之间解决,打个比方,客户认为交付的工作有不正确的行为,而执行方不这么认为。
另外一个可能的选项是 ,客户方或者执行方在很长一段时间以内消失了,他们不回复私信或者邮件等等,同时,工作还没有完成,客户的钱一直被封在自己账户中。或者相反,工作早就完成了但是没有办法获得付款。可能会包含有各种不同的情节,但是这些情况都应该而且能够通过仲裁解决。
当双方都过于急切地结束需求规格而开始工作的时候,这种情形非常常见,晚些时候就会发现,需求规格不能用,在一些要点上需要更多的细化和澄清,随后,订单价格可能需要修改,工作到了这一步只能通过仲裁来回滚。你最好多花时间再次回顾需求规格,而不要赶时间开始工作。
结论
希望这篇文章对新接触工作服务的用户有所帮助, 主要是第一次的客户。这篇文章不可能覆盖所有问题,而它只是开始千里之行的一小步。我们应该彼此放轻松一些,不要在我们周围的世界中投入太多负面情绪,他们不能使任何人的生活轻松,不管是客户还是执行方。
客户喜欢问的问题列表
1. 问什么有些开发人员不喜欢用Skype, ICQ, 电话,电子邮件之类的工具谈话和交流?
我认为这里主要有两点原因。
首先,一个开发人员可能有多个客户,如果他和他们中的所有人都在线讨论(如果他不需要同时就好了),他就会没有时间编写程序了。想用Skype或者ICQ来更快地解释问题几乎是不可能的。
第二,之前的这些沟通工具都缺乏一个重要特性 - 为说过的东西做文档。重点是,当出现纠纷需要仲裁是,书面的订单相关交流材料可以证明每一方是否错误或者无辜。
2. 为什么一启动编译好的EA交易程序/指标(.ex4或者.ex5文件)终端就关闭了?
很可能你已经安装的终端版本比编译程序的版本要旧。你应该更新终端程序到 最新的可用版本。
3. 在编译EA交易程序/指标文件的时候,这些错误是什么意思 - 函数'xxxxxx'没有被涉及,将会被从exp文件中删除。
这并不是一个错误。这个消息是说,函数'xxxxxx'没有被使用而不会出现在编译好的文件之中。你可以忽略这个消息,因为这些多余的函数在任何方面都不会影响到EA交易程序或者指标的运作。
4. 当编译EA交易程序/指标文件的时候,出现了 - 不能打开'xxxxxx'包含文件的错误,是什么意思?
这个消息是说,'xxxxxx'文件或者没有在转交的时候拷贝到你的电脑上或者被拷贝到了错误的目录中,通常.mqh文件应该放到终端的include目录下。
5. 在EA交易程序运行过程中,为什么当仓位在止盈/止损时被关闭时没有标志?
这个特性只有在策略测试器中运行EA测试程序才会出现,在真实或者模拟账户中工作的时候不会有这种功能。你可以按住鼠标左键,把帐户历史中的感兴趣的交易拖到图表中,这样指出仓位开启关闭的标记就出现在图表上了,他们之间有虚线相连,就像在策略测试器中测试的时候那样。
6. 通过历史图表显示,就算所有进场条件都满足了,仓位还是没有被开启(没有下单)
你可能遇到的情况是,EA交易程序使用的指标遇到了重画。在某个时刻,这些条件(指标的某些值)没有满足开启仓位的信号,而后,后面的几个柱的指标值改变了他们在历史中的数值。这可以简单地通过测试期的可视模式检查。
7. 在原型/测试模式 - 模拟阶段,怎样取消工作?
这只能通过仲裁来取消。
推荐链接
本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/361
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.


妄想是一种轻描淡写的说法。
生活就是这样。:-)
这是另一个悲伤的故事
嗨,真是篇好文章......谢谢。
您好
搜索市场。