文章 "创建一个在若干工具上交易的 EA 交易程序" - 页 5

 
Interesting:
Tnew[1] 数组范围无效--似乎是范围超限。不要忘记,数组元素的编号是从数组范围的起点开始的。

no access to edit message from2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

替换:8.为什么Exp_TEMA.mq5在测试时会在条形图内打开交易?

8.为什么Exp_TEMA.mq5在测试时会在一个条形图内打开多个交易?

 
ias:
无法编辑来自2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 # 的信息。

帖子只能在发布后 3 天内编辑。

[删除]  

ias:

8.为什么Exp_TEMA.mq5在测试时会在一个条形图中打开多个交易?

如果不检查是否存在之前打开的仓位,并设置订单....,那么就符合逻辑了。
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

有趣的是
假定不检查先前开立的头寸并设置挂单是合乎逻辑的....。

Exp_TEMA.mq5中不使用挂单,但会检查之前打开的仓位:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

也许有什么地方出错了,在

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ 用于存储变量数组大小的变量声明
   static int Size_ = 0;
   
   //----+ 调整变量数组的大小
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ):错误!!!调整变量数组大小失败!!!"); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ):错误代码", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ 贸易禁令检查
   if (!Trade)return(true);
   
   //----+ 声明一个变量来存储变量数组的总大小
   static int Size_ = 0;
   
   //----+ 将用于存储指标句柄的数组声明为静态变量
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ 初始化 
   if (Number + 1 > Size_) // 仅在首次启动时进入初始化程序块
    {
     Size_ = Number + 1; // 该号码的区块入口已关闭
     
     //---- 调整变量数组的大小
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- 确定足以进行计算的最小条数 
     MinBars[Number] = 3 * period;
     
     //---- 阵列单元的初步清零
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- 将数组用作时间序列
     ArraySetAsSeries(TEMA, true);
     
     //----+ 获取指标句柄
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ 检查条形图的数量是否足以进行计算 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ 接收交易信号 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // 在条形图变化或数据复制失败时进入数据块
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ 使用指标句柄,复制指标的
                   // 将缓冲区放入专门准备的静态数组中
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // 由于没有收到数据,应该返回 
                                 // 进入下一个刻度线接收交易信号的程序块!
       return(false); // 在不接收交易信号的情况下退出 TradeSignalCounter() 函数
      }
      
     //---- 从指标缓冲区复制的所有操作均已成功完成
     Recount[Number] = false; // 在下一个条形图变化之前,有可能不返回该区块
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- 输入信号的定义
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- 输出信号的定义
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

在欧元兑美元(EURUSD)上测试 Exp_TEMA.mq5(D1 期)时,在一栏中进行多次交易

[删除]  
IAS,最好去找文章作者....。
 
ias:

为什么在测试时,Exp_TEMA.mq5 会在条形图内打开交易?

为什么 Exp_TEMA.mq5 在测试时会在一个条形图内打开多个交易?

重点是,在本文中,我们的任务是实现一个简单的多货币智能交易系统,而不是用一些小细节来扰乱主旨,影响对本质的理解。 每个人都有自己的方式来填充细节。就您的情况而言,一切都已基本解决。交易信号的变量作为交易功能的输入,并通过链接连接,这些变量在交易功能 内部交易后重置。
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
重点是,在本文中,我们的目标是实现一个简单的多货币智能交易系统,而不是用一些小细节来干扰对本质的理解。每个人都有自己的方式来填充细节。就您的情况而言,一切都已基本解决。交易信号的变量作为交易函数的输入,并与之相连,在交易函数 内部执行交易后,这些变量将被重置。
请以您的 Expert Advisor Exp_TEMA.mq5 为例,向我演示如何操作。
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

在我看来,学习和理解一门编程语言的关键在于个人根据自己的需要解决重新编排代码的小任务。否则,你为什么需要这个网站和编程文章?为了展示文章作者的能力吗?不想自己理解的人可以使用https://www.mql5.com/ru/job
例如,在 MQL4 中,我以最简单的形式实现了这种方法,就像这样https://www.mql5.com/zh/articles/1516。 对于 MQL5,没有任何变化,一切都按照同样的方式进行。

 
GODZILLA:

我非常尊敬 "创建可在不同工具上交易的智能交易系统 "一文的作者。
1.文章中介绍的智能交易系统 Exp_TEMA.mq5 的代码在测试过程中会在一个条形图中打开多个交易,
,正如本主题之前所报告的那样。这一事实证实了智能交易系统中存在不正确的代码或错误,许多网站访问者都有兴趣消除这一错误。
2.文章中介绍的智能交易系统 Exp_TEMA.mq5 的代码在测试过程中会在一个条形图中打开多个交易, ,这一事实证实了智能交易系统中存在不正确的代码或错误,许多网站访问者都有兴趣消除这一错误。.Roche关于 "Expert Advisors:Multicast "主题的回复:"此外,确定新栏 的功能可以不使用时间复制功能来实现。" - 也证实了在 Expert Advisor 中 IsNewBar()函数的编写更合理的可能性。
我想看看作者将如何从专业角度消除这些缺陷,因为每个人都可能犯错,只有专业人士才能正确纠正错误。
 
ias:

如果仔细观察文章中介绍的交易系统,您可以得出结论,它们都是翻转系统。止损在此类系统中扮演次要角色,与进场的距离非常合适,至少以几根蜡烛线计算。材料介绍的专业性在于以尽可能简单的形式展开主题,而不是用额外的噱头来喧宾夺主,更不是以不愿意独立思考的公众为基础。任何教科书在理想方面总是有缺陷的。这被认为是可以接受的,也是正常的。将来会有这样一个顺序,详细介绍建立交易系统的这一细节,会对执行情况进行详细审查,这也不是那么简单的事情。
至于时间复制,我可以非常肯定地说,我自己并没有发现 Expert Advisor 中 IsNewBar() 函数的合理书写有任何显著区别,尽管我进行了测量!我甚至为此写了一篇文章。
而且,如果我愿意,我可以毫不费力地将本网站上的任何文章撕成碎片。但我欣赏信息,首先是因为它是可用的,而不是因为它符合我的理想。
因此,我不会去消除牵强附会的缺陷,同时也不会让代码变得更加杂乱无章,因为出于可以理解和相当专业的原因,代码并不那么简单。