不存在完美的EA - 页 3

 
lapcheung #:

是第二个选项“每个点基于实时”?

一直是选第一项“每次报价”。

是的,选择了会从服务器上下载真实的tick数据用于回测

每次报价 ”是模拟生成的数据

客户端最好用英文版的,中文的语言包有很多误解,包括chm手册上也是

 

我决定停止研究 EA,它的复杂程度超出我知识范围。但我也在过程中,对行情有了更多认识。

同样策略,在不同时间段,会有完全相反的结果。

有时价格突破后继续走,这段时间是获利。有时价格突破后反转,这段时间是亏损。无法用代码进行区分。

附加的文件:
faf94f.PNG  21 kb
 

最后,送上一段代码,用于将商品价格实时转换成人民币价格。

这段代码不进行任何交易,只是利用 EA 模式运行。


//+------------------------------------------------------------------+
//|                                              Price_of_usdcnh.mq5 |
//|                                      Copyright 2023, lap cheung. |
//|                                                1280868155@qq.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, lap cheung."
#property link      "1280868155@qq.com"
#property version   "1.00"
#property description "将商品价格转换成人民币价格,带重量单位转换。"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

enum TICK_TIME
   {
   a0=0,a1=1,a2=2,a3=3,a5=5,a7=7,a11=11,a13=13,
   a17=17,a23=23,a29=29,a37=37,a53=53,a71=71,a89=89,
   a101=101,a131=131,a179=179,a293=293,a397=397,
   a599=599,a797=797,a997=997,a3331=3331,a9973=9973
   };
const double   KGOZ=31.1034807/1000;
const double   OZKG=1000/31.1034807;
const double   KGLB=0.4535924;
const double   LBKG=2.2046226;
enum RMB_SET
   {
   nonMessage,timeOnly,usd2rmb,
   usd_oz2rmb_kg,usd_oz2rmb_g,
   usdxxx2rmb,xxxusd2rmb,
   usd_lb2rmb_kg
   };

input RMB_SET     RMBconver=nonMessage;
input TICK_TIME   UpdateTick=5;

int   myTick;
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(UpdateTick);
   myTick=UpdateTick;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   Comment("");      // clear all.
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
   myTick++;
   // when makrt on hot, tick is go up fast.
   if (myTick>UpdateTick)
      {
      myTick=0;
      CommentRMB();
      }
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
   myTick=0;
   CommentRMB();
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
   CommentRMB();
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void CommentRMB(void)
   {
   //--- 从人民币兑美元汇率,计算金银的人民币参考价格。
   double   rmbBuf[];
   double   RMB;
   string   rmbstr, tstr;
   double   symPrice;

   if (RMBconver==nonMessage) return;
   if (1!=CopyClose(Symbol(),PERIOD_CURRENT,0,1,rmbBuf))
      return;
   symPrice=rmbBuf[0];

   tstr="  Time:"+TimeToString(TimeCurrent(),TIME_SECONDS);
   if (RMBconver==timeOnly)
      {
      Comment(tstr,tstr,tstr,tstr);
      return;
      }
   if (1==CopyClose("USDCNH",PERIOD_CURRENT,0,1,rmbBuf))
      {
      switch (RMBconver)
         {
         // 换算人民币价格、盎司到公斤。
         case usd_oz2rmb_kg:
            RMB=rmbBuf[0]*symPrice;
            RMB*=OZKG;
            rmbstr="    RMB KG:"+DoubleToString(RMB,0);
            break;
         case usd_oz2rmb_g:
            RMB=rmbBuf[0]*symPrice;
            RMB*=OZKG/1000;
            rmbstr="    RMB G:"+DoubleToString(RMB,2);
            break;
         // 货币汇率转换
         case usdxxx2rmb:
            RMB=symPrice/rmbBuf[0];
            rmbstr="  1 RMB:"+DoubleToString(RMB,4);
            break;
         // 货币汇率转换
         case xxxusd2rmb:
            RMB=rmbBuf[0]*symPrice;
            rmbstr="    RMB:"+DoubleToString(RMB,4);
            break;
         case usd2rmb:
            RMB=rmbBuf[0]*symPrice;
            rmbstr="    RMB:"+DoubleToString(RMB,2);
            break;
         case usd_lb2rmb_kg:
            RMB=rmbBuf[0]*symPrice;
            RMB*=LBKG;
            rmbstr="    RMB KG:"+DoubleToString(RMB,2);
            break;
         default:
            break;
         }
      Comment(rmbstr,tstr,rmbstr,tstr,rmbstr,tstr);
      }
   }
//+------------------------------------------------------------------+
 
lapcheung:

基本上,写开仓、平仓、的代码没多少含金量,就是检查持仓,设追踪止损。

最难的是决定何时开仓、何时平仓,我把策略改了不下十次,依然找不到完美的策略。

例如

策略一、震荡不开仓,这个策略减去了90%的止损。

策略二、减速不开仓,这个策略对于回调也不开仓 ,全天只会开出三几张单 。事实上这是策略一的变形,包含了策略一。但依然不完美,缺点是突破反转时,总会伴随着一张止损单,因为不知道何时会反转。

难点应该就是不知道何时会进入震荡,何时震荡结束转为趋势?确定趋势震荡这两种状态的分界点就是难点。多大的幅度定义为震荡每个人标准也不一样,不过一般只要按开单扣除各项费用不能赚钱,并且按照趋势策略下单的规则会来回开单不赚钱就可以定为震荡。其他的都可以看作为趋势行情。

 
lapcheung #:

市场运行并不完美,主要是震荡时刻存在。

令到反转不是一下子,而是反复多次,最后还不一定反转。

可以说,目前还没人能解决震荡。

震荡我解决了,呵呵

 
Qingquan Cao #:

震荡我解决了,呵呵

你是怎么解决震荡过滤的

 

确实没有完美的EA 都还是需要人工干预

 
盈谷WG #:

确实没有完美的EA 都还是需要人工干预


EA相当于人脑的百分之一,因为EA不能学习。

 
lapcheung #:

我决定停止研究 EA,它的复杂程度超出我知识范围。但我也在过程中,对行情有了更多认识。

同样策略,在不同时间段,会有完全相反的结果。

有时价格突破后继续走,这段时间是获利。有时价格突破后反转,这段时间是亏损。无法用代码进行区分。

可以区分时段,有美盘行情活跃时段容易出单边。

 
Zhi Peng Pei #:

可以区分时段,有美盘行情活跃时段容易出单边。

美盘成交额全天最高,波幅最大,但趋势稳定性并未增加,甚至由于每隔一小时发布一次数据,反转概率也上升了。

原因: