任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 740

 
evillive:
我说的是球场,不是最小的地段,但好吧,算了。
哦,是的,当然,如果你不是为自己写作,你必须考虑到这一点。
 
evillive:

谢谢,已经有人向我解释过了 :D

很明显,对我自己来说,我写的是所有的支票,因为它应该是,只是有一个大纲,如何地段平衡/10带来的比例,但这个想法是不成功的......

但你有很多文字,它可以更简单。

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;

它可以更简单。只是,如果lotstep的MarketInfo()返回0,会发生什么?会有什么后果?专家顾问将被停止,头寸将被放弃?

如果MINLOT被经纪人设置为0.03,LOTSTEP为0.02,也就是说,前两个允许的手数是0.03和0.05,而目前的余额是41 - 在你的代码中计算的手数将是什么值?

为什么,如果手数小于最小值--例如,余额等于1,在表达式完全计算后将等于0--为什么在这种情况下,你的代码取手数等于MINLOT,这可能是0.03,即比 "AccountBalance()*0.001 "的 "原始 "值多30倍,在这种情况下等于0.001?

你不可能总是得到一个有效的手数,因为条件可能是这样,没有一个有效的手数与之对应。错误的情况必须全部编程,必须记住,这至少是90%的工作。

MetaQuotes设定的应用模型是:lot = MINLOT + N * LOTSTEP,其中N = 0, 1, 2......。M.而M是这样的:MINLOT + M * LOTSTEP <= MAXLOT并且MINLOT + (M + 1) * LOTSTEP > MAXLOT。相应地,你也应该在设定的模型内进行计算,即lot = MINLOT + N * LOTSTEP。那么MINLOT和LOTSTEP的各种尴尬的组合就变得不重要了,因为这个公式以一种普遍的方式工作。一旦你把它写好了,调试好了,并集中精力做其他有趣和好玩的事情。而且很高兴--因为你不必不断地回到糟糕的代码中去,因为这个代码又不工作了,而只是出现了故障......

 
simpleton:

它可以更简单。但是,如果MarketInfo()对lotstep返回0,会发生什么?会有什么后果?专家顾问将被停止,头寸将被放弃?

如果MINLOT的值被经纪人设置为0.03,LOTSTEP为0.02,即前两个手数为0.03和0.05,当前余额为41, 在你的代码中,计算手数的值是什么?

为什么,如果手数小于最小值--例如,余额等于1,在完成计算后,它将等于0? 为什么在这种情况下,你的代码采取的手数等于MINLOT,这可能是,例如,0.03,这比 "原始 "值 "AccountBalance()*0.001 "多30倍,在这种情况下等于0.001?

你不可能总是得到一个有效的手数,因为条件可能是这样,没有一个有效的手数与之对应。错误的情况必须全部编程,必须记住,这至少是90%的工作。

MetaQuotes设定的应用模型是:lot = MINLOT + N * LOTSTEP,其中N = 0, 1, 2......。M.而M是这样的:MINLOT + M * LOTSTEP <= MAXLOT并且MINLOT + (M + 1) * LOTSTEP > MAXLOT。相应地,你也应该在设定的模型内进行计算,即lot = MINLOT + N * LOTSTEP。那么MINLOT和LOTSTEP的各种尴尬的组合就变得不重要了,因为这个公式以一种普遍的方式工作。一旦你写好了,调试好了,并专注于其他有趣和好玩的事情。而且很高兴--因为你不必不断地回到糟糕的代码中去,因为这个代码又不工作了,而只是出现了故障......

对于这样的恐怖事件,还要检查是否有足够的资金与这样的地段开。例如,正常人不会允许机器人在知道最小/手数为0.1,步数为0.1的情况下存入10英镑。

如果找到这样一个聪明的人,机器人会告诉他 "把钱给我,在此期间再见":D。

而且我从来没有在任何地方看到或读到过地段步数为零,这是一种幻想......

 
evillive:

对于这样的恐怖事件,还要检查是否有足够的资金以这样的地段开盘。没有人会在知道最小手数是0.1和步数是0.1的情况下,让机器人存入10英镑。

如果找到这样一个聪明的人,机器人会告诉他:"把钱给我,但同时要说再见。" :D

为了避免MarketInfo在测试器中出现零,我这样做。

  double AFM = AccountFreeMargin(); 
  double StopLevel,FreezeLevel,spr,prot;
  if(IsOptimization() || IsTesting() || IsVisualMode())
  {
    MinLot = 0.1;
    LotStep = 0.01;
    spr = Point*10;
    StopLevel = spr*2;
    FreezeLevel = spr*2;
  }
  else
  {
    MinLot = MarketInfo(Symbol(),MODE_MINLOT);
    LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
    spr = MarketInfo(Symbol(),MODE_SPREAD)*Point;
    StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
    FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point;
  }
  if(MM == 1) 
  lot = MinLot+MathMax(LotStep*MathFloor((AFM-initdepo)*risk/100),0); 
  else if(MM == 0) lot = MinLot;
 
evillive:

对于这样的恐怖事件,还要检查是否有足够的资金以这样的地段开盘。例如,没有人会在知道最小手数是0.1,增量是0.1的情况下,让机器人存入10英镑。

如果找到这样一个聪明的人,机器人会告诉他 "把钱给我,再见":D

而且我从来没有在任何地方看到或读到过地段步数为零的说法,这是一种想象...

为什么它是可怕的?因为它不符合简化模式?

我的意思是,在MINLOT = 0.03和LOTSTEP = 0.02的情况下,前两个允许的手数是0.03和0.05。

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

将给出0.04的手数值,这是不允许的。机器人会说 "服务器说我的手数不对 "之类的话。

而当通过MarketInfo()请求其数值时发生错误,可以获得零手数。我给了你如何人为地造成这个错误的代码。

Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));

它的返回值为0,这是一种什么样的幻想?

 
simpleton:

为什么这么恐怖?因为它不符合简化模式?

我的意思是,在MINLOT = 0.03和LOTSTEP = 0.02的情况下,前两个允许的手数是0.03和0.05。

将给出0.04的手数值,这是不允许的。机器人会说 "服务器说我的手数不对 "之类的话。

而当通过MarketInfo()请求其数值时发生错误,可以获得零手数。我已经给了你上面的代码,说明如何人为地诱发这个错误。

它将返回0。那么,幻想是什么呢?

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

这个公式很容易被纠正,以满足要求。你只需要考虑最低的地段

它看起来会有一点不同

lot=Min_Lot+lotstep*MathRound((AccountBalance()-X)*0.001/lotstep);

其中X--最小地段开放的余额。

但仍然需要为最低地段的支票。

 

下午好!

帮助一个无知的人 )在测试器中没有订单打开错误10013错误 的请求,看看错误所在的代码。

日志中的所有数字都显示在订单上,而订单却没有打开。

2014.10.19 12:14:34.984 2014.02.03 00:06:00 请求失败 买0.10在102.31100 sl: 102.27200 tp: 102.33600 [无效的请求]

2014.10.19 12:22:17.928 2014.02.03 00:06:00 ticket =0 retcode =10013

MqlTradeRequest Req;
MqlTradeResult  Res;
   string TradeSmb;
   if(TradeSmb=="") TradeSmb=_Symbol;
   Req.action=TRADE_ACTION_DEAL;
   Req.symbol=TradeSmb;
   Req.volume=0.1;
   Req.type=ORDER_TYPE_BUY;
   Req.type_filling=ORDER_FILLING_IOC;
   Req.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   Req.sl= NormalizeDouble(sym_bid - (StopLoss*sym_point),sym_digits);
   Req.tp= NormalizeDouble(sym_ask + (TakeProfit*sym_point),sym_digits);
   Req.deviation=3;
   Req.comment="777";
if(OrderSend(Req,Res))
{
      Print("Sent...");
}
      Print("ticket =",Res.order,"   retcode =",Res.retcode);
      if(Res.order!=0)
     {
      datetime tm=TimeCurrent();
      //--- request all history
      HistorySelect(0,tm);
      string comment;
      bool result=HistoryOrderGetString(Res.order,ORDER_COMMENT,comment);
      if(result)
        {
         Print("ticket:",Res.order,"    Comment:",comment);
        }
小机器人已经纠正了你的信息
 

你在哪里看到的?

if(OrderSend(Req,Res))

请看文件!并使用SRC按钮来插入代码!

如果你太懒,请看第1次和最后一次。

int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

学习从来都不是一件坏事!

 

亲爱的先生们!

请告知.....

这里有一个函数

订单利润( )

该函数返回所选订单的净利润 值。

问题

该函数与上述函数类似,返回所选订单的损失 值,而不是利润值。

例如,如果一个订单在SL上关闭,损失为150美元,我需要该函数返回150美元的损失

谢谢你。

 
solnce600:

亲爱的先生们!

请告知.....

这里有一个函数

订单利润( )

该函数返回所选订单的净利润 值。

问题

该函数与上述函数一样,为所选订单返回一个损失 值,而不是利润。

例如,如果一个订单在SL上关闭,损失为150美元,我需要该函数返回150美元的损失

谢谢你。

它是一样的!只有金额会出现减号。