EA: Diff_TF_MA_EA

 

Diff_TF_MA_EA:

一个基于 Diff_TF_MA 指标的 EA 交易。


作者: Scriptor

 

在某些地方,它与代码相冲突。

//+------------------------------------------------------------------+
//| 返回名称时间范围|
//+------------------------------------------------------------------+
string NameTimeframe(int timeframe=PERIOD_CURRENT)
  {
   if(timeframe==PERIOD_CURRENT) timeframe=Period();
   switch(timeframe)
     {
      case 1      : return "M1";
      case 2      : return "M2";
      case 3      : return "M3";
      case 4      : return "M4";
      case 5      : return "M5";
      case 6      : return "M6";
      case 10     : return "M10";
      case 12     : return "M12";
      case 15     : return "M15";
      case 20     : return "M20";
      case 30     : return "M30";
      case 16385  : return "H1";
      case 16386  : return "H2";
      case 16387  : return "H3";
      case 16388  : return "H4";
      case 16390  : return "H6";
      case 16392  : return "H8";
      case 16396  : return "H12";
      case 16408  : return "D1";
      case 32769  : return "W1";
      case 49153  : return "MN1";
      default     : return (string)(int)Period();
     }
  }
试试这个
string NameTimeframe( const ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT )
{
  return(StringSubstr(EnumToString(timeframe == PERIOD_CURRENT ? Period() : timeframe), 7));
}
 
//+------------------------------------------------------------------+
//|| 填充位置票数组|
//+------------------------------------------------------------------+
void FillingListTickets(void)
  {
   list_tickets_buy.Clear();
   list_tickets_sell.Clear();
   total_volume_buy=0;
   total_volume_sell=0;
//---
   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      ulong ticket=PositionGetTicket(i);
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      if(PositionGetInteger(POSITION_MAGIC)!=InpMagic)   continue;
      if(PositionGetString(POSITION_SYMBOL)!=symb)       continue;
      double volume=PositionGetDouble(POSITION_VOLUME);
      if(type==POSITION_TYPE_BUY)
        {
         list_tickets_buy.Add(ticket);
         total_volume_buy+=volume;
        }
      else if(type==POSITION_TYPE_SELL)
        {
         list_tickets_sell.Add(ticket);
         total_volume_sell+=volume;
        }
     }
  }

无 PositionGetTicket 检查。

"else if "可以是 "else"。

继续后不使用类型。

 

Expert Advisor 中没有挂单,因此该条件仅适用于 POSITION_TYPE_BUY。

double price=(order_type==ORDER_TYPE_BUY ? symbol_info.Ask() : symbol_info.Bid());

此条件仅适用于POSITION_TYPE_BUY

 
fxsaber:

专家顾问中没有挂单,因此这样的

该条件仅适用于POSITION_TYPE_BUY

为什么?

代码中有两处需要调用该函数:

   //--- 按信号开仓
      if(open_long)
        {
         if(num_s>0) CloseSell();
         if(num_b==0)
           {
            double sl=(InpStopLoss==0   ? 0 : CorrectStopLoss(ORDER_TYPE_BUY,InpStopLoss));
            double tp=(InpTakeProfit==0 ? 0 : CorrectTakeProfit(ORDER_TYPE_BUY,InpTakeProfit));
            double ll=trade.CheckVolume(symb,lot,symbol_info.Ask(),ORDER_TYPE_BUY);
            if(ll>0 && CheckLotForLimitAccount(POSITION_TYPE_BUY,ll))
              {
               if(trade.Buy(ll,symb,0,sl,tp))
                  FillingListTickets();
              }
           }
        }
      if(open_short)
        {
         if(num_b>0) CloseBuy();
         if(num_s==0)
           {
            double sl=(InpStopLoss==0   ? 0 : CorrectStopLoss(ORDER_TYPE_SELL,InpStopLoss));
            double tp=(InpTakeProfit==0 ? 0 : CorrectTakeProfit(ORDER_TYPE_SELL,InpTakeProfit));
            double ll=trade.CheckVolume(symb,lot,symbol_info.Ask(),ORDER_TYPE_SELL);
            if(ll>0 && CheckLotForLimitAccount(POSITION_TYPE_SELL,ll))
              {
               if(trade.Sell(ll,symb,0,sl,tp))
                  FillingListTickets();
              }
           }
        }

因此,如果只有编写这段代码的程序员愚蠢地向函数发送了错误的订单类型,那么就会出现错误。而这段代码不会出错。

 
Artyom Trishkin:

为什么?

代码中有两个地方需要调用这个函数:

因此,如果只有编写这段代码的程序员愚蠢地向函数发送了错误的阶次类型,那么就会出现错误。而这段代码则不会出错。

因为可以对 KB

交易、自动交易系统和交易策略测试论坛

MT4 或 MT5。有何优缺点?

Renat Fatkhullin, 2018.01.31 14:28

  1. 包含 4300个程序和870名专家,在源代码中,足够了解学习和发展自己的想法

并不是说在这种特殊情况下会出现错误。但函数会从一个代码迁移到另一个代码。迁移函数中的潜在错误就像挂在墙上的枪。

当然,你可以让它从你的指缝中溜走。但在这里,我认为最好还是提出警告。

 
fxsaber:

因为对四分卫可以有不同的看法


并不是说在这种特殊情况下会出现错误。但函数会从一个代码迁移到另一个代码。迁移函数中的潜在错误就像挂在墙上的枪。

当然,你可以让它从你的指缝中溜走。但我认为最好还是发出警告。

你说得对,警告是正确的。
作者的意思可能是删除不必要的多余检查--在某些情况下,通用性是不必要的。您一定是被 ENUM_ORDER_TYPE 的枚举搞糊涂了。如果有ENUM_POSITION_TYPE,就不会有问题了。

你关于剪切文本的建议也不会有问题。切换不是更快吗?

 
Artyom Trishkin:

作者可能是想删除不必要的检查--在某些情况下,普遍性是不必要的。您一定是被 ENUM_ORDER_TYPE 枚举搞糊涂了。如果有ENUM_POSITION_TYPE,就不会有问题了。

在这里,您应该更正函数本身及其调用。从 MT4 开始,作者就没有完全意识到这一点。

就像您建议剪切文本一样。切换不是更快吗?

这种切换结构正是您不应该做的。至于速度,这个功能根本不需要速度。但这个例子确实很能说明问题。至少会很有趣。

 
fxsaber:

函数本身及其调用应在此处更正。从 MT4 开始,作者就没有完全意识到这一点。

但这种切换结构正是不应该做的。至于速度,这个函数根本不需要。但这个例子确实很能说明问题。至少会很有趣。

有趣在你看来,设置止损单的最小距离的标准计算方法有什么问题吗?

//+------------------------------------------------------------------+
//| 返回相对于 StopLevel 的正确 StopLoss。
//+------------------------------------------------------------------+
double CorrectStopLoss(const ENUM_ORDER_TYPE order_type,const int stop_loss)
  {
   if(stop_loss==0) return 0;
   double pt=symbol_info.Point();
   double price=(order_type==ORDER_TYPE_BUY ? symbol_info.Ask() : symbol_info.Bid());
   int lv=StopLevel(),dg=symbol_info.Digits();
   return
   (order_type==ORDER_TYPE_BUY ?
    NormalizeDouble(fmin(price-lv*pt,price-stop_loss*pt),dg) :
    NormalizeDouble(fmax(price+lv*pt,price+stop_loss*pt),dg)
    );
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 返回计算出的停止级别|
//+------------------------------------------------------------------+
int StopLevel(void)
  {
   int sp=symbol_info.Spread();
   int lv=symbol_info.StopsLevel();
   return(lv==0 ? sp*size_spread : lv);
  }
//+------------------------------------------------------------------+

我看不出有什么错误。请解释一下。MT4 和 MT5 的最小距离计算方法有何不同?

 

实际上,代码中还有更多错误。例如,事实表明,仅仅为了 SB 风格而使用 CSymbolInfo 是邪恶的。

通过先前收集的票据列表平仓是邪恶的。这是一个非常常见的错误。

交易、自动交易系统和交易策略测试论坛

错误、错误、问题

fxsaber, 2018.01.23 09:39 pm.

这是错误的逻辑。在发送订单失败和成功后,应重新完全读取当前交易环境。这一规则应始终适用。

关于返回代码。我不会在我的智能交易系统中以任何方式分析它们。在我看来,交易逻辑不应依赖于它们。

 
Artyom Trishkin:

有意思。您认为止损单最小距离的标准计算方法有什么问题?

我看不出有什么错误。解释一下。MT4 和 MT5 的最小距离计算有何不同?

错误在于枚举输入和调用,而不是最小距离。但计算结果也不正确,因为

交易、自动交易系统和交易策略测试论坛。

Expert Advisors: Diff_TF_MA_EA

fxsaber, 2018.02.01 21:38

事实证明,仅仅为了 SB 风格而使用 CSymbolInfo 是邪恶的。