更少的代码,更多的行动......写一个EA - 页 4

 
Maxim Kuznetsov:
你为什么把关于下一步的帖子拿下来?

请用你的傲慢来检验。并阅读该资源的规则。

你们都可以在论坛帖子和KodoBaz的描述中写下。

 
Maxim Kuznetsov:
你为什么把关于下一步的帖子拿下来?

看到了帖子,没有看到任何犯罪行为。我想我看得还不够仔细。

 
Maxim Kuznetsov:

当然,余额正在下降。 你对 "两个MAs交叉 "有什么期望?


你可以为EA采取不同的基础--MAs远非最佳选择。

 
aleger:

你可以为EA采取不同的基础--mashki远非最佳选择。

如果你再仔细看一下,你会发现你已经可以实现相当多的东西了 :-)

因此,结果如下。

* 应用程序员(库的使用者)声明他/她有几个列的micro-excel(在用例中,这些是FAST_MA,SLOW_MA,SIGNAL_BUY,SIGNAL_SELL)。

*并勾画了一个函数,他知道如何计算各个单元。在这个例子中,他提到了iMA。

*同时,他可以自由地访问该表的其他单元格(如果可能的话,DataFrame将打破序列)。

*并分别由用户编写了 "检查行值和是否是交易时间 "的函数

很明显,这足以让EA开始交易。而且策略可以非常灵活地改变--任何你能想到的表格计算都是可能的。
另一件事是,这只是前半部分:-)到目前为止,该EA的交易就像猴子移位器一样,只是用最小的手数,在一个符号和一个时间框架上。

 

在前两部分中,我们获得了一个可以执行最简单策略的专家顾问,这些策略被描述为 "猴子 "或 "按信号翻转"。
信号本身的编程非常简单,几乎就像在Excel中一样:-)

现在是时候让专家顾问多学点东西了。至少要把StopLoss和trawl它。

在策略的艺术描述中补充 "止损放在距离STOPLOSS_POINTS上,并以分形进行追踪"。我们还介绍了上述用例中的变化。

  • 新的EA参数输入int STOPLOSS_POINTS=100。
  • 在ENUM_SERIES中增加两个计算字段UPPER_FRACTAL,LOWER_FRACTAL。
  • 并在GetData函数中添加两个 "case: "来计算它们

并为用户提供一个函数(EA类的方法),以设置EA。最简单的条目可以看作是

SetStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL)。

读作 "在指定距离设置止损,并按LOWER_FRACTAL列拖曳买入,按UPPER_FRACTAL拖曳卖出";我认为该方法有一个明显的名称,其语法也大致清楚。

假设用户做了很多手势(声明了输入,添加了两列并调用了功能设置),我们将开发库,使他的行为导致预期的结果。我们还必须开发表格计算,并为消息/事件机制奠定基础。

在复制粘贴中,所有不必要的注释和MQL5代码都已被删除,以达到紧凑的效果。

input ENUM_APPLIED_PRICE FAST_MA_PRICE=PRICE_CLOSE;
input ENUM_MA_METHOD FAST_MA_METHOD=MODE_EMA;
input int FAST_MA_PERIOD=14;
input int FAST_MA_SHIFT=0;

input ENUM_APPLIED_PRICE SLOW_MA_PRICE=PRICE_CLOSE;
input ENUM_MA_METHOD SLOW_MA_METHOD=MODE_SMA;
input int SLOW_MA_PERIOD=54;
input int SLOW_MA_SHIFT=0;

// начальные значения StopLoss, TakeProfit
input int STOPLOSS_POINTS=100;
input int TAKEPROFIT_POINTS=200;

#include "EA/EA.mqh"

enum ENUM_SERIES {
   FAST_MA,       // id. значений FAST_MA
   SLOW_MA,       // id. значений SLOW_MA 
   SIGNAL_BUY,    // сигнал к покупкам
   SIGNAL_SELL,   // сигнал к продажам
   UPPER_FRACTAL,       // верхний фрактал (для трала стопов ордеров sell)
   LOWER_FRACTAL, // нижний фрактал
   TOTAL_SERIES   // последний элемент перечисления = кол-во элементов
};

double GetData(EA *ea,int id,int shift,DataFrame *table)
{
   switch ((ENUM_SERIES)id) {
      case FAST_MA:
         return table[FAST_MA][shift]=iMA(ea.Symbol,ea.Period,FAST_MA_PERIOD,0,FAST_MA_METHOD,FAST_MA_PRICE,shift);
      case SLOW_MA:
         return table[SLOW_MA][shift]=iMA(ea.Symbol,ea.Period,SLOW_MA_PERIOD,0,SLOW_MA_METHOD,SLOW_MA_PRICE,shift);
      case SIGNAL_BUY:
         return table[SIGNAL_BUY][shift]=table.CrossedUp(FAST_MA,SLOW_MA,shift);
      break;
      case SIGNAL_SELL:
         return table[SIGNAL_SELL][shift]=table.CrossedDn(FAST_MA,SLOW_MA,shift);
      break;
      // Расчёт уровней трала
      case UPPER_FRACTAL:
         // верхний фрактал. уровень по которому тралятся sell
         return table[UPPER_FRACTAL][shift]=iFractal(ea.Symbol,ea.Period,MODE_UPPER,shift+2);
      case LOWER_FRACTAL:
         return table[UPPER_FRACTAL][shift]=iFractal(ea.Symbol,ea.Period,MODE_LOWER,shift+2);
   }
   return EMPTY_VALUE;
}
int SignalOfCross(EA *ea,int shift,DataFrame *data)
{
   if (FAST_MA_PRICE!=PRICE_OPEN || SLOW_MA_PRICE!=PRICE_OPEN) shift++;
   if (data[SIGNAL_BUY][shift]==1.0)  return OP_BUY;
   if (data[SIGNAL_SELL][shift]==1.0) return OP_SELL;
   return -1;
}
EA *ea=NULL;

int OnInit()
{
   ea = new EA();
   ea.SetupTimeframe(_Symbol,_Period,TOTAL_SERIES,30,GetData);
   ea.SetupSignal(SignalOfCross);

        // укажем начальный стоп-лосс ордеров и уровни для тралов 
   ea.SetupStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);
   // и заодно тейк-профит
   ea.SetupTakeProfit(TAKEPROFIT_POINTS);
   // остальная часть одинакова для всех советников
   //................
}
 
Maxim Kuznetsov:

看这样的代码已经很困难了。写作外在的简单是一项困难的任务。简洁是很重要的,但即使有了简洁,也很容易逃脱。

你对你的代码的看法,就像我对我的看法一样,是非常主观的。来自外部的观察者可以更客观地判断出它是复杂还是简单。

作为你的代码的观察者--复杂。

 
fxsaber:

看这样的代码已经很困难了。写作外在的简单是一项困难的任务。简洁是很重要的,但即使有了简洁,也很容易逃脱。

你对你的代码的看法,就像我对我的看法一样,是非常主观的。来自外部的观察者可以更客观地判断出它是复杂还是简单。

作为你的代码的观察者--复杂。

建议只为用例提供一个更清晰、更简洁的条目。或对当前的编辑。

这是最困难的一点--这也是主要提供给大家讨论的一点。




 
Maxim Kuznetsov:

他们提出了一个更清晰和简明的符号,只是为了使用情况。或对当前的编辑。

这是最困难的一点--也是主要提出来讨论的一点。

我不会建议这样做,因为我不知道,甚至不理解为什么需要这样做。对于一个外部观察者来说,MQL4几乎不会比MQL4更简单。MQL4的开发者已经出色地找到了一个简单的架构。

 

你想从中得到什么?说实话,我不明白。起初我以为是要建立一个la框架,但没有,没有指标、订单、标准决策算法的包装类,什么都没有。虽然这样的结构更易读:fast.Get(2)>=slow.Get(1);(这只是为了举例),但声明。

CMA fast=new CMA(NULL,0,12,...)。

CMA slow=new CMA(NULL,0,100,...)。

这是我们可以讨论的事情,而你,IMHO,却在现场跺脚。

 
fxsaber:

作为你的代码的观察者--很难。

我同意,即使你懂得语言,要读懂你的代码也是非常困难的。

原因: