小额资金管理-指标被新的MQL4毁掉了 - 页 2

 
@deysmacro:我知道导致除以0 的那条线在哪里。这是因为我需要过去五天的日平均范围。后来在指标中我用ATR除以什么,只要数据不更新,ATR就是零,这就是问题所在。我需要确定至少过去5天的每日数据是可用的。只有这样,ATR才会>0,指标才会工作。
 
mar:
@deysmacro:我知道导致除以0的那条线在哪里。这是因为我需要过去五天的日平均范围。在指标的后面,我用该ATR除以什么,只要数据不更新,ATR就是零,这就是问题所在。我需要确定至少过去5天的每日数据是可用的。只有这样,ATR才会>0,指标才会工作。

把可用的数据放到GV中,然后检索出来。这样,当有数据出现或数据有差异时,只需更新GV。

也许ATR就是这样工作的。


人们总是说 "先让它工作,然后优化代码"。

有时为了使其工作,代码的行数非常长,但一旦它工作,你可以开始修剪代码。)

 

也许这听起来很愚蠢,但什么是GV?

 
全局变量
 

当然... :-)

还有一些我无法解释的事情。下面的代码是对我发布的第一个代码的一个小修改。它也是一个资金管理指标,但我删除了ATR。它只打印5-100点的止损水平,以5个点为一个步骤。所以,根本就没有ATR计算。当你把这个指标拖到你的图表上时,它运行良好。每个货币对,每个时间框架。没有问题。但是,当你打开MetaTrader时,它会导致除以0的错误,并且再次只打印 "标签 "而不是止损水平。

这个错误是在这一行引起的。

lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);

我打印了这一行的所有变量,我得出的结论是AccountBalance()是零,MarketInfo(Symbol(), MODE_TICKVALUE)是零。所以很明显,当你打开MetaTrader时,根本就没有数据可用。这在旧MetaTrader中从未发生过。所以我不知道该怎么做...

这里是代码。

#property indicator_chart_window
//--- input parameters
extern int  Risk=5;
extern int SL_Levels=20;
int multi, exp1, SL, i, k;
double MoneyRisk, Spread, modifySpread, lots;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   k=0;
   for(i=1; i<=SL_Levels; i++)
   {
      if (ObjectFind("SL"+i) == -1)
      {
         ObjectCreate("SL"+i, OBJ_LABEL, 0, 0, 0);
         ObjectSet("SL"+i, OBJPROP_CORNER, 1);
         ObjectSet("SL"+i, OBJPROP_XDISTANCE, 3);
         ObjectSet("SL"+i, OBJPROP_YDISTANCE, k);
         k=k+15;    
      }
   }
   if (ObjectFind("Spread") == -1)
   {
      ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0);
      ObjectSet("Spread", OBJPROP_CORNER, 3);
      ObjectSet("Spread", OBJPROP_XDISTANCE, 3);
      ObjectSet("Spread", OBJPROP_YDISTANCE, 1);
   }
   
//-- 4 / 5 Digit Settings --
   multi   = 1;
   exp1     = 0;
   modifySpread = 1;
   if (Digits==5 || Digits==3)
   {
      modifySpread = 0.1;
      multi=10;
      exp1=1;
   }
//----
   SL = 10;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(i=1; i<=SL_Levels; i++)
   {
      ObjectDelete("SL"+i);
   }
   ObjectDelete("Spread");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
   Spread     = MarketInfo(Symbol(), MODE_SPREAD)*modifySpread;
   MoneyRisk  = AccountBalance()*Risk*0.01;
   k=0;
   Print(Spread);
   Print(AccountBalance());
   Print(MoneyRisk);
   Print(MarketInfo(Symbol(), MODE_TICKVALUE));
   Print(SL);
   Print(multi);
   for(i=1; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
      ObjectSetText("SL"+i, SL+ " : "+DoubleToStr(lots, 2), 10, "Calibri", White);
      k=k+15;
      SL = SL+5;     
   }
   SL = 10;
   ObjectSetText("Spread", Spread, 10, "Calibri", White);

   WindowRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
你不知道数学计算的基本命令?我马上就知道问题出在哪里了。你的数学计算命令。
 

你能不能说得更准确一点?它们到底有什么问题(因为它一直在工作...)?


我认为仍然存在一个问题,即我需要的MetaTrader的AccountBalance()和其他数据在启动平台后无法使用。

 

另一个例子。

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
//----
  {
   Comment  (AccountBalance());
//----
   return(0);
  }
//+------------------------------------------------------------------+
如果你打开MetaTrader,结果将是零!而且一直是零,直到你改变时间框架或货币对。而且一直是零,直到你改变时间框架或货币对。我认为这正是除以零 错误的问题。你不也认为吗?
 
mar:

我打印了这一行的所有变量,我得出的结论是AccountBalance()是零,MarketInfo(Symbol(), MODE_TICKVALUE)是零。所以很明显,当你打开MetaTrader时,根本就没有任何数据可用。这在旧MetaTrader中从未发生过。所以我不知道该怎么做...

以下是代码。

如果你确定这是问题的原因,就在Start()后面加上这句话

if( MarketInfo(Symbol(), MODE_SPREAD)==0 || AccountBalance() == 0 )
   return(0);
 

嘿,GumRai。

我用上面的指标进行了测试。即使我让MetaTrader运行几分钟,账户余额仍然是零。只有当我手动改变一些东西(货币对、时间框架)时,才会显示正确的账户余额。如果我使用你的解决方案,我没有除以零 的错误问题,但指标将永远不会做它的工作,因为AccountBalance保持为零。

我想知道我是否是唯一有这个问题的人?我认为这是新MetaTrader的一个普遍的数据导入问题...