EA: 智能系统 Ichimoku - 页 2

 
Vladimir Karputov #:

启用代码调试和逐步测试。

感谢您的回复。

我进行了调试,发现是高点差导致的不正确 SL 引起了这个问题。

 
amin ghanbari # :

感谢您的回复。

我进行了调试,发现是高点差导致的不正确 SL 引起了这个问题。

Expert Advisor 中的代码是正确的,但如果在下单时价格出现大幅波动,则不会打开仓位。

 
Vladimir Karputov #:

Expert Advisor 中的代码是正确的,但如果在下单时价格出现大幅波动,则不会打开仓位。

我认为这部分应该针对 crypo 进行修改:


//--- 调整 3 或 5 位数
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtStopLoss    = InpStopLoss     * m_adjusted_point;
   ExtTakeProfit  = InpTakeProfit   * m_adjusted_point;
   ExtTrailingStop= InpTrailingStop * m_adjusted_point;
   ExtTrailingStep= InpTrailingStep * m_adjusted_point;


当我使用 RISK 来确定手数时,会出现 getpointer 错误,我必须使用 fix LOT:

//+------------------------------------------------------------------+
//| 自由保证金交易的手数或风险(百分比) //| 自由保证金交易的手数或风险(百分比) //| 自由保证金交易的手数或风险(百分比) //...
//+------------------------------------------------------------------+
bool LotsOrRisk(const double lots,const double risk,const int digits_adjust)
  {
   if(lots<0.0 && risk<0.0)
     {
      Print(__FUNCTION__,", ERROR: Parameter (\"lots\" or \"risk\") can't be less than zero");
      return(false);
     }
   if(lots==0.0 && risk==0.0)
     {
      Print(__FUNCTION__,", ERROR: Trade is impossible: You have set \"lots\" == 0.0 and \"risk\" == 0.0");
      return(false);
     }
   if(lots>0.0 && risk>0.0)
     {
      Print(__FUNCTION__,", ERROR: Trade is impossible: You have set \"lots\" > 0.0 and \"risk\" > 0.0");
      return(false);
     }
   if(lots>0.0)
     {
      string err_text="";
      if(!CheckVolumeValue(lots,err_text))
        {
         Print(__FUNCTION__,", ERROR: ",err_text);
         return(false);
        }
     }
   else
      if(risk>0.0)
        {
         if(m_money!=NULL)
            delete m_money;
         m_money=new CMoneyFixedMargin;
         if(m_money!=NULL)
           {
            if(!m_money.Init(GetPointer(m_symbol),Period(),m_symbol.Point()*digits_adjust))
               return(false);
            m_money.Percent(risk);
           }
         else
           {
            Print(__FUNCTION__,", ERROR: Object CMoneyFixedMargin is NULL");
            return(false);
           }
        }
//---
   return(true);
  }
//+------------------------------------------------------------------+
 
amin ghanbari # :

***

当我使用 RISK 检测地段时,我看到 getpointer 错误,我必须使用 fix LOT:

你看到了自己的错误 - 想想:你设置的风险值是多少?

 

备注:如果您使用的是有巨大点差的工具,您必须设置适当的止损

始终牢记 - 有两个价格:卖出价和买入价。

 
Vladimir Karputov #:

你看到了自己的错误--想一想:你设定的风险值是多少?

问题出在余额不足和点差过导致单边单利 正确

我为 500 美元的余额设置了 1%的风险,杠杆设置为 100:

OpenBuy, ERROR: method CheckOpenLong

打开卖出,ERROR: 方法 CheckOpenShort

这意味着该余额不足以以 BTC 为单位开立最小手数的头寸?

是真的吗?

 
amin ghanbari # :

问题是由于余额不足, 以及 由于抱团传播造成不正确的 SL

我为 500 美元的余额设置了 1%的风险,杠杆设置为 100:

OpenBuy, ERROR: method CheckOpenLong

OpenSell, ERROR: 方法 CheckOpenShort

这意味着该余额不足以以 BTC 为单位开立最小手数的头寸?

是真的吗?

你发现了自己的错误。现在想想如何纠正错误。

 

你好,弗拉基米尔

感谢您分享专家意见,我正试图添加一个条件,以便在条形图收盘超过云层时平仓,这就是我添加的代码,您能帮帮我吗?


 
Mahmoud Ahmed Mahmoud Fahmy # :

你好,弗拉基米尔

感谢您分享专家意见,我正试图添加一个条件,以便在条形图收盘超过云层时平仓,这就是我添加的代码,您能帮帮我吗,拜托了,我是 mql5 的新手


请正确插入代码:首先按 代码 按钮 然后在弹出窗口中粘贴代码

 
Vladimir Karputov #:

请正确插入代码:首先按下 按钮 ,然后在弹出窗口中粘贴代码

您好

非常感谢你的回复,很抱歉我做得一团糟,我对上一篇文章的代码做了一些修改,但仍然没有平仓,而且我设置了 stoploss = 0。

   double Kij2=iIchimokuGet(KIJUNSEN_LINE,3);
   double SpanA2=iIchimokuGet(SENKOUSPANA_LINE,3);
   double SpanB2=iIchimokuGet(SENKOUSPANB_LINE,3);
   double Chinkou2=iIchimokuGet(CHIKOUSPAN_LINE,3);
   
   
   //关闭指令
   
  
   
   
  // m_trade.PositionClose(m_symbol.Name());
   //购买订单
  // {
      
     // if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY )
     // {
        // if(iClose(_Symbol,Period(),1) < SpanB)
       // {
            //m_trade.PositionClose(_Symbol);
          // }
            
     // } 
     // }
      
      //销售订单
      
     // if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
     // {
         
       // if(iClose(_Symbol,Period(),1) > SpanB)
        // {
         // m_trade.PositionClose(_Symbol);
         //}
      // }
            
          // if(m_trade.ResultRetcode()==10008 || m_trade.ResultRetcode()==10009)//请求已完成或已下单
             // {
             // Print("Exit rules:已成功下达平仓指令,票号为:",m_trade.ResultOrder());
             // }
            //否则
              // {
              // Print("Exit rules:平仓指令请求无法完成。错误:",GetLastError());
             // ResetLastError();
               //return;
              // }
            
        // }
    // }
  // }
   
   
//-----------------------------检查买
      if (iClose(_Symbol,PERIOD_D1,1) < iClose(_Symbol,PERIOD_D1,2) && iHigh(_Symbol,PERIOD_H4,2) - iLow(_Symbol,PERIOD_H4,2) > iHigh(_Symbol,PERIOD_H4,1)- iLow(_Symbol,PERIOD_H4,2) )
      {  

      if (iOpen(m_symbol.Name(),Period(),0) > Kij && iOpen(m_symbol.Name(),Period(),0) > SpanA)
  // if(Ten1<=Kij1 && Ten>Kij &&
   //&& m_symbol.Ask()>SpanA1 
   //&& m_symbol.Ask()>SpanB1 &&& 
     // iOpen(m_symbol.Name(),Period(),1)<iClose(m_symbol.Name(),Period(),1)) //||| 
      //(Chinkou1<=iClose(m_symbol.Name(),Period(),11) && Chinkou>iClose(m_symbol.Name(),Period(),10) && 
     // m_symbol.Ask()>SpanA1 && m_symbol.Ask()>SpanB1 && 
     // iOpen(m_symbol.Name(),Period(),1)<iClose(m_symbol.Name(),Period(),1))
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Ask()-ExtStopLoss;
      if(sl>=m_symbol.Bid()) // 事件:仓位尚未打开,必须已经关闭
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Ask()+ExtTakeProfit;
           if(iClose(_Symbol,Period(),1) < SpanB)
   {
      if(m_position.Select(_Symbol))                     //如果该符号的位置已经存在
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY) m_trade.PositionClose(_Symbol);   //这是一个买入仓位,然后平仓
        // if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
         }
   }
      
      OpenBuy(sl,tp);
     }
     }
     
//--- 检查销售
         
     if (iClose(_Symbol,PERIOD_D1,1) > iClose(_Symbol,PERIOD_D1,2) && iHigh(_Symbol,PERIOD_D1,2) - iLow(_Symbol,PERIOD_H4,2) > iHigh(_Symbol,PERIOD_H4,1)- iLow(_Symbol,PERIOD_H4,2) )
      {
 
      if(iOpen(m_symbol.Name(),Period(),0) < Kij && iOpen(m_symbol.Name(),Period(),0) < SpanB)
        
         
        
  // if(Ten1>Kij1 && Ten<Kij &&
   //&& m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && 
     // iOpen(m_symbol.Name(),Period(),1)>iClose(m_symbol.Name(),Period(),1)) //||| 
      //(Chinkou1>=iOpen(m_symbol.Name(),Period(),11) && Chinkou<iOpen(m_symbol.Name(),Period(),10) && 
      //m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && 
      //iOpen(m_symbol.Name(),Period(),1)>iClose(m_symbol.Name(),Period(),1)))
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Bid()+ExtStopLoss;
      if(sl<=m_symbol.Ask()) // 事件:仓位尚未打开,必须已经关闭
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Bid()-ExtTakeProfit;
      
         if(iClose(_Symbol,Period(),1) > SpanB)
         {
            if(m_position.Select(_Symbol))                     //如果该符号的位置已经存在
            {
               if(m_position.PositionType()==POSITION_TYPE_SELL) m_trade.PositionClose(_Symbol);   //这是一个买入仓位,然后平仓
        // if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
            }
         }
      
      OpenSell(sl,tp);
     }
    } 
    // m_trade.PositionClose(_Symbol);
  }