Code says that there is two INIT_FAILED expression not boolean.
Marks Vāle :
Code says that there is two INIT_FAILED expression not boolean.
Code says that there is two INIT_FAILED expression not boolean.
Use version 1.003 (taken from the Russian part of the forum - https://www.mql5.com/ru/code/16783 )
Hi,
Thanks for your ea, I modified it to change the MA periods, it is well profitable.
Below the modified code
//+------------------------------------------------------------------+ //| 2MA Bunny Cross Expert(barabashkakvn's edition).mq5 | //| Copyright © Ron Thompson | //| http://www.lightpatch.com/forex/ | //+------------------------------------------------------------------+ #property copyright "Ron Thompson" #property link "http://www.lightpatch.com/forex" #property version "1.003" //--- #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> #include <Expert\Money\MoneyFixedMargin.mqh> CPositionInfo m_position; // trade position object CTrade m_trade; // trading object CSymbolInfo m_symbol; // symbol info object CAccountInfo m_account; // account info wrapper CMoneyFixedMargin *m_money; //--- input parameters input double InpLots = 0; // Lots (or "Lots">0 and "Risk"==0 or "Lots"==0 and "Risk">0) input double Risk = 5; // Risk (or "Lots">0 and "Risk"==0 or "Lots"==0 and "Risk">0) input int PeriodMAS=20; // Period of the fast MA input int PeriodMAF=5; input ulong m_magic=319906800; // magic number //--- ulong m_slippage=10; // slippage int handle_iMA_5; // variable for storing the handle of the iMA indicator int handle_iMA_20; // variable for storing the handle of the iMA indicator //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(!m_symbol.Name(Symbol())) // sets symbol name return(INIT_FAILED); RefreshRates(); //--- m_trade.SetExpertMagicNumber(m_magic); m_trade.SetMarginMode(); m_trade.SetTypeFillingBySymbol(m_symbol.Name()); m_trade.SetDeviationInPoints(m_slippage); //--- tuning for 3 or 5 digits int digits_adjust=1; if(m_symbol.Digits()==3 || m_symbol.Digits()==5) digits_adjust=10; //--- if(!LotsOrRisk(InpLots,Risk,digits_adjust)) return(INIT_PARAMETERS_INCORRECT); //--- 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(INIT_FAILED); m_money.Percent(Risk); } else { Print(__FUNCTION__,", ERROR: Object CMoneyFixedMargin is NULL"); return(INIT_FAILED); } //--- create handle of the indicator iMA handle_iMA_5=iMA(m_symbol.Name(),Period(),PeriodMAF,0,MODE_SMA,PRICE_WEIGHTED); //--- if the handle is not created if(handle_iMA_5==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- create handle of the indicator iMA handle_iMA_20=iMA(m_symbol.Name(),Period(),PeriodMAS,3,MODE_SMA,PRICE_WEIGHTED); //--- if the handle is not created if(handle_iMA_20==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(Period()), GetLastError()); //--- the indicator is stopped early return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- if(m_money!=NULL) delete m_money; } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- we work only at the time of the birth of new bar static datetime PrevBars=0; datetime time_0=iTime(m_symbol.Name(),Period(),0); if(time_0==PrevBars) return; PrevBars=time_0; //--- double ArrayMA5[]; ArraySetAsSeries(ArrayMA5,true); double ArrayMA20[]; ArraySetAsSeries(ArrayMA20,true); if(!iMAGetArray(handle_iMA_5,0,3,ArrayMA5) || !iMAGetArray(handle_iMA_20,0,3,ArrayMA20) || !RefreshRates()) { PrevBars=0; return; } //--- bool signal_buy=(ArrayMA5[2]<ArrayMA20[2] && ArrayMA5[1]>ArrayMA20[1]); bool signal_sell=(ArrayMA5[2]>ArrayMA20[2] && ArrayMA5[1]<ArrayMA20[1]); //--- if(signal_buy) { ClosePositions(POSITION_TYPE_SELL); OpenBuy(0.0,0.0); } if(signal_sell) { ClosePositions(POSITION_TYPE_BUY); OpenSell(0.0,0.0); } //--- } //+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- } //+------------------------------------------------------------------+ //| Get value of buffers for the iMA in the array | //+------------------------------------------------------------------+ bool iMAGetArray(const int handle_iMA,const int start_pos,const int count,double &arr_buffer[]) { //--- bool result=true; if(!ArrayIsDynamic(arr_buffer)) { Print("This a no dynamic array!"); return(false); } ArrayFree(arr_buffer); int buffer_num=0; // indicator buffer number //--- reset error code ResetLastError(); //--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 index int copied=CopyBuffer(handle_iMA,buffer_num,start_pos,count,arr_buffer); if(copied<0) { //--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } else if(copied<count) { PrintFormat("Moving Average indicator: %d elements from %d were copied",copied,count); DebugBreak(); return(false); } //--- return(result); } //+------------------------------------------------------------------+ //| Close positions | //+------------------------------------------------------------------+ void ClosePositions(const ENUM_POSITION_TYPE pos_type) { for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic) if(m_position.PositionType()==pos_type) // gets the position type m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol } //+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ bool RefreshRates(void) { //--- refresh rates if(!m_symbol.RefreshRates()) { Print("RefreshRates error"); return(false); } //--- protection against the return value of "zero" if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Check the correctness of the position volume | //+------------------------------------------------------------------+ bool CheckVolumeValue(double volume,string &error_description) { //--- minimal allowed volume for trade operations double min_volume=m_symbol.LotsMin(); if(volume<min_volume) { error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume); return(false); } //--- maximal allowed volume of trade operations double max_volume=m_symbol.LotsMax(); if(volume>max_volume) { error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume); return(false); } //--- get minimal step of volume changing double volume_step=m_symbol.LotsStep(); int ratio=(int)MathRound(volume/volume_step); if(MathAbs(ratio*volume_step-volume)>0.0000001) { error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f", volume_step,ratio*volume_step); return(false); } error_description="Correct volume value"; return(true); } //+------------------------------------------------------------------+ //| Lots or risk in percent for a deal from a free margin | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| Open Buy position | //+------------------------------------------------------------------+ void OpenBuy(double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); double check_open_long_lot=0.0; if(Risk>0.0) { check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl); Print("sl=",DoubleToString(sl,m_symbol.Digits()), ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2), ", Balance: ", DoubleToString(m_account.Balance(),2), ", Equity: ", DoubleToString(m_account.Equity(),2), ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2)); if(check_open_long_lot==0.0) { Print(__FUNCTION__,", ERROR: method CheckOpenLong returned the value of \"0.0\""); return; } } else check_open_long_lot=InpLots; //--- check volume before OrderSend to avoid "not enough money" error (CTrade) double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY); if(check_volume_lot!=0.0) { if(check_volume_lot>=check_open_long_lot) { if(m_trade.Buy(check_open_long_lot,NULL,m_symbol.Ask(),sl,tp)) { if(m_trade.ResultDeal()==0) { Print("#1 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResult(m_trade,m_symbol); } else { Print("#2 Buy -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResult(m_trade,m_symbol); } } else { Print("#3 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResult(m_trade,m_symbol); } } else { string text=""; if(Risk>0.0) text="< method CheckOpenLong ("+DoubleToString(check_open_long_lot,2)+")"; else text="< Lots ("+DoubleToString(InpLots,2)+")"; Print(__FUNCTION__,", ERROR: method CheckVolume (",DoubleToString(check_volume_lot,2),") ", text); return; } } else { Print(__FUNCTION__,", ERROR: method CheckVolume returned the value of \"0.0\""); return; } //--- } //+------------------------------------------------------------------+ //| Open Sell position | //+------------------------------------------------------------------+ void OpenSell(double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); double check_open_short_lot=0.0; if(Risk>0.0) { check_open_short_lot=m_money.CheckOpenShort(m_symbol.Bid(),sl); Print("sl=",DoubleToString(sl,m_symbol.Digits()), ", CheckOpenLong: ",DoubleToString(check_open_short_lot,2), ", Balance: ", DoubleToString(m_account.Balance(),2), ", Equity: ", DoubleToString(m_account.Equity(),2), ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2)); if(check_open_short_lot==0.0) { Print(__FUNCTION__,", ERROR: method CheckOpenShort returned the value of \"0.0\""); return; } } else check_open_short_lot=InpLots; //--- check volume before OrderSend to avoid "not enough money" error (CTrade) double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_short_lot,m_symbol.Bid(),ORDER_TYPE_SELL); if(check_volume_lot!=0.0) { if(check_volume_lot>=check_open_short_lot) { if(m_trade.Sell(check_open_short_lot,NULL,m_symbol.Bid(),sl,tp)) { if(m_trade.ResultDeal()==0) { Print("#1 Sell -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResult(m_trade,m_symbol); } else { Print("#2 Sell -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResult(m_trade,m_symbol); } } else { Print("#3 Sell -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResult(m_trade,m_symbol); } } else { string text=""; if(Risk>0.0) text="< method CheckOpenShort ("+DoubleToString(check_open_short_lot,2)+")"; else text="< Lots ("+DoubleToString(InpLots,2)+")"; Print(__FUNCTION__,", ERROR: method CheckVolume (",DoubleToString(InpLots,2),") ", text); return; } } else { Print(__FUNCTION__,", ERROR: method CheckVolume returned the value of \"0.0\""); return; } //--- } //+------------------------------------------------------------------+ //| Print CTrade result | //+------------------------------------------------------------------+ void PrintResult(CTrade &trade,CSymbolInfo &symbol) { Print("Code of request result: "+IntegerToString(trade.ResultRetcode())); Print("code of request result: "+trade.ResultRetcodeDescription()); Print("deal ticket: "+IntegerToString(trade.ResultDeal())); Print("order ticket: "+IntegerToString(trade.ResultOrder())); Print("volume of deal or order: "+DoubleToString(trade.ResultVolume(),2)); Print("price, confirmed by broker: "+DoubleToString(trade.ResultPrice(),symbol.Digits())); Print("current bid price: "+DoubleToString(trade.ResultBid(),symbol.Digits())); Print("current ask price: "+DoubleToString(trade.ResultAsk(),symbol.Digits())); Print("broker comment: "+trade.ResultComment()); //int d=0; } //+------------------------------------------------------------------+

You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
2MA Bunny Cross Expert:
An Expert Advisor based on two indicators iMA (Moving Average, MA).
Author: Vladimir Karputov