1. 关于感知器
感知器是机器学习中的基础组件,具体细节可以参考Mark Humphrys 博士的单层神经网络。
在我的EA中,感知器的逻辑是基于人工智能的原则。
2. 算法
2.1. 输入
w1, w2, w3 和 w4 是根据优化结果设定的权重。
input int x1 = 0;// 权重1 input int x2 = 0;// 权重2 input int x3 = 0;// 权重3 input int x4 = 0;// 权重4
2.2. 感知器
为了创建一个简单的EA,阈值设为零,输出为“触发”1和“未触发”0。

double w1 = x1 - 100; double w2 = x2 - 100; double w3 = x3 - 100; double w4 = x4 - 100; // 2017/03/18 前一根K线的感知器
double a11 = ((iRSI(Symbol(), 0, 12,PRICE_MEDIAN,1))/100-0.5)*2;
double a21 = ((iRSI(Symbol(), 0, 36,PRICE_MEDIAN,1))/100-0.5)*2;
double a31 = ((iRSI(Symbol(), 0, 108,PRICE_MEDIAN,1))/100-0.5)*2;
double a41 = ((iRSI(Symbol(), 0, 324,PRICE_MEDIAN,1))/100-0.5)*2;
double Current_Percptron = (w1 * a11 + w2 * a21 + w3 * a31 + w4 * a41);
// 2017/03/18 前两根K线的感知器
double a12 = ((iRSI(Symbol(), 0, 12,PRICE_MEDIAN,2))/100-0.5)*2;
double a22 = ((iRSI(Symbol(), 0, 36,PRICE_MEDIAN,2))/100-0.5)*2;
double a32 = ((iRSI(Symbol(), 0, 108,PRICE_MEDIAN,2))/100-0.5)*2;
double a42 = ((iRSI(Symbol(), 0, 324,PRICE_MEDIAN,2))/100-0.5)*2;
double Pre_Percptron = (w1 * a12 + w2 * a22 + w3 * a32 + w4 * a42);
我在这个EA中使用RSI指标,但其他振荡器也可以,比如RCI、W%R等。
2.3. 开仓和平仓
当之前的感知器在0以下而当前的感知器在0以上时,如果有空头仓位,则平仓。
然后EA发送一个多头订单。
if(Pre_Percptron < 0 && Current_Percptron > 0) // 多头信号 { // 如果有空头仓位,发送平仓指令 if(pos < 0) { ret = OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0); if(ret) pos = 0; // 如果平仓成功,仓位状态为零 } // 如果没有仓位,发送多头订单 if(pos == 0) Ticket = OrderSend( _Symbol, // 交易对 OP_BUY, // 操作类型 Lots, // 手数 Ask, // 价格 0, // 滑点 0, // 止损 0, // 获利 Trade_Comment, // 备注 MagicNumber,// 魔法数字 0, // 挂单过期时间 Green // 颜色 ); }
反之,当当前感知器在0以下而之前感知器在0以上时,如果有多头仓位,则平仓。
然后EA发送一个空头订单。
3. 优化
加载"Slime_Mold_RSI_template.set",并选择"仅开盘价"作为模型。


4. 注释和魔法数字
我将魔法数字设置为优化时使用的持续时间,这个EA在备注中使用魔法数字。
string Trade_Comment = IntegerToString(MagicNumber,5,' ') + "天-优化";

5. 相关文章
https://qiita.com/Kei-Sanada/items/cd6b8d9c02bc9eea1e01