EA: 任意仓位锁仓 - 页 2

[删除]  

下午好,我的朋友...

我一直在学习MQL5 编程,它的代码是我学习的灵感和基础,我学到了很多东西,但有时我会有点迷茫,我不明白某些代码到底是做什么的,为什么会有这些代码......

我能够理解 "对冲任何位置 "的整个代码,只是对代码的一部分难以理解它的作用和存在的原因,能否帮我理解它的作用和添加到代码中的原因?

bool RefreshRates(const string symbol,
                  const ulong magic,
                  double freeze_level,
                  double stop_level)
{
   if(!m_symbol.Name(symbol))
   {
      return(false);
   }

   m_trade.SetExpertMagicNumber(magic);
   m_trade.SetDeviationInPoints(0);
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetMarginMode();

   if(!m_symbol.RefreshRates())
   {
      Print("RefreshRates error");
      return(false);
   }

   if(!m_symbol.Refresh())
   {
      Print("Refres error");
      return(false);
   }
   
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
   {
      return(false);
   }

   freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
   {
      freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   }
   freeze_level*=1.1;

   stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
   {
      stop_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   }
   stop_level*=1.1;

   if(freeze_level<=0.0 || stop_level<=0.0)
   {
      return(false);
   }
   return(true);
}
 
rmca :

下午好,我的朋友

我一直在学习 MQL5 编程,它的代码是我学习的灵感和基础,我学到了很多东西,但有时我有点迷茫,不明白某些代码到底是做什么的,为什么会有这些代码......

我能够理解 "对冲任何位置 "的整个代码,只是对代码的一部分难以理解它的作用和存在的原因,能否帮我理解它的作用和添加到代码中的原因?

到底哪里不清楚?

[删除]  
Vladimir Karputov:

到底是什么地方不清楚?

freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
   {
      freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   }
   freeze_level*=1.1;

   stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
   {
      stop_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;
   }
   stop_level*=1.1;

   if(freeze_level<=0.0 || stop_level<=0.0)
   {
      return(false);
   }
   return(true);
}

我不明白为什么要检查"freeze_level "和 "stop_level",为什么在它们返回值为 "0 "时要计算(Ask-Bid)*3?如果没有返回值 "0",是否要乘以 1.1?

freeze_level" 和 "stop_level "是什么意思?

我查阅了文档,但不太明白它们的作用,也不明白为什么在返回值为 "0 "或不返回的情况下要进行检查和乘法。

 
rmca :

我不明白为什么要检查 "freeze_level "和 "stop_level", ***

为什么要检查:请参阅 "交易机器人在市场发布前必须通过的检查"。


rmca:

***为什么在它们返回值为 "0 "的情况下,会发生(卖价-买价)*3的计算?***

基本保护:"0 "可能表示浮动水平。在这种情况下,通常会乘以 "3"。


我的新智能交易系统使用了一种改进的方法:

***
input group             "Additional features"
***
input uchar    InpFreezeCoefficient = 1;           // 系数(如果冻结==0 或停止水平==0)
***
//+------------------------------------------------------------------+
//| 检查冻结和停止水平|
//+------------------------------------------------------------------+
void FreezeStopsLevels(double &freeze,double &stops)
  {
//--- 检查冻结和停止水平
   /*
 SYMBOL_TRADE_FREEZE_LEVEL 显示挂单和未结头寸冻结交易操作的距离
 ,单位为点
 ------------------------|--------------------|--------------------------------------------
 订单/头寸类型 | 激活价格 | 检查
 ------------------------|--------------------|--------------------------------------------
 买入限价订单| Ask | Ask-OpenPrice>= SYMBOL_TRADE_FREEZE_LEVEL
 买入止损单 | Ask | Ask-OpenPrice-AEVELAsk | OpenPrice-Ask >= SYMBOL_TRADE_FREEZE_LEVEL= SYMBOL_TRADE_FREEZE_LEVEL
 卖出限价订单 | 出价| 开盘价-出价 >= SYMBOL_TRADE_FREEZE_LEVEL
 卖出止损单| Bid-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL
 买入头寸| 出价| TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL
 || Bid-StopLoss >= SYMBOL_TRADE_FREEZE_LEVEL
 卖出头寸| Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL
 || StopLoss-Ask >= SYMBOL_TRADE_FREEZE_LEVEL
 ------------------------------------------------------------------------------------------

 SYMBOL_TRADE_STOPS_LEVEL 决定
 StopLoss 和 TakeProfit 水平从未结头寸当前收盘价的最小缩进点数
 ------------------------------------------------|------------------------------------------
 按卖出价买入 | 按买入价卖出
 ------------------------------------------------|------------------------------------------
 TakeProfit>= 买入价| TakeProfit <= Ask
 StopLoss<= 买入价| StopLoss >= Ask
 TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL | Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL
 Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL | StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL
 ------------------------------------------------------------------------------------------
 */
   double coeff=(double)InpFreezeCoefficient;
   if(!RefreshRates() || !m_symbol.Refresh())
      return;
//--- 冻结级别 -> 用于挂单和修改
   double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();
   if(freeze_level==0.0)
      if(InpFreezeCoefficient>0)
         freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> 用于止盈和止损
   double stop_level=m_symbol.StopsLevel()*m_symbol.Point();
   if(stop_level==0.0)
      if(InpFreezeCoefficient>0)
         stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
   freeze=freeze_level;
   stops=stop_level;
//---
   return;
  }
The checks a trading robot must pass before publication in the Market
The checks a trading robot must pass before publication in the Market
  • www.mql5.com
Before any product is published in the Market, it must undergo compulsory preliminary checks, as a small error in the expert or indicator logic can cause losses on the trading account. That is why we have developed a series of basic checks to ensure the required quality level of the Market products. If any errors are identified by the Market...
[删除]  
Vladimir Karputov:

为什么要检查:阅读《交易机器人在市场上发布前必须通过的检查


基本保护:"0 "可能表示浮动水平。在这种情况下,通常会乘以 "3"。


我的新 "智能交易系统 "采用了一种改进的方法:

感谢您的回复,我阅读了您发给我的所有文档,并对代码做了一些修改:

bool RefreshRates(const string symb,
                  const ulong magi)
{
   if((!m_symbol.Name(symb))
   && (!m_symbol.RefreshRates() || !m_symbol.Refresh())
   && (m_symbol.Ask()==0 || m_symbol.Bid()==0))
   {
      return(false);
   }
   m_trade.SetExpertMagicNumber(magi);
   m_trade.SetDeviationInPoints(0);
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetMarginMode();
   return(true);
}

您认为这种更新(并检查更新)报价和交易配置的方法好吗?

 
rmca :

感谢您的回复,我阅读了您发给我的所有文档,并对代码做了一些修改:

您认为这种更新(并检查更新)报价和交易配置的方法好吗?

这几行是

   m_trade.SetDeviationInPoints(0);
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetMarginMode();

一旦您需要在 OnInit 中注册。



您设置了零滑点 - 请做好经常收到拒绝的准备

 
您只需让这个 EA 在图表 上处于激活状态,它就会监控并 "保护 "另一个图表上另一个 EA 的位置,是这样吗?
 
有一个问题,如果地段系数小于 1,例如 0.5,会发生什么情况?
 
Eduardo Alvarado :
有一个问题,如果手数系数小于 1,例如 0.5,会发生什么情况?

将建立一个交易量较小的仓位。

 
是否有可能升级该 EA,以过滤订单并只根据特定的神奇数字 进行套期保值?