交易机器人在市场发布前必须经过的检验 - 页 5

 
Oleksii Chepurnyi:
但这样就有可能错过交易.....。
这是关于市场的。所以不应该出现错误。或者说,应该有他们的充分处理。
 
Artyom Trishkin:
这是关于市场的。因此,不应该出现错误。或者说,应该有适当的处理。

如果不是为了市场,我才懒得管呢:)

据我所知,保证金是为了防止滑点?

 
Oleksii Chepurnyi:

如果不是为了市场,我也不会费这么大劲:)

我知道保证金是为了防止滑点?

是的,实际上是为了在价格剧烈波动的情况下将出错的概率降低一些。

 
Oleksii Chepurnyi:

如果不是为了市场,我也不会费这么大劲:)

我的理解是,保证金是为了防止滑点?

滑点 - 执行时,这里 - 市场环境状态下交易请求的正确性

计算 - 检查正确性,必要时更正并发送请求。然后检查请求结果。这在 EA 端进行。

而执行是在服务器端,当价格发生变化时,服务器部分已经需要滑点值来接受或拒绝请求。

 

下午。

来自文档:

symbol_volume_limit。

此符号允许的最大交易量是未结头寸和单向挂单(买入或卖出)的总交易量。例如,如果限制为 5 手,您可以有一个 5 手成交量的买入未平仓合约,并挂一个 5 手成交量的卖出限价挂单。但您不能下买入限价挂单(因为一个方向的总交易量会超过限价),也不能下超过 5 手的卖出限价单。


据我所知,计算时应该只考虑我们要开仓或下单的方向上所有仓位和订单的交易量。

但在这里,一个符号的手数限制 完全没有考虑到方向....。

还是我误解了什么?

 
Vladislav Andruschenko:

也许应该在该函数中将手数正常化,这样就不会出现 Disabled。

然后函数写入没有资金,但不会向服务器发送开仓 请求,这符合市场规则。

我最近开始使用这样的指令,大约是在两年前:

实际上一切正常。

开仓时,EA 只返回Print("Not Enought Money Margin Required "+( string)margin) 字符串

该智能交易系统已通过市场测试,大家都很满意。

谢谢 Vladislav!

您的变体仍在运行,不像我的变体之前运行正常,而这个变体则是验证器指示我们使用的:

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   // -- 如果钱不够
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- 测试成功
   return(true);
  }
 
Ramiz Mavludov:
感谢弗拉迪斯拉夫!

您的变体与我的变体不同,我的变体之前运行正常,而您的变体则运行正常:

这段代码在哪里显示?

PS 我在葡萄牙语和日语版本的文章中找到了它,并进行了更正。还有 gd
 
Oleksii Chepurnyi:

下午。

来自文档:

symbol_volume_limit。

此符号允许的最大交易量是未结头寸和单向挂单(买入或卖出)的总交易量。例如,如果限制为 5 手,您可以有一个 5 手成交量的买入未平仓合约,并挂一个 5 手成交量的卖出限价挂单。但是,您不能下买入限价挂单(因为一个方向的总成交量将超过限价),也不能下超过 5 手的卖出限价单。


据我所知,计算时应该只考虑我们要开仓或下单的方向上所有仓位和订单的交易量。

但在这里,一个符号的手数限制 完全没有考虑到方向....。

还是我误解了什么?

您是对的,在这个例子中没有考虑方向。您可以尝试通过考虑符号来做到这一点:买入订单为正,卖出订单为负。输出的数值和符号将为我们提供交易量和方向。

我们需要纠正

 
Rashid Umarov:

该代码在哪里显示?

PS 在葡萄牙语和日语版本的文章中找到了,并进行了更正。还有 gd

我现在无法显示它,因为当我把它发送出去进行验证时,在报告中点击 148 错误,我看到了

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   // -- 如果钱不够
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- 测试成功
   return(true);
  }
网站版本仍为俄文。
 
Rashid Umarov:

您说得对,在这个例子中没有考虑方向。我们可以尝试通过考虑符号来做到这一点:买入订单是积极的,卖出订单是消极的。输出的数值和符号将为我们提供成交量和方向。

需要更正

我不明白符号的意思...

我是这样写的

//--- 所有项目的最大容量
   double max_volume = SymbolInfoDouble(CheckSymb,SYMBOL_VOLUME_LIMIT);
   if(ED(max_volume,0)) return(true);
//---
   double sum_volume = 0;
   int    oper = 0;
   if(CheckOperation==ORDER_TYPE_BUY  || CheckOperation==ORDER_TYPE_BUY_LIMIT  || CheckOperation==ORDER_TYPE_BUY_STOP  || CheckOperation==ORDER_TYPE_BUY_STOP_LIMIT)  oper = 1;
   if(CheckOperation==ORDER_TYPE_SELL || CheckOperation==ORDER_TYPE_SELL_LIMIT || CheckOperation==ORDER_TYPE_SELL_STOP || CheckOperation==ORDER_TYPE_SELL_STOP_LIMIT) oper = 2;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(!pst.SelectByIndex(i)) ShowError;
      if(pst.Symbol()==CheckSymb)
        {
         if(oper==1 && pst.PositionType()==POSITION_TYPE_BUY)  sum_volume += pst.Volume();
         if(oper==2 && pst.PositionType()==POSITION_TYPE_SELL) sum_volume += pst.Volume();
        }
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!ord.SelectByIndex(i)) ShowError;
      if(ord.Symbol()==CheckSymb)
        {
         if(oper==1 && (ord.OrderType()==ORDER_TYPE_BUY  || ord.OrderType()==ORDER_TYPE_BUY_LIMIT  || ord.OrderType()==ORDER_TYPE_BUY_STOP  || ord.OrderType()==ORDER_TYPE_BUY_STOP_LIMIT))  sum_volume += ord.VolumeCurrent();
         if(oper==2 && (ord.OrderType()==ORDER_TYPE_SELL || ord.OrderType()==ORDER_TYPE_SELL_LIMIT || ord.OrderType()==ORDER_TYPE_SELL_STOP || ord.OrderType()==ORDER_TYPE_SELL_STOP_LIMIT)) sum_volume += ord.VolumeCurrent();
        }
     }
   if(sum_volume+CheckVolume > max_volume)
     {
      Alert(OrdersText(0010),DoubleToString(max_volume,VolumeDigits(CheckSymb)));
      return(false);
     }
//---
   return(true);