请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化策略 帖子:3364704 新帖:25

夜间交易的可靠度如何?

只求稳定发表于:4 月 17 日 19:56回复(1)

简介

在过去的六个月里,我们见证了很多 Expert Advisor,通过在 EURCAD、GBPCADEURCHF 和其他货币对上进行夜间交易,获利颇丰,却几乎没有承受任何风险。 在 Alpari 的 PAMM 账户 上应用该策略进行的交易展示了令人惊叹的结果。 然而,使用该交易系统的负面反馈并不少见。 本文的目的是检验夜间横盘交易是否真的可以获利以及找出在真实账户上进行这种交易的所有隐藏危险。



理论

下图显示了典型的夜间横盘。 它并非是展示给定策略的最好图像,但这是一种特意选择。 夜间横盘的边界非常模糊。 对于 EURCHF ,我们可以说 横盘从服务器时间 18:00-20:00 开始,在 10:00-14:00 结束。 我们将取从 18:00 到 10:00 的时间段。

夜间横盘持续时间通常是亚太交易时段,其特征是大多数货币对的波动性很小。



实现

首先,我们来粗略定义 Expert Advisor 对于夜间横盘交易应如何运行。

1) 开始交易时间 – 不早于一个指定的时点

2) 结束交易时间 – 不迟于一个指定的时点

3) 获利 – 非常接近,10 到 50 个点

4) 止损 – 大于 获利,30 到 70 个点

5) 市场进入 – 价格靠近横盘边界

6) 横盘边界由横盘开始前的最后几个小时决定

7) 夜间交易的数量可能受到限制,因为进行 卖出买入 超过一次且获利退出的概率极小;第二次市场进入通常导致在夜间横盘结束时以亏损收场。

以上几点可以实现如下:

// External variables
extern double    Lots=1;
extern int       h_beg=20;
extern int       h_end=10;
extern int       TakeProfit=20; 
extern int       StopLoss=90;

// Auxiliary variables
double max;
double min;
int slippage=5;
int magik=5;
int pos=0;

//Counter of deals over the night session
int Buy_count=0; 
int Sell_count=0;
 
//Function for closing an order
bool CloseOrder()
{
   int ticket,i;
   double Price_close;
   int err;
   int count=0;
   int time;      
       for(i=OrdersTotal()-1;i>=0;i--)
       {
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if (OrderSymbol()==Symbol())           
                if(OrderMagicNumber()==magik)
                   {                                                                
                     if(OrderType()==OP_BUY)      
                        Price_close=NormalizeDouble(Bid,Digits); 
                     if(OrderType()==OP_SELL)       
                        Price_close=NormalizeDouble(Ask,Digits); 

                     if(OrderClose(OrderTicket(),OrderLots(),Price_close,slippage))                        
                           return (true);
                   }                                         
      }
return(false);
}

//Taking a decision 
int GetAction()
{
   int TotalDeals;
   int type=0;
   int N=OrdersTotal(); 

// Counting current positions     
   for(int i = N - 1; i >= 0 ; i--)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if( OrderSymbol()==Symbol())
            TotalDeals++;
            type=OrderType();       
       }    

   if (TotalDeals==0)
   {
      pos=0;
   }
   else
   {
      if (type==OP_BUY)
         pos=2;
      if (type==OP_SELL)
         pos=-2;
   }

// Beginning of the night session, determination of the flat boundaries by two preceding bars
   if (Hour()==h_beg)
   {
      max=MathMax(High[1], High[2]);
      min=MathMin(Low[1],Low[2]);
      Buy_count=0;
      Sell_count=0;
   }

// End of session, closing of all positions and disabling trading operations by the Expert Advisor
   if ((Hour()>=h_end)&&(Hour()<h_beg))
   {
      Buy_count=1;
      Sell_count=1;
      max=0;
      min=0;
      if (TotalDeals!=0)
         CloseOrder();
   } 

// Checking for position opening       
      if ((Bid>max)&&(max!=0)&&(pos==0)&&(Sell_count==0))      
            pos=-1;                  

      if ((Ask<min)&&(min!=0)&&(pos==0)&&(Buy_count==0))             
            pos=1;     

   return (0);       
}

//Processed at every tick
int start()
  {
   int action;
   double profit;
   double stop=0;
   double price=0;
   int ticket=-1;  

   GetAction();   
   if (pos==1)
         {
               stop=NormalizeDouble(Ask-StopLoss*Point,Digits);
               profit=(min+TakeProfit*Point);             
               pos=2;                                      

               while (ticket<0)
               {
                  if (!IsTradeContextBusy( )) 
                     ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,0,0,NULL,magik,0,Green);
                  if (ticket>0)
                     OrderModify(ticket,0,stop,profit,0,Blue);                           

                  if(ticket<0)
                     Print("OrderSend failed with error #",GetLastError());

                  Sleep(5000);
                  RefreshRates();
               }
               Buy_count=1;                       
         }  

   if (pos==-1)
         {
               stop=NormalizeDouble(Bid+StopLoss*Point,Digits);
               profit=(max-TakeProfit*Point); 
               pos=-2;                                   

               while (ticket<0)
               {
                  if (!IsTradeContextBusy( )) 
                     ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,0,0,NULL,magik,0,Green);

                  if (ticket>0)
                     OrderModify(ticket,0,stop,profit,0,Blue);                           

                  if(ticket<0)
                     Print("OrderSend failed with error #",GetLastError());

                  Sleep(5000);
                  RefreshRates();
               }
               Sell_count=1;
        }                            
   return(0);
  }


测试

从下图可见,有些交易非常令人吃惊:几乎是在夜间价格范围的 最低价 买入并在 最高价 卖出 也有一些例外情况,通常在设定的时间后平仓。

测试显示,在 $10,000 保证金的手数下,给出的 Expert Advisor 在几个月的交易中可以获利超过 30%。 如果我们继续增加风险,可以看到 Alpari 的 PAMM 账户 账户上的交易是如何在几个月之内产生 1000% 的收益。



实际应用

当然,并非总是一帆风顺,否则在过去的 6 个月到一年之间,我们会看到百万富翁的数量剧增。 在进行夜间交易时,是什么阻碍了获得超级利润呢?

1) 对于尤其适于夜间交易的货币 – EURCHFGBPCADEURCAD、,夜间持续时间为 1.5 到 2 倍的长度。

2) 在出现巨大的利润时,一些交易中心的交易条件可能变得更加不利

3) 可能遇到一系列的大型亏损交易,例如,在 EURCHF/USDCHF 遭到干预时

4) 获利 获利值需要不断调整,通常是向下调整。 尽管在冬季时我们可以在 EURCAD 的一次交易中获利 40 个点,现在这个值在 20 左右。

本文提供的用于夜间交易的 Expert Advisor 非常简单,可以令其变得相当复杂。 这可以通过多种方式实现,包括:

1) 内向扩展;

2) 波动性分析;

3) 新闻分析(以避免干预风险);

4) 决定交叉货币对的主要货币对的分析(例如,对于 EURCHF ,主要货币对是 EURUSDUSDCHF 遭到干预时);

5) 更加复杂的市场进入算法。

本文提供的模板可用于实际交易。 在使用它的 6 个多月里,它获得了 50% 左右的年收益。 尽管该 Expert Advisor 本身目前没有多少用处,本文可以激发新的创意,以供论坛用户和本文作者利用。



总结

夜间交易在冬季时提供了良好的获利机会,但在春季,尤其是夏季时变得更加复杂。 在这种趋势下,很难对秋季做出评价。 但是,这种策略有存在的理由,因为真实账户上的保证金在策略应用过程中获得了增长。

至于该策略是否有用,时间会给出答案。 本文提供的 Expert Advisor 是非常基本的内容,但可以搁置起来,在再次出现稳定的夜间横盘时再予使用。

全部回复

0/140

量化课程

    移动端课程