You have forgotten to convert your levels (MA_level_1 ..) into prices like e.g.: what_ever = MA_level_1*Point
//+------------------------------------------------------------------+
//| hedgetest.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//------- external parameters ---------------------------------------+
extern string nameInd1 = "___________RSI__________"; // RSi
extern int RSI_period = 7; // RSi period
extern ENUM_APPLIED_PRICE RSI_applied_price = PRICE_CLOSE; // RSi applied price
extern int RSI_up_level = 80; // level up - RSi
extern int RSI_dn_level = 20; // level down - RSi
extern string nameInd2 = "___________MA___________"; // MA
extern int MA_period = 20; // MA period
extern double MA_level_1 = 60; // MA Level 1
extern double MA_level_2 = 120; // MA Level 2
extern int MA_shift = 0; // MA shift
extern ENUM_MA_METHOD MA_method = MODE_EMA; // MA method
extern ENUM_APPLIED_PRICE MA_applied_price = PRICE_CLOSE; // MA applied price
extern string EA_properties = "_________Expert_________"; // Expert properties
extern double Lot = 0.01; // Lot
extern double Take_Profit = 300; // Take profit
extern double StopLoss = 300; // StopLoss
extern int Slippage = 30; // Slippage
extern int NumberOfTry = 5; // number of trade attempts
extern int MagicNumber = 5577555; // Magic Number
extern int params_digits = 5; // Broker digits
//------- global variables ------------------------------------------+
string NameEA="Expert_MA_RSI_Hedge";
double point;
string Symb;
string txt="";
datetime candleTime=0;
//+------------------------------------------------------------------+
//| double to string |
//+------------------------------------------------------------------+
string double_to_str(double num,int _dig=2)
{
string _num = (string)num;
int _pp = StringFind(_num, ".", 0);
if(_pp!=-1) _num=StringSubstr(_num,0,_pp+_dig+1);
return(_num);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
point = MathPow (0.1, params_digits) ;
Symb=Symbol();
if(RSI_up_level>=100 || RSI_up_level<=RSI_dn_level) { Print("Wrong level up - RSi !"); return(INIT_FAILED);}
if(RSI_dn_level<=0 || RSI_dn_level>=RSI_up_level) { Print("Wrong level down - RSi !"); return(INIT_FAILED);}
if(Lot<MarketInfo(Symb,MODE_MINLOT) || Lot>MarketInfo(Symb,MODE_MAXLOT)) { Print("Wrong LOT!"); return(INIT_FAILED);}
if(Slippage<0) Slippage=0;
if(NumberOfTry<1) NumberOfTry=1;
if(MagicNumber<0) MagicNumber=MathAbs(MagicNumber);
Comment("Waiting a new tick!");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { Comment(""); }
//+------------------------------------------------------------------+
//| Looking for a open price |
//+------------------------------------------------------------------+
double OpenPrice(int or_tp)
{
double _opPr=0;
if(or_tp!=0 && or_tp!=1) return (_opPr);
int i,k = OrdersTotal ();
//---
for(i=k-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber)
{
if(or_tp==OrderType())
{
if(_opPr==0) {_opPr=OrderOpenPrice(); continue;}
if(or_tp==0 && _opPr<OrderOpenPrice()) _opPr=OrderOpenPrice();
if(or_tp==1 && _opPr>OrderOpenPrice()) _opPr=OrderOpenPrice();
}
}
}
}
return (_opPr);
}
//+------------------------------------------------------------------+
//| Check open position |
//+------------------------------------------------------------------+
bool HaveOpenPos(int or_tp=-1)
{
int i,ot,k=OrdersTotal();
if(or_tp<0 || or_tp>1) or_tp=-1;
for(i=k-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber)
{
ot=OrderType();
if(or_tp==-1)
{
if(ot==0 || ot==1) return (true);
} else {
if(or_tp==ot) return (true);
}
}
}
}
return (false);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
void OnTick()
{
if(!IsTradeAllowed())
{
string _txt_new="You must allow trading!";
if(txt!=_txt_new) { txt=_txt_new; Print(txt); Comment(txt);}
return;
}
//---
double _ma = iMA (Symb, 0, MA_period, MA_shift, MA_method, MA_applied_price, 0);
double ma_buy1 = iMA (Symb, 0, MA_period, MA_shift, MA_method, MA_applied_price, 0)-(MA_level_1*point);
double ma_sell1 = iMA (Symb, 0, MA_period, MA_shift, MA_method, MA_applied_price, 0)+(MA_level_1*point);
double ma_buy2 = iMA (Symb, 0, MA_period, MA_shift, MA_method, MA_applied_price, 0)-(MA_level_2*point);
double ma_sell2 = iMA (Symb, 0, MA_period, MA_shift, MA_method, MA_applied_price, 0)+(MA_level_2*point);
double _rsi = iRSI (Symb, 0, RSI_period, RSI_applied_price, 0);
//---
//--- comment
string _dn_up="DOWN price"; if(Bid>_ma) _dn_up="UP price";
txt="\n"+NameEA+"\nMA = "+double_to_str(_ma,Digits)+" ---> "+_dn_up
+"\nRSI ("+(string)RSI_dn_level+"/"+(string)RSI_up_level+") = "+double_to_str(_rsi);
Comment(txt);
//---
//--- BUY
if(Ask<ma_buy2 && _rsi<RSI_dn_level && HaveOpenPos(0)==false)
{
BuyPos(Lot);
}
//--- SELL
if(Bid>ma_sell2 && _rsi>RSI_up_level && HaveOpenPos(1)==false)
{
SellPos(Lot);
}
//---
}
//+------------------------------------------------------------------+
//| BUY |
//+------------------------------------------------------------------+
void BuyPos(double _lot)
{
//---
int err;
for(int it=1; it<=NumberOfTry; it++)
{
ResetLastError();
RefreshRates();
if(!OrderSend(Symb,OP_BUY,_lot,NormalizeDouble(Ask,Digits),Slippage,Ask-StopLoss*point,Ask+Take_Profit*point,NULL,MagicNumber))
{
if(it>=NumberOfTry) { Print("Failed OP_BUY !"); break; }
err=GetLastError();
if(err==4 || err==6 || err==8 || err==128 || err==137 || err==141 || err==146) Sleep(1000*100);
else { Print("Failed OP_BUY !"); break; }
}
else break;
}
}
//+------------------------------------------------------------------+
//| SELL |
//+------------------------------------------------------------------+
void SellPos(double _lot)
{
//---
int err;
for(int it=1; it<=NumberOfTry; it++)
{
ResetLastError();
RefreshRates();
if(!OrderSend(Symb,OP_SELL,_lot,NormalizeDouble(Bid,Digits),Slippage,Bid+StopLoss*point,Bid+Take_Profit*point,NULL,MagicNumber))
{
if(it>=NumberOfTry) { Print("Failed OP_SELL !"); break; }
err=GetLastError();
if(err==4 || err==6 || err==8 || err==128 || err==137 || err==141 || err==146) Sleep(1000*100);
else { Print("Failed OP_SELL !"); break; }
}
else break;
}
}
The error is in the fonction open sell, the takeprofit is wrong,
But something is not working in your code, it did not inform about error
void SellPos(double _lot) { //--- int err; for(int it=1; it<=NumberOfTry; it++) { Print("OPENING SELL"); ResetLastError(); RefreshRates(); if(!OrderSend(Symbol(),OP_SELL,_lot,NormalizeDouble(Bid,Digits),Slippage, Bid+StopLoss*point,Bid+Take_Profit*point,NULL,MagicNumber)) { if(it>=NumberOfTry) { Print("Failed OP_SELL !"); break; } err=GetLastError(); if(err==4 || err==6 || err==8 || err==128 || err==137 || err==141 || err==146) Sleep(1000*100); else { Print("Failed OP_SELL ! Error : "+ ErrorDescription(err)); break; } } else break; } }
if(!OrderSend(Symbol(),OP_SELL,_lot,NormalizeDouble(Bid,Digits),Slippage, Bid+StopLoss*point,Bid+Take_Profit*point,NULL,MagicNumber))
Unless Take_Profit is a negative number, it should be
Bid-Take_Profit*point.
Yes gumrai, i showed the error and let him correct it.
OrderSend is not a boolean fonction, the returned code will alway be different of 0=false
if(!OrderSend(Symbol()
so it should alway enter in the parenthesis : it don't (?)
Better use the return (int) code of ticket, rather than a boolean
Yes gumrai, i showed the error and let him correct it.
OrderSend is not a boolean fonction, the returned code will alway be different of 0=false
so it should alway enter in the parenthesis : it don't (?)
Better use the return (int) code of ticket, rather than a boolean
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hi,
Can any expert help on above ea ? I can compile it with no error , but during backtest , it not sending order.