- 注册时间
- 2013-5-19
- 最后登录
- 2024-11-7
- 阅读权限
- 200
- 积分
- 10692394
- 精华
- 17
- 帖子
- 1326
|
//+------------------------------------------------------------------+
//| Combo_Right.mq4 |
//| Copyright ?2012, 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 = 700; //takeprofit
extern double sl1 = 1000; //stoploss
extern int p1 = 25; //3-100
extern int x12 = 100; //0-200
extern int x22 = 100;
extern int x32 = 100;
extern int x42 = 100;
extern double tp2 = 50;
extern double sl2 = 50;
extern int p2 = 20; //3-100
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);
}
/*---------------- 优化步骤:
优化步骤1,BTS的优化
Set the value 1 for the input "pass".
设置为 1 为这input(参数变量)“为通过”(the input "pass")。
We will optimize only inputs that correspond with the first stage, i.e., that end in 1. Thus, we check only these inputs for optimization, and uncheck all others.
我们仅仅优化步骤1相关的那些inputs(参数变量),即,尾标为 1 的参数变量,于是,我们仅仅测试优化有关的inputs而不测试其他的变量参数
tp1 - TakeProfit of the BTS. It is optimized with the values within the range of 10 to 100, step 1
tp1,BTS的所取的止盈值(TakeProfit)。在step 1,优化的值的范围在10到100,
sl1 - StopLoss of the BTS. It is optimized with the values within the range of 10 to 100, step 1
sl1,BTS的所取的止损值(StopLoss)。在step 1,优化的值的范围在10到100 。
p1 - period of CCI used in the BTS. It is optimized with the values within the range of 3 to 100, step 1
p1, 用于BTS的CCI的周期值。在step 1 ,优化的值的范围在 3到100
Below are the results of the BTS optimization:
下面是BTS优化的结果
Stage 2. Teaching the perceptron responsible for short positions:
步骤 2 ,“教育负责管“开空仓”(short positions)的感知机
Set the value 2 (according to the stage number) for the input "pass".
根据步骤的步骤号,设置(input,参数变量) 的"pass"的值为 2。
Uncheck the inputs checked for optimization in the previous stage. Just in case, save in a file the inputs obtained at the previous stage.
不测试那些已经测试过的优化了的以前步骤的inputs.(变量参数)。以防万一,保存以前步骤获得的inputs(变量参数值)到一个文件中去
Check the inputs for optimization according to our rule: their identifiers must end in 2:
根据我们的规则,必须是测试那些是在尾标为 2的inputs(变量参数)。
x12, x22, x32, x42 - weight numbers of the perceptron that recognizes short positions. It is optimized with the values within the range of 0 to 200, step 1
x12, x22, x32, x42 是识别并开空仓的感知机的权重,它们的值在step 1时被优化在范围0 to 200
tp2 - TakeProfit of positions opened by the perceptron. It is optimized with the values within the range of 10 to 100, step 1
tp2 (TakeProfit) 是感知机所开的仓的止盈值,它们的值在step 1时被优化在范围10 to 100。
sl2 - StopLoss of positions opened by the perceptron. It is optimized with the values within the range of 10 to 100, step 1
sl2 (StopLos) 在 step 1它是感知机所开的仓的止损值,被优化值的范围在 10 to 100
p2 - the period of the values of price difference to be analyzed by the perceptron. It is optimized with the values within the range of 3 to 100, step 1.
p2 感知机所分析的价格差的周期值 (iiCCI()函数的一个参数∶period - Averaging period for calculation),在step 1 它的值所优化的范围在3 to 100
Let's start teaching it using optimization with a genetic algorithm. The obtained results are given below:
现在,开始用遗传算法来优化“教育”NN(让它“学习”市场),获得的结果如下∶
Stage 3. Teaching the perceptron responsible for long positions:
步骤 3 “教育”负责开多仓的感知机(“学习”市场)。
Set the value 3 (according to the stage number) for the input "pass".
设置值 3 (根据步骤的步骤号)说明这些input(变量参数)已经“通过”(the input "pass")
Uncheck the inputs checked for optimization in the previous stage. Just in case, save in a file the inputs obtained at the previous stage.
同样,不测试,那些已经测试过的优化了的,以前步骤的inputs.(变量参数值),以防万一,保存以前步骤获得的inputs.(变量参数值) 到一个文件中去
Check the inputs for optimization according to our rule: their identifiers must end in 3:
根据我们的规则,优化测试的inputs(变量参数值)必须是尾标为3的那些变量参数。
x13, x23, x33, x43 - weight numbers of the perceptron that recognizes long positions. It is optimized with the values within the range of 0 to 200, step 1.
x13, x23, x33, x43是识别多仓的感知机的权重,它们的值在step 1时被优化时得到的范围在0 to 200
tp3 - TakeProfit of positions opened by the perceptron. It is optimized with the values within the range of 10 to 100, step 1
tp 3 (TakeProfit) 是感知机所开的仓的“止盈值”,它的值在step 1时被优化时的范围是在10 to 100。
sl3 - StopLoss of positions opened by the perceptron. It is optimized with the values within the range of 10 to 100, step 1
sl3 (StopLoss) 是感知机所开的仓的“止盈值”,它们的值在step 1时被优化为范围是10 to 100。
p3 - the period of the values of price difference to be analyzed by the perceptron . It is optimized with the values within the range of 3 to 100, step 1.
p3 --感知机所分析的价差的周期值。它在步骤 1 优化时得到的值的范围是 3 to 100 。
Let's start teaching it using optimization with a genetic algorithm. The obtained results are given below:
启动采用遗传算法的优化来“教育”NN,所获得的结果如下∶
Stage 4 (final). Teaching the first layer, i.e., teaching the perceptron that is in the upper layer:
步骤 4 (最终步骤) “教育”第一层,即“教育”在上层的感知机。
Set the value 4 (according to the stage number) for the input "pass".
根据步骤的步骤号,设置值4 为输入通过(for the input "pass")
Uncheck the inputs checked for optimization in the previous stage. Just in case, save in a file the inputs obtained at the previous stage.
不测试那些在之前步骤已经测试过的优化了的“输入” (inputs) (意思是∶已经在之前步骤优化过的变量的参数值就不再优化它们了)。以防万一,将之前步骤获得的这些变量的参数值存到一个文件中去。
Check the inputs for optimization according to our rule: their identifiers must end in 4:
根据我们的规则,只测试优化标识符最后位是4的那些inputs(变量的参数值)
x14, x24, x34, x44 - weight numbers of the perceptron of the first layer. It is optimized with the values within the range of 0 to 200, step 1.
x14, x24, x34, x44 是第一层感知机参数的权重值。在步骤 1 时它们被优化的值的范围在0 to 200 。
p4 - the period of the values of price difference to be analyzed by the perceptron. It is optimized with the values within the range of 3 to 100, step 1.
p4 被感知机分析的价差的值的周期。在步骤 1 它的值的范围被优化在 3 to 100 。
Let's start teaching it using optimization with a genetic algorithm. The obtained results are given below:
采用遗传算法来优化,启动“教育”来教它“学习”。所获得结果如下∶
That's all, the neural network has been taught.
这就是全部,神经网络已经被“教育”了。
The ATS has one more non-optimizable input, mn - Magic Number. It is the identifier of positions for a trading system not to mix its orders with the orders opened manually or by other ATSes. The value of the magic number must be unique and not coincide with the magic numbers of positions that have not been opened by this specific Expert Advisor.
这个ATS有一个不能被优化的input(参数) mn-- Magic Number.(魔法号)它是一个交易系统它所开的仓位的识别符,为的是不和手动开仓或其他ATSes开的仓位混淆。这个Magic Number的值必须是唯一的并且和这个特别的ea尚未开仓的magic numbers不一致。
P.S.
The size of the initial deposit is found as the doubled absolute drawdown, i.e., we consider some safety resources for it.
出于保证有一些安全保险的考虑,初始保证金的金额设置是考虑为绝对最大回落的两倍
The EA given in the source codes is not optimized.
这个ea的源代码没有优化。
If you need to replace the built-in BTS with the algorithm of another trading system, you must modify the contents of the function basicTradingSystem().
如果你需要置换嵌入另一个交易系统算法的BTS,你必须修改BTS功能的内部。
In order not to enter the initial and the final values and the values of steps for optimization, you can take the ready file combo.set, place it in the folder \tester MT4, and upload to the EA's properties in Tester.
以便于不输入优化时的初值,终值和步长,你可采用已备好的combo.set文件,把它放置到MT4的 \tester 目录并加载这个ea的属性(properties)到Strategy Tester。
Re-optimization of the EA is to be performed at a weekend, i.e., on Saturday or on Sunday, but only if the results of the preceding week were unprofitable. The presence of losses means that the market has changed, and the re-optimization is necessary. The presence of profits means that the ATS does not need any re-optimization and recognizes market patterns quite well.
这个ea的再优化可在周末进行,即周六和周日,但仅在前面一周的结果是不盈利的。亏损的出现意味着市场已经改变,于是需要重新优化,若是仍然获利意味着这个ATS不需要重新优化,它对市场目前的模型的识别继续有效!
|
|