设为首页收藏本站

 找回密码
 注册
查看: 8085|回复: 7
打印 上一主题 下一主题

一个神经网络交易系统的mt代码 请高手修改一下 [复制链接]

Rank: 6Rank: 6

精华
0
UID
1896
积分
1979
帖子
117
主题
33
阅读权限
70
注册时间
2008-7-16
最后登录
2013-11-16
跳转到指定楼层
1#
发表于 2008-10-4 12:37:03 |只看该作者 |倒序浏览
//+------------------------------------------------------------------+
//|                                                  Combo_Right.mq4 |
//|                               Copyright ?2008, Yury V. Reshetov |
//|                               http://bigforex.biz/load/2-1-0-171 |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2008, Yury V. Reshetov"
#property link      "http://bigforex.biz/load/2-1-0-171"

//---- input parameters
extern double       tp1 = 50;
extern double       sl1 = 50;
extern int          p1 = 10;
extern int          x12 = 100;
extern int          x22 = 100;
extern int          x32 = 100;
extern int          x42 = 100;
extern double       tp2 = 50;
extern double       sl2 = 50;
extern int          p2 = 20;
extern int          x13 = 100;
extern int          x23 = 100;
extern int          x33 = 100;
extern int          x43 = 100;
extern double       tp3 = 50;
extern double       sl3 = 50;
extern int          p3 = 20;
extern int          x14 = 100;
extern int          x24 = 100;
extern int          x34 = 100;
extern int          x44 = 100;
extern int          p4 = 20;
extern int          pass = 1;
extern double       lots = 0.01;
extern int          mn = 888;
static int          prevtime = 0;
static double       sl = 10;
static double       tp = 10;



//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   if (Time[0] == prevtime) return(0);
   prevtime = Time[0];
   
   if (! IsTradeAllowed()) {
      again();
      return(0);
   }
//----
   int total = OrdersTotal();
   for (int i = 0; i < total; i++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) {
         return(0);
      }
   }
   
   sl = sl1;
   tp = tp1;
   
   int ticket = -1;
   
   RefreshRates();
   
   if (Supervisor() > 0) {
      ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 1, Bid - sl * Point, Bid + tp * Point, WindowExpertName(), mn, 0, Blue);
      if (ticket < 0) {
         again();      
      }
   } else {
      ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 1, Ask + sl * Point, Ask - tp * Point, WindowExpertName(), mn, 0, Red);
      if (ticket < 0) {
         again();
      }
   }
//-- Exit --
   return(0);
}
//+--------------------------- getLots ----------------------------------+


double Supervisor() {
   if (pass == 4) {
      if (perceptron3() > 0) {
         if (perceptron2() > 0) {
            sl = sl3;
            tp = tp3;
            return(1);
         }
       } else {
         if (perceptron1() < 0) {
            sl = sl2;
            tp = tp2;
            return(-1);
         }
      }
      return(basicTradingSystem());
   }

   if (pass == 3) {
      if (perceptron2() > 0) {
         sl = sl3;
         tp = tp3;
         return(1);
       } else {
         return(basicTradingSystem());
       }
   }

   if (pass == 2) {
      if (perceptron1() < 0) {
         sl = sl2;
         tp = tp2;
         return(-1);
       } else {
         return(basicTradingSystem());
       }

   }
   return(basicTradingSystem());
}

double perceptron1()   {
   double       w1 = x12 - 100;
   double       w2 = x22 - 100;
   double       w3 = x32 - 100;
   double       w4 = x42 - 100;
   double a1 = Close[0] - Open[p2];
   double a2 = Open[p2] - Open[p2 * 2];
   double a3 = Open[p2 * 2] - Open[p2 * 3];
   double a4 = Open[p2 * 3] - Open[p2 * 4];
   return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}

double perceptron2()   {
   double       w1 = x13 - 100;
   double       w2 = x23 - 100;
   double       w3 = x33 - 100;
   double       w4 = x43 - 100;
   double a1 = Close[0] - Open[p3];
   double a2 = Open[p3] - Open[p3 * 2];
   double a3 = Open[p3 * 2] - Open[p3 * 3];
   double a4 = Open[p3 * 3] - Open[p3 * 4];
   return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}

double perceptron3()   {
   double       w1 = x14 - 100;
   double       w2 = x24 - 100;
   double       w3 = x34 - 100;
   double       w4 = x44 - 100;
   double a1 = Close[0] - Open[p4];
   double a2 = Open[p4] - Open[p4 * 2];
   double a3 = Open[p4 * 2] - Open[p4 * 3];
   double a4 = Open[p4 * 3] - Open[p4 * 4];
   return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}

double basicTradingSystem() {
   return(iCCI(Symbol(), 0, p1, PRICE_OPEN, 0));
}

void again() {
   prevtime = Time[1];
   Sleep(30000);
}

Rank: 6Rank: 6

精华
0
UID
1896
积分
1979
帖子
117
主题
33
阅读权限
70
注册时间
2008-7-16
最后登录
2013-11-16
2#
发表于 2008-10-4 12:46:24 |只看该作者

相关资料

(ATS)自动的(智能的,采用神经网络的)交易系统的问题表述如下
如果我们有一个(BTS, basic trading system),同时需要用创建一个神经网络系统并教会它做BTS所不能做的事,按这个思路就是要创建这样一个交易系统∶它由互相补充(配合)的两部分组成,BTS和NN(神经网络)。

呃,英语说,我们不需要再去发现“新大陆”,它们是已经存在的东西!进一步说,如果我们已经有了汽车,那为什么还要教人如何跑得快?如果有飞机,为什么还要教人类去飞?
一旦有一个趋势交易系统的ATS,我们仅需要教会这个神经网络如何逆势(反趋势)交易的策略。这一点是非常必要的,因为一个基于趋势的交易系统是不能成功交易在盘整(sideways trends),也不能识别市场的回调(setbacks)和逆转(reversals.,反向走势)!当然,你可以采用两个ATS,一个基于“趋势”,一个基于“反趋势”(逆向),然后把它们挂到同一图表上。另一个办法是,你能教会神经网络如何与你现有的系统“互补地”协调工作!
为实现这个目标,我们设计了一个两层的神经网络,下层有两个感知机(perceptrons)上层有一个感知机。
这个神经网络的能输出下列三种状态之一
(Entering)市场是处在多向仓
(Entering)市场是处在空向仓
不确定的, (不明确的, 模糊的)状态
实际上,第三种状态是就把控制权交给BTS,反之前两种状态是交易信号由神经网络给出。
神经网络的“教育”分成三步骤,每一步骤“教育”一个感知机,在任何一步骤,这个优化了的BTS必须存在为的是“感知机们”知道它自己能做什么。
感知机们分别的“教育”由遗传算法来承担,由于这样的算法的缺乏,换句话说,搜索到的这样的算法有限,限制了“输入”(参数变量)的数量(借助这样算法得到的参数变量的值),然而,每一步骤的“教育”是密切配合补充的。(因此效果还是不错),这样这个神经网络不会太大,整个的优化也不会耗费太多的时间。
在“教育”NN之前的一步是对BTS进行优化。
为了不使我们自己也被搞糊涂了,我们将已经测试通过的ATS的输入(参数变量)记录上(”通过”("pass")的步骤号(stage number).,输入s(参数变量)的标识符将和stage number(步骤号)一致(等同)。
这样,我们开始对这个NN进行优化和“教育”的准备。存入初始保证金为$100万(以便于在优化期间不产生人为的补充保证金的通知)。Input(参数变量)是按“余额”进行优化,设置EA的Strategy Tester的测试的属性tab为"Testing" 。开始运行遗传算法。
在这个EA的开仓量 "lots".的值设为1 lot。
从这个ATS算法明确地有效开始,实施优化,所采用复盘模型是∶“仅用开盘价(以最快速的方法分析刚形成的柱线)”。
优化步骤1,BTS的优化
设置为 1 为这input(参数变量)“为通过”(the input "pass")。
我们仅仅优化步骤1相关的那些inputs(参数变量),即,尾标为 1 的参数变量,于是,我们仅仅测试优化有关的inputs而不测试其他的变量参数
tp1,BTS的所取的止盈值(TakeProfit)。在step 1,优化的值的范围在10到100,
sl1,BTS的所取的止损值(StopLoss)。在step 1,优化的值的范围在10到100 。
pl, 用于BTS的CCI的周期值。在step 1 ,优化的值的范围在 3到100
下面是BTS优化的结果



步骤 2 ,“教育负责管“开空仓”(short positions)的感知机
根据步骤的步骤号,设置(input,参数变量) 的"pass"的值为 2。
不测试那些已经测试过的优化了的以前步骤的inputs.(变量参数)。以防万一,保存以前步骤获得的inputs(变量参数值)到一个文件中去
根据我们的规则,必须是测试那些是在尾标为 2的inputs(变量参数)。
x12, x22, x32, x42 是识别并开空仓的感知机的权重,它们的值在step 1时被优化在范围0 to 200
tp2  (TakeProfit) 是感知机所开的仓的止盈值,它们的值在step 1时被优化在范围10 to 100。
sl2 (StopLos) 在 step 1它是感知机所开的仓的止损值,被优化值的范围在 10 to 100
p2 感知机所分析的价格差的周期值 (iiCCI()函数的一个参数∶period - Averaging period for calculation),在step 1 它的值所优化的范围在3 to 100
现在,开始用遗传算法来优化“教育”NN(让它“学习”市场),获得的结果如下∶

步骤 3 “教育”负责开多仓的感知机(“学习”市场)。
设置值 3 (根据步骤的步骤号)说明这些input(变量参数)已经“通过”(the input "pass")
同样,不测试,那些已经测试过的优化了的,以前步骤的inputs.(变量参数值),以防万一,保存以前步骤获得的inputs.(变量参数值) 到一个文件中去
根据我们的规则,优化测试的inputs(变量参数值)必须是尾标为3的那些变量参数。
x13, x23, x33, x43是识别多仓的感知机的权重,它们的值在step 1时被优化时得到的范围在0 to 200
tp 3  (TakeProfit) 是感知机所开的仓的“止盈值”,它的值在step 1时被优化时的范围是在10 to 100。
sl3 (StopLoss) 是感知机所开的仓的“止盈值”,它们的值在step 1时被优化为范围是10 to 100。
p3 --感知机所分析的价差的周期值。它在步骤 1 优化时得到的值的范围是 3 to 100 。
启动采用遗传算法的优化来“教育”NN,所获得的结果如下∶

步骤 4 (最终步骤) “教育”第一层,即“教育”在上层的感知机。
根据步骤的步骤号,设置值4 为输入通过(for the input "pass")
不测试那些在之前步骤已经测试过的优化了的“输入” (inputs) (意思是∶已经在之前步骤优化过的变量的参数值就不再优化它们了)。以防万一,将之前步骤获得的这些变量的参数值存到一个文件中去。
根据我们的规则,只测试优化标识符最后位是4的那些inputs(变量的参数值)
x14, x24, x34, x44 是第一层感知机参数的权重值。在步骤 1 时它们被优化的值的范围在0 io 200 。
p4 被感知机分析的价差的值的周期。在步骤 1 它的值的范围被优化在 3 to 100 。
采用遗传算法来优化,启动“教育”来教它“学习”。所获得结果如下∶

这就是全部,神经网络已经被“教育”了。
这个ATS有一个不能被优化的input(参数) mn-- Magic Number.(魔法号)它是一个交易系统它所开的仓位的识别符,为的是不和手动开仓或其他ATSes开的仓位混淆。这个Magic Number的值必须是唯一的并且和这个特别的ea尚未开仓的magic numbers不一致。
PS
出于保证有一些安全保险的考虑,初始保证金的金额设置是考虑为绝对最大回落的两倍
这个ea的源代码没有优化。
如果你需要置换嵌入另一个交易系统算法的BTS,你必须修改BTS功能的内部。
以便于不输入优化时的初值,终值和步长,你可采用已备好的combo.set文件,把它放置到MT4的 \tester 目录并加载这个ea的属性(properties)到Strategy Tester。
这个ea的再优化可在周末进行,即周六和周日,但仅在前面一周的结果是不盈利的。亏损的出现意味着市场已经改变,于是需要重新优化,若是仍然获利意味着这个ATS不需要重新优化,它对市场目前的模型的识别继续有效!

使用道具 举报

Rank: 6Rank: 6

精华
0
UID
1896
积分
1979
帖子
117
主题
33
阅读权限
70
注册时间
2008-7-16
最后登录
2013-11-16
3#
发表于 2008-10-4 12:50:15 |只看该作者

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
404
积分
1434
帖子
236
主题
74
阅读权限
60
注册时间
2007-9-23
最后登录
2014-7-25
4#
发表于 2008-10-16 09:59:13 |只看该作者
公式内没有包含遗传算法,所以没法改

按他的说法是利用mt4自带的遗传算法来优化

使用道具 举报

初级大户

公安部御准--超级警察 ...

Rank: 5Rank: 5

精华
0
UID
690
积分
1069
帖子
188
主题
59
阅读权限
60
注册时间
2007-11-6
最后登录
2023-1-26
5#
发表于 2008-10-29 09:15:32 |只看该作者
无论是遗传算法还是神经网络,他们只是能够将非线性模型优化的比较好而已。
不考虑其理论基础,盲目的将其应用于一些简单的技术指标是没用的。
Jeffery O Katz的书大量记录了将这些技术简单运用于技术指标的交易结果:
其结果是在样本数据内,系统表现很好。但在预测样本内(out of sample)表现糟糕。
其结果与简单的参数优化没两样的。
我知道。。。。。。我很帅!!

使用道具 举报

Rank: 1

精华
0
UID
2710
积分
46
帖子
8
主题
0
阅读权限
10
注册时间
2008-11-2
最后登录
2011-5-31
6#
发表于 2008-11-2 17:47:30 |只看该作者
强................

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
2108
积分
245
帖子
39
主题
4
阅读权限
40
注册时间
2008-8-8
最后登录
2016-3-28
7#
发表于 2008-11-9 20:14:44 |只看该作者
真难啊
一句都看不懂

使用道具 举报

Rank: 2

精华
0
UID
218506
积分
55
帖子
29
主题
12
阅读权限
30
注册时间
2015-8-30
最后登录
2016-12-5
8#
发表于 2016-3-22 17:31:48 |只看该作者
完全看不懂。。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-18 21:01

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部