RSI EA的Ichimoku未平仓。你可以帮忙吗

杰伊
98
杰伊  

我已经编写了交易RSI Ichimoku的EA。

它没有编译错误,没有警告,但是即使在交易中也没有进行任何交易。 策略测试员.

万一我错过了某些算法或做错了什么,可以帮忙。

#property link      "//www.tbxfkj.com"
#property version   "1.00"

//Ichimoku on RSI indicator input parametres
   input int              tenkan_sen      =  9;                // period of Tenkan-sen 
   input int              kijun_sen       =  9;                // period of Kijun-sen 
   input int              senkou_span_b   =  52;               // period of Senkou Span B 
   input ENUM_TIMEFRAMES  period          =  PERIOD_CURRENT;   // timeframe   

   input int              InpTakeProfitPts=  100;    //Take profit points
   input int              InpStopLossPts  =  50;     //Stop loss points
   input double           InpOrderSize     =  0.20;     //Order size
   input string           InpTradeComment =__FILE__;   //Trade comment
   input int              InpMagicNumber  =  20001;    //Magic number
        
   double   TakeProfit;    //InpTakeProfitPts converted to hold take profit as a double variable
   double   StopLoss;      //InpStopLossPts converted to hold stop loss as a double variable
   
   //identify the buffer numbers
   const string   IndicatorName           =  "Indicators\\Ichimoku on RSI indicator";
   const int      IndexTenkan_sen         =  0;         //these are indexes shown on the Data window mt5
   const int      IndexKijun_sen          =  1;         //--Arranged in their order
   const int      IndexRealRSI            =  2;
   const int      IndexRSIValue           =  3; 
   int            Handle;                               //will be Handle to the iCustom function             
   double         BufferTenkan_sen[3];                  //will capture 3 values each time i run the loop of trading/signal    
   double         BufferKijun_sen[3];
   double         BufferRealRSI[3]; 
   double         BufferRSIValue[3]; 
   
   #include  <Trade\Trade.mqh>
   //Create an instance of CTrade
   CTrade *Trade;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Trade =  new CTrade();
   Trade.SetExpertMagicNumber(InpMagicNumber);
   
   double   point = SymbolInfoDouble(Symbol(),SYMBOL_POINT);
   TakeProfit     = InpTakeProfitPts * point;
   StopLoss       = InpStopLossPts   * point;

//create handle for the iCustom
   Handle   =  iCustom(Symbol(),Period(),IndicatorName,
                       tenkan_sen,kijun_sen,senkou_span_b,period);
   
   if (Handle==INVALID_HANDLE)
   {
        PrintFormat("Error &i",GetLastError());
        return(INIT_FAILED);
   }
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle);
   delete   Trade;
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //where this is to only run once per bar
   if (!NewBar()) return;
   
   //Perform any calculations and analysis here
   //Create Arrays from the handle
   int cnt  = CopyBuffer(Handle,IndexTenkan_sen,0,3,BufferTenkan_sen);
   if (cnt<3)  return;
   cnt  = CopyBuffer(Handle,IndexKijun_sen,0,3,BufferKijun_sen);
   cnt  = CopyBuffer(Handle,IndexRealRSI,0,3,BufferRealRSI);
   cnt  = CopyBuffer(Handle,IndexRSIValue,0,3,BufferRSIValue);
   
   //creating real values for signals
   double currentTenkansen = BufferTenkan_sen[1];     //tenkansen for the current bar or candle
   double priorTenkansen   = BufferTenkan_sen[0];     //tenkansen for the previous bar or candle
   //how do i create RSIValues for signals????
   
   //We calculate the Ask price
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   
   //We calculate the Bid price
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
 //Since i want to merge "Ichimoku on RSI indicator" with RSI indicator 
 // i have to also Create an Array for RSI 
   double myRSIArray[];
   
   //Sort the price array from the current candle downwards
   ArraySetAsSeries(myRSIArray,true);
   
   //we define RSI
   int RSIDefinition = iRSI(_Symbol,_Period,6,PRICE_CLOSE);
   
   //we fill the array with price data
   //Defined EA, one line, current candle for 3 candles, store in array
   CopyBuffer(RSIDefinition,0,0,3,myRSIArray);
   
   //Calculate the current RSI value 
   double myRSIValue=NormalizeDouble(myRSIArray[0],2);
   
   //Executing strategy here
   bool buycondition = (currentTenkansen<15 && priorTenkansen<=15) //Tenkansen line has touched level 15
                        && (myRSIValue<15);                        //while RSI line is below level 15
   bool sellcondition = (currentTenkansen>85 && priorTenkansen>=85)//Tenkansen line has touched level 85
                        && (myRSIValue<85);                        //while RSI line is above level 85
   
   if(buycondition) {
   CloseAll(POSITION_TYPE_SELL);     //if i am buying, close all sell positions
   OrderOpen(ORDER_TYPE_BUY);
   }  else
   if(sellcondition) {
   CloseAll(POSITION_TYPE_BUY);     //if i am selling, close all buy positions
   OrderOpen(ORDER_TYPE_SELL);
   }
   
   //save any information for next time
   return;
   
 }
 
 bool NewBar() {
 
   static datetime prevTime      = 0;
   datetime        currentTime   = iTime(Symbol(),Period(),0);
   if (currentTime!=prevTime) {
   
   prevTime   =   currentTime;
   return(true);
   }
 return(false);
 
 }
//creating a closeall function (close all buying positions first when opening a sell position)
void  CloseAll(ENUM_POSITION_TYPE positionType) {

      int cnt  = PositionsTotal();                                 //count the number of totl positions
      for (int i = cnt-1; i>0; i--) {                             //looping from top to bottom
         ulong ticket   = PositionGetTicket(i);
         if (ticket>0) {
            if (PositionGetString(POSITION_SYMBOL)==Symbol() 
               && PositionGetInteger(POSITION_MAGIC)==InpMagicNumber
               && PositionGetInteger(POSITION_TYPE)==positionType) {
              Trade.PositionClose(ticket);
          }
       }
    }

}

bool OrderOpen (ENUM_ORDER_TYPE orderType) {

     double price = (orderType==ORDER_TYPE_BUY) ?
                     SymbolInfoDouble(Symbol(),SYMBOL_ASK) :
                     SymbolInfoDouble(Symbol(),SYMBOL_BID);
                     
     Trade.PositionOpen(Symbol(),orderType,InpOrderSize,price,0,0,InpTradeComment);
     
     return(true);
     
  }
//+------------------------------------------------------------------+
杰伊
98
杰伊  
弗拉基米尔·卡普托夫(Vladimir Karputov):

那么它之所以不开放交易是因为头寸误解吧? 

我面临的挑战是 添加Ichimoku 与RSI在同一窗口上。您也可以帮忙吗?

弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
237046
弗拉基米尔·卡普托夫(Vladimir Karputov)  
杰伊 :

那么它之所以不开放交易是因为头寸误解吧? 

我面临的挑战是在与RSI相同的窗口中添加Ichimoku。您也可以帮忙吗?

我告诉你第一个错误。在纠正第一个错误之前,没有任何讨论的意义。

杰伊
98
杰伊  
弗拉基米尔·卡普托夫(Vladimir Karputov):

我对算法进行了许多更改。

我已经对其进行了改组并进行了更正

[记住规则:必须一次收到指示器手柄!这是在OnInit()中完成的!!!!


EA编译没有错误,但仍未在 策略测试员.

档案:
弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
237046
弗拉基米尔·卡普托夫(Vladimir Karputov)  
杰伊 :

我对算法进行了许多更改。

我已经对其进行了改组并进行了更正

[记住规则:必须一次收到指示器手柄!这是在OnInit()中完成的!!!!


EA编译没有错误,但仍未在 策略测试员 .

永远不要浪费墨水. 始终处理可能的错误-如果收到错误,您将立即看到它。使用逐步调试-


这是测试的基础。

正确处理示例(适用于iRSI)

//--- create handle of the indicator iRSI
   handle_iRSI=iRSI(m_symbol.Name(),Inp_RSI_period,Inp_RSI_ma_period,Inp_RSI_applied_price);
//--- if the handle is not created
   if(handle_iRSI==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iRSI indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(Inp_RSI_period),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
杰伊
98
杰伊  
弗拉基米尔·卡普托夫(Vladimir Karputov):

永远不要浪费墨水. 始终处理可能的错误-如果收到错误,您将立即看到它。使用逐步调试-


这是测试的基础。

正确处理示例(适用于iRSI)

我已经为RSI(独立)创建了句柄,但是随后我不得不在RSI上为ichimoku创建了句柄,这就是我不得不使用ichimoku句柄作为RSI的应用价格的原因。 

我不确定我的EA现在必须使用哪些变量和函数才能将Tenkansen用作 信号线 在RSI上。那是我的大问题。 
弗拉基米尔·卡普托夫(Vladimir Karputov)
主持人
237046
弗拉基米尔·卡普托夫(Vladimir Karputov)  
杰伊 :
我已经为RSI(独立)创建了句柄,但是随后我不得不在RSI上为ichimoku创建了句柄,这就是我不得不使用ichimoku句柄作为RSI的应用价格的原因。 

我不确定我的EA现在必须使用哪些变量和函数才能将Tenkansen用作 信号线 在RSI上。那是我的大问题。 

这样您就可以看到自己的错误-首先按照我说的做:做防御并检查。遇到错误时,您将在终端日志中看到错误的描述。