交易新手的十个"错误"?

rsi | 26 一月, 2016

简介

一个交易新手总会被一遍一遍这样告知: "趋势是你的朋友, 不要逆势而行". 或者"快速斩断你的亏损, 而让利润奔跑" (参考资料 [1]). 看起来真的没有质疑这些声明有效性的空间, 特别是它被许多研究所证明(参考实例[2, 页面35-40]). 有谁会怀疑"根据趋势"建立仓位并取得利润呢?!但是如果我们犯了一个错误或者市场变得"没有趋势"了呢?然后就开始有了这样的说法: 为了减少风险, 应该使用对冲技术, 因为在一个波动较大的市场, 我们可能会在定义趋势或者预测价格无序变化时犯错, 等等. 意思是说我们应该做一些考量 - 这样可以避免一半危险的预测 - 如果价格走向我们没有预测到的方向.

这样, 我们必须考虑价格无序变动的事实. 所以, 所以试图"教导"我们的东西都无法保证盈利的结果. 否则, 为什么会有"交易中新手的错误"出现呢?他们都是新手, 所以没有时间去忘记那些已经作为使用的"十条戒律"之类的格言.

作者并非想责备我的同僚Collector. 他认真地给了他的文章[1]一个众所周知的, 许多人公认的并且经常重复的理论. 这种思想广泛传播因为很多书上都倾向在市场上只使用一个仓位来取得利润. 这就意味着他们认为应该在建立一个新的仓位之前关闭已有的仓位. 我将会把这种使用一根鱼竿钓鱼 - 一个很好业余者的娱乐活动, 和通常使用不同鱼钩和鱼线的专业人员做比较. 当我们关注一个交易系统的时候, 最好不要把它局限为只分析一个订单. 我们可以根据情况, 使用顺序和同时开启与关闭订单的方法, 通常的提醒在作者看来, 可以被立即认为是适应价格行为的机会, 也是交易系统开发者的基本"判断范围", 而不仅仅是为了节约资本.



交易新手的十个"错误"?

假设我们有一个"为负"的买入仓位. 根据公认的规则, 我们应该尽快关闭他 – "让您的亏损最小". 但是, 要我说, 我们刚刚决定要买入, 意思是我们确认价格会上涨 - 例如, 一个"经过检验"的震荡指标已经在超卖域发现了背离. 为什么是现在, 当价格更低, 更倾向于买入的时候, 我们应该退出市场吗?更合理的方法是同方向进入市场来加强买入仓位. 这个至少看起来更合逻辑. 现在总利润应当是两个仓位之和, 而不是分成一个和一个. 在这种情况下作者有时会建立第三个仓位, 但是是一个卖出仓位. 然后结果依赖于三个订单.

它操控着有限数量的订单(包含建仓, 平仓, 选择交易量, 在根据价格变化和其他条件时修改止损和获利水平, 等等). 必须形成一个交易系统的基础. 针对通用中的特例, 订单数量的限制可以是一个, 两个或者三个.

确实, 没有人会介意跟随趋势. 问题是: 我们怎样才能正确并且及时识别它?我们可以说, 大多数系统都只能说"是还是不是?".

如果比较使用不同平均周期的布林带, 很容易发现更长的周期数也会更宽(参见下图:小周期数是70分钟, 而大的周期数是370分钟). 更大周期数分散于更小周期数均值之外.



平均线(移动平均) 向后移动一半选定的周期数可以看作是趋势线 (尾部). 假设我们知道下一个短周期平均值会如何改变, 价格的随机改变可以认为是在更短周期决定的平均值周围分布(趋势边的漂移). 看着明显不稳定的价格变化过程(短周期等于柱的长度), 每个人都'看到'(只是因为每个人想要看到)随机过程的总和(由小周期数内的价格在高低间波动形成, 只是数值较小), 未知但是并非随机的, 在更大范围内的预先定义的过程(趋势). 这创造了一种假象, 认为可以猜测未来近期的趋势. 在价格图表上, 我们'看到'技术分析对象就和我们看云时看到动物或者其他事物一样. 我们只能看见我们想看到并且准备看到的东西 - 我们的感觉就是这样工作的.

统计无所不知. 它说到, 平均来看, 猜对的可能性接近0.5, 对非常成功的交易者来说也是如此. 但是他们并不是因为猜测而获取的利润. 他们是因为他们的经验, 操控仓位的能力, 对冲, 组合, 等等, 同时也是因为他们的幸运 - 只要读读他们的专访就可以了. 如果一个初学者拒绝这些尝试, 只是认定此过程是完全随机和几乎静止的, 这不是更加简单一些吗?我们会从中获得什么呢?

首先, 很明显, 任何对平均值的偏离都可能回到初始状态, 所以我们不应该担心逆势下单. 也不需要害怕某个仓位亏损而匆忙关闭它.

第二, 外汇交易将变成世界经济的一个稳定因素 - 逆势交易会创建一个负反馈而减小汇率的波动. 另外, 经济本身是会自我调节的 - 上升的汇率会提高出口价格而刺激进口, 从而使汇率下降, 诸如此类. 也许说的过于简单了(也有些累赘了), 不好意思. 也不需要过高评估此种情形, 担心如果每个人都逆势交易会造成汇率固定不变 - 那是非常遥远的, 并且最重要的是, 还有其他(基本)因素影响汇率(这是时候进行基本分析了).

第三, 在文章[1]中描述的交易新手的"错误"就变得根本不是错误了, 而只是正常的步骤. 让我们挨个研究它们 [1].

  1. 当市场刚刚开放时交易

    因为我们已经放弃了猜测趋势方向的全部希望, 就不需要等到某个适当时机了 - 一旦允许交易我们就立即进入市场. 可以同时以相同交易量建立两个仓位, 而方向是相反的 - 一个卖出一个买入. 其中的一个将会早一些获利, 当价格返回并走向有利润的方向时, 另外一个也可以晚些获利. 从开始时刻直到两个仓位中的某个关闭之前, 交易可以是100%对冲的, 风险为0(如果有的话, 我们亏的只是手续费, 点差, 以及假如关闭它们的时间超过一天而形成的隔夜利息).

  2. 获利过于匆忙

    获利从来不嫌早!我们并不会因此而使情况更糟. 如果我们已经固定利润, 例如, 一个买入仓位的价格已经低过了点差+手续费, 我们可以再次买入 - 我们将可以在同一价格段内获得双倍利润, 而不会失去之前的利润!例如, 我们在1.2300买入, 在1.2340关闭了仓位; 然后价格跌到了1.2320 - 再买. 如果价格又上涨了, 我们会再次在上述范围获利, 即1.2320 和 1.2340之间. 如果我们没有在1.2340处固定利润, 我们就会在1.2320处赢20个点, 而不是更好的40个点.

  3. 在亏损仓位加仓

    … 有的时候如果一个亏损仓位只是偏离平均值的结果, 它回归平均值的可能性较大,那就应该在此仓位上加仓, 而如果未来价格再走向"错误的方向", 就应该加更多的仓位.

  4. 从最好的仓位开始平仓

    这和第二项很雷同. 最好是关闭获利的仓位, 而不是亏损的 - 后面的如果我们现在不关闭它们, 未来可能还会盈利!

  5. 复仇

    如果我们不关闭亏损的仓位或者把亏损仓位和获利仓位一起关闭, 就不会有这种感觉. 在交易系统中总是获得正向的结果, 测试结果将在文章末尾提供. 另外, 只有人类才会感觉要复仇. 创建了一个自动交易系统, 我们将会保护自己不受情绪影响.

  6. 最喜欢的仓位

    当对亏损仓位加仓时, 最后加上的当然就是最喜欢的. 如果价格继续下跌(我们现在所说的是买入仓位), 我们继续加仓. 但是正是最后的"加仓"给了我们总的收益 - 和开始的仓位看来它在最底层.

  7. 使用'永远买入'的原则进行交易'

    使用这种原则交易可能是因为两点原因. 第一, 我已经发现, 就算一个仓位已经很"老"了, 也不应该匆忙关闭它 - 应该选择更好的时机 (参见语句1和4). 第二, 可以通过隔夜息获利 - 每年350% - 同样不坏. [3:356]

  8. 第一天就关闭了获利的仓位

    这里我们重复第二句话 – 关闭获利仓位永远不会过早.

  9. 当有提醒建立反向仓位时平仓

    受到高度尊敬的Collector在他的文章[1]中没有排除这样的可能性. 本文作者不认为这是一个错误 - 他只是交易系统的一个元素.

  10. 疑虑

    以我的观点, 没有交易者会没有疑虑. 乔治.索罗斯(George Soros) 曾经说过(重组了拿破仑的名言): "先进入市场, 然后再想后面怎么做". 这主意不错, 但是第一部分 - "关闭全部仓位"我会把它改述为: 让你的电脑管理它们, 出去走走.

所以, 在文章[1]中所宣传的"十条戒律", 或者其他人在任何地方所说的都不能作为绝对真理或者战胜亏损的万能方案. 目前, 只有一种方法可以使新手或老手犯下更少的错误 - 把他或她的交易系统在计算机上建立模型, 然后在历史数据中检验它们 - 这不能保证操作没有错误, 但是可以通过精确计算而不是隐含的信念来支持它们.

交易策略的解释

但是, 基于提出的方法来检验交易系统将是合理的 - "没有夜莺依赖童话生活", 我们很幸运, MT4里有全部这些奇妙的工具. 为了避免受到其他因素的影响(选择进场时间并根据提醒离场), 我们在EA交易[4]中将绝对不使用提醒 - 我们不根据"是还是不是"来交易. 我们会同时开启两个相反方向的订单, 立即执行, 也就是说, 我们犯了错误#1和#7.

   kk=0; 
   tic=-1;  
   if (sob) 
         {
         if(max_lot_b==0.0)lotsi=0.1;else lotsi=2.0*max_lot_b;
         while(tic==-1 && kk<3)
            {
            tic=OrderSend(Symbol(),OP_BUY,lotsi,Ask,slip,0,Ask+(tp+25)*Point," ",m,0,Yellow);
            Print("tic_buy=",tic);
            if (tic==-1)
               {
               gle=GetLastError();
               kk++;               
               Print("Error #",gle," at buy ",kk);
               Sleep(6000);
               RefreshRates();   
               }
            }   
         lastt=CurTime();
         return;
         }
      tic=-1;
      kk=0;  
      if (sos) 
         {
         if(max_lot_s==0.0)lotsi=0.1;else lotsi=2.0*max_lot_s;
         while(tic==-1 && kk<3)
            {
            tic=OrderSend(Symbol(),OP_SELL,lotsi,Bid,slip,0,Bid-(tp+25)*Point," ",m,0,Red);
            Print("tic_sell=",tic);
            if (tic==-1)
               {
               gle=GetLastError();
               kk++;               
               Print("Error #",gle," at sell ",kk);
               Sleep(6000);
               RefreshRates();   
               }
            }
         lastt=CurTime();
         return;
         }

如果它们中的一个达到了获利水平, 在获取了利润后再次开启它, 也就是说, 我们接连犯下了错误#2, #4 和#8..

   sob=(kol_buy()<1 || buy_lev_min-sh*Point>Ask) && 
      AccountFreeMargin()>AccountBalance()*0.5;       
   sos=(kol_sell()<1 || sell_lev_max+sh*Point<Bid) &&
      AccountFreeMargin()>AccountBalance()*0.5;

第二, 亏损的订单将在价格达到某个距离时使用双倍交易量加强, 然后在达到某个距离后再次加强, 再继续直到利润达到预先设置的水平, 再在同一方向上关闭全部订单 - 连续犯下错误#3和#6..

   if(M_ob[kb_max][2]>0.0)scb=M_ob[kb_max][7]/(M_ob[kb_max][2]*10)>tp;
   if(M_os[ks_max][2]>0.0)scs=M_os[ks_max][7]/(M_os[ks_max][2]*10)>tp;
   
   kk=0;
   ii=0;
   if (scb)
      {
      while(kol_buy()>0 && kk<3)
         {
         kk++;
         for(i=1;i<=kb;i++)
            {
            if(M_ob[i][0]==0)break;else ii=M_ob[i][0];
            if (!OrderClose(ii,M_ob[i][2],Bid,slip,White)) 
               {
               gle=GetLastError();
               Print("Error #",gle," at close buy ",ii," (",kk,")");
               Sleep(6000);
               RefreshRates();  
               }
            }
         }
      }
   kk=0;  
   ii=0; 
   if (scs)
      {
      while(kol_sell()>0 && kk<3)
         {
         kk++;
         for(i=1;i<=ks;i++)
            {
            if(M_os[i][0]==0)break;else ii=M_os[i][0];
            if (!OrderClose(ii,M_os[i][2],Ask,slip,White))
               {
               gle=GetLastError();
               Print("Error #",gle," at close sell ",ii," (",kk,")");
               Sleep(6000);
               RefreshRates();  
               }
            }
         }
      }

我们做了以上这些也就犯下了"错误" #10. 以上我们唯一还没有犯下的"错误"就是"错误"#9, 但是在最开始时这不算是一个真正的"错误". 我们保护自己不犯"错误"#5, 把操作权交给我们的电脑. 在 M_ob 和 M_os 数组中, 存储了已建仓位的当前信息:

int kb,kb_max=0;
   kb=kol_buy()+1;
   double M_ob[11][8];
   ArrayResize(M_ob,kb);
   int ks=0,ks_max=0;
   ks=kol_sell()+1;
   double M_os[11][8];
   ArrayResize(M_os,ks);
   
   ArrayInitialize(M_ob,0.0);
   
   int kbi=0;
   for(i=0;i<OrdersTotal();i++)
     {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
        {
        kbi++;
        M_ob[kbi][0]=OrderTicket();
        M_ob[kbi][1]=OrderOpenPrice();
        M_ob[kbi][2]=OrderLots();
        M_ob[kbi][3]=OrderType();
        M_ob[kbi][4]=OrderMagicNumber();
        M_ob[kbi][5]=OrderStopLoss();
        M_ob[kbi][6]=OrderTakeProfit();
        M_ob[kbi][7]=OrderProfit();
        }
      } 
   M_ob[0][0]=kb; 
   
   double max_lot_b=0.0;
   for(i=1;i<kb;i++)
      {
      if(M_ob[i][2]>max_lot_b)
         {
         max_lot_b=M_ob[i][2];
         kb_max=i;
         }
      }
   double buy_lev_min=M_ob[kb_max][1];   
   
   ArrayInitialize(M_os,0.0);
   int ksi=0;
   for(i=0;i<OrdersTotal();i++)
     {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
        {
        ksi++;
        M_os[ksi][0]=OrderTicket();
        M_os[ksi][1]=OrderOpenPrice();
        M_os[ksi][2]=OrderLots();
        M_os[ksi][3]=OrderType();
        M_os[ksi][4]=OrderMagicNumber();
        M_os[ksi][5]=OrderStopLoss();
        M_os[ksi][6]=OrderTakeProfit();
        M_os[ksi][7]=OrderProfit();
        }
      } 
   M_os[0][0]=ks; 
   
   double max_lot_s=0.0;
   for(i=1;i<ks;i++)
      {
      if(M_os[i][2]>max_lot_s)
         {
         max_lot_s=M_os[i][2];
         ks_max=i;
         }
      }
   double sell_lev_max=M_os[ks_max][1];

逆势而行可能会有很大的距离, 所以我们必须要有足够的存款 - 不少于$50000. 但是, 系统也能在小的初始存款下工作, 只是止损区间要更大一些. 如果存款是 $1000, 区间应该是 300, 这种情况下利润会少一些.



测试结果

我们在 USDCHF 上进行测试. 选择一分钟图以排除建模质量的影响. 在其他交易品种上我们得到了较少的结果, 但是使用更适合的止损和获利输入参数应该得到更好的结果.

策略测试器报告
EAj交易 Frank_ud


交易品种USDCHF (Swiss Franc vs US Dollar)
时间框架1 Minute (M1) 2006.02.16 18:06 - 2006.09.27 18:02
模式只使用开盘价 (分析已完成柱的最快方法)
输入参数tp=65; sl=41;

历史柱数200061建模订单时刻数400022模型质量n/a

初始存款 50000.00



净利润 168959.39 毛利 204777.37 毛损 -35817.98
利润指数 5.72 期待收入 413.10

绝对回撤 0.00 最大回撤 5602.61 (3.41%) 相对回撤 4.56% (2611.85)

总交易数 409 卖出仓位 (获利 %) 205 (59.51%) 买入仓位 (获利 %) 204 (61.27%)

获利交易 (总数%l) 247 (60.39%) 亏损交易 (总数%) 162 (39.61%)
最大 获利交易 18874.04 亏损交易 -1461.09
平均 获利交易 829.06 亏损交易 -221.10
最大 连续获胜次数 (利润) 14 (6950.34) 连续亏损次数(亏损) 7 (-5602.61)
最大 连续盈利 (获胜次数) 25476.79 (8) 连续亏损 (亏损次数) -5602.61 (7)
平均 连续获胜 4 连续亏损 3



# 时间 类型 订单 手数 价格 止损 获利 利润 余额
12006.02.16 19:51买入10.101.31200.00001.3210

22006.02.16 19:52卖出20.101.31150.00001.3025

3 2006.02.17 14:06 卖出 3 0.20 1.3158 0.0000 1.3068
4 2006.02.20 04:21 获利 3 0.20 1.3068 0.0000 1.3068 135.19 50135.19
5 2006.02.20 04:21 买入 4 0.20 1.3073 0.0000 1.3163
6 2006.02.23 16:15 关闭 2 0.10 1.3028 0.0000 1.3025 58.02 50193.21
7 2006.02.23 16:15 买入 5 0.40 1.3028 0.0000 1.3118
8 2006.02.23 16:16 卖出 6 0.10 1.3038 0.0000 1.2948
9 2006.02.23 16:55 卖出 7 0.20 1.3081 0.0000 1.2991
10 2006.02.24 10:14 关闭 1 0.10 1.3114 0.0000 1.3210 3.84 50197.05
11 2006.02.24 10:14 关闭 4 0.20 1.3114 0.0000 1.3163 75.17 50272.22
12 2006.02.24 10:14 关闭 5 0.40 1.3114 0.0000 1.3118 266.53 50538.75
13 2006.02.24 10:15 买入 8 0.10 1.3110 0.0000 1.3200
14 2006.02.24 10:36 卖出 9 0.40 1.3123 0.0000 1.3033
15 2006.02.24 17:58 卖出 10 0.80 1.3167 0.0000 1.3077
16 2006.02.27 01:20 获利 8 0.10 1.3200 0.0000 1.3200 69.22 50607.97
17 2006.02.27 01:20 买入 11 0.10 1.3205 0.0000 1.3295
18 2006.02.27 01:22 卖出 12 1.60 1.3211 0.0000 1.3121
19 2006.02.28 12:47 买入 13 0.20 1.3163 0.0000 1.3253
20 2006.02.28 17:24 关闭 6 0.10 1.3123 0.0000 1.2948 -68.52 50539.45
21 2006.02.28 17:24 关闭 7 0.20 1.3123 0.0000 1.2991 -71.52 50467.93
22 2006.02.28 17:24 关闭 9 0.40 1.3123 0.0000 1.3033 -10.01 50457.92
23 2006.02.28 17:24 关闭 10 0.80 1.3123 0.0000 1.3077 248.21 50706.13
24 2006.02.28 17:24 关闭 12 1.60 1.3123 0.0000 1.3121 1052.91 51759.04
25 2006.02.28 17:25 买入 14 0.40 1.3113 0.0000 1.3203
26 2006.02.28 17:26 卖出 15 0.10 1.3111 0.0000 1.3021
27 2006.03.01 15:07 买入 16 0.80 1.3064 0.0000 1.3154
28 2006.03.01 18:52 关闭 11 0.10 1.3150 0.0000 1.3295 -39.72 51719.31
29 2006.03.01 18:52 关闭 13 0.20 1.3150 0.0000 1.3253 -17.66 51701.65
30 2006.03.01 18:52 关闭 14 0.40 1.3150 0.0000 1.3203 116.76 51818.41
31 2006.03.01 18:52 关闭 16 0.80 1.3150 0.0000 1.3154 523.19 52341.60
32 2006.03.01 18:53 买入 17 0.10 1.3162 0.0000 1.3252

等等.

你可以看到,测试结果证实了“反驳的假设”的可行性。

本文的作者是从2002年开始交易的, 但依然把自己当成交易的初学者, 在外汇交易中只确信两个假设(公理, 真相, 看你喜欢).
  • 市场不会为任何人做任何事情;
  • 价格不会根据任何人的预测而移动.

安全总比遗憾好!

参考资料列表:

  1. 交易新手的十个基本错误: Collector 的一篇文章, 位于/zh/articles/1418
  2. Torgovaya sistema treidera: faktor uspekha / Pod red.V.I. Safina. – SPb.: Piter, 2004. – 240 p.: 俄文版 (交易者的交易系统: 一个成功因素)
  3. Yakimkin V.N., Cand.Sc. (物理学/数学). 外汇交易: kak zarabotat' bol'shie den'gi" - M.: IKF Omega-L, 2005. - 413 p.: 俄文版 (外汇交易:怎样赚大钱)
  4. https://www.mql5.com/en/code/7097