//+——————————————————————+
//| DayTrading.mq4 |
//| Copyright 2021, Christian Myven Bruhin |
//| Telegram: @Someone / t.me/investment_scene |
//| https://github.com/n0d4wn/MQLEA_YetAnotherDaytrader |
//+——————————————————————+
#property strict
#include <stdlib.mqh>
//———————– EA PARAMETER
extern string
Expert_Name = “———- Price Cross MA v0.3”;
extern double
StopLoss = 80,
TakeProfit = 105,
TrailingStop = 20;
extern string
MA_Setting = “———- Moving Average Setting”;
extern int
MAPeriod = 240,
MAMethod = 2, //0:SMA 1:EMA 2:SMMA 3:LWMA
MAPrice = 1; //0:CLOSE 1:OPEN
extern string
Order_Setting = “———- Order Setting”;
extern int
NumberOfTries = 5,
Slippage = 5;
extern bool
StopAndReverse = true; // if signal change, exit and reverse order
extern string
Time_Parameters = “———- EA Active Time”;
extern bool
UseHourTrade = false;
extern int
StartHour = 10,
EndHour = 11;
extern string
MM_Parameters = “———- MoneyManagement by L.Williams”;
extern double
Lots = 1;
extern bool
MM = true, //Use Money Management or not
AccountIsMicro = false; //Use Micro-Account or not
extern int
Risk = 20; //20%
extern bool
Show_Settings = true;
//———————– GLOBAL VARIABLE
static int
TimeFrame = 0;
string
TicketComment = “PriceCrossMA v0.3″;
int
MagicNumber = 20060410;
//+——————————————————————+
//| Expert initialization function |
//+——————————————————————+
int OnInit()
{
init_ea();
return(INIT_SUCCEEDED);
}
//———————– END PROGRAM
//—
//+——————————————————————+
//| Expert deinitialization function |
//+——————————————————————+
int OnDeinit(const int reason)
{
//—
//———————– PREVENT RE-COUNTING WHILE USER CHANGING TIME FRAME
//———————– SOURCE : CODERSGURU
TimeFrame=Period();
return(0);
}
//+——————————————————————+
//| Expert tick function |
//+——————————————————————+
void OnTick()
{
//—
}
//+——————————————————————+
// Function
//+——————————————————————+
//| FUNCTION DEFINITIONS
//+——————————————————————+
//———————– MONEY MANAGEMENT FUNCTION
//———————– SOURCE : CODERSGURU
double subLotSize()
{
double lotMM = MathCeil(AccountFreeMargin() * Risk / 1000) / 100;
if(AccountIsMicro==false) //normal account
{
if(lotMM < 0.1)
lotMM = Lots;
if((lotMM > 0.5) && (lotMM < 1))
lotMM=0.5;
if(lotMM > 1.0)
lotMM = MathCeil(lotMM);
if(lotMM > 100)
lotMM = 100;
}
else //micro account
{
if(lotMM < 0.01)
lotMM = Lots;
if(lotMM > 1.0)
lotMM = MathCeil(lotMM);
if(lotMM > 100)
lotMM = 100;
}
return (lotMM);
}
//———————– NUMBER OF ORDER BASE ON SYMBOL AND MAGICNUMBER FUNCTION
int subTotalTrade()
{
int
cnt,
total;
for(cnt=0; cnt<OrdersTotal(); cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
total++;
}
}
}
return(total);
}
//———————– OPEN ORDER FUNCTION
//———————– SOURCE : CODERSGURU
int subOpenOrder(int type)
{
int
ticket = 0,
err = 0,
c = 0;
double
aStopLoss = 0,
aTakeProfit = 0,
bStopLoss = 0,
bTakeProfit = 0;
if(StopLoss!=0)
{
double a_StopLoss = Ask-StopLoss*Point;
aStopLoss = NormalizeDouble(a_StopLoss,5);
bStopLoss = Bid+StopLoss*Point;
}
if(TakeProfit!=0)
{
aTakeProfit = Ask+TakeProfit*Point;
bTakeProfit = Bid-TakeProfit*Point;
}
if(type==OP_BUY)
{
for(c=0; c<NumberOfTries; c++)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,aStopLoss,0,TicketComment,MagicNumber,0,Green);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 ||err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
}
if(type==OP_SELL)
{
for(c=0; c<NumberOfTries; c++)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,bStopLoss,0,TicketComment,MagicNumber,0,Red);
err=GetLastError();
if(err==0)
{
break;
}
else
{
if(err==4 || err==137 ||err==146 || err==136) //Busy errors
{
Sleep(5000);
continue;
}
else //normal error
{
break;
}
}
}
}
return(ticket);
}
//———————– CHECK ERROR CODE FUNCTION
//———————– SOURCE : CODERSGURU
void subCheckError(int ticket, string Type)
{
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print(Type + ” order opened : “,OrderOpenPrice());
}
else
Print(“Error opening ” + Type + ” order : “, ErrorDescription(GetLastError()));
}
//+——————————————————————+
//| |
//+——————————————————————+
int init_ea()
{
//— Variable Namespace
double
OpenPricePrevious,
ClosePricePrevious,
OpenPriceCurrent,
MAValuePrevious,
MAValueCurrent;
int
cnt,
e,
ticket,
total;
//———————– TIME FILTER
if(UseHourTrade)
{
if(!(Hour()>=StartHour && Hour()<=EndHour))
{
Comment(“Non-Trading Hours!”);
return(0);
}
}
//———————– CHECK CHART NEED MORE THAN 100 BARS
if(Bars<100)
{
Print(“bars less than 100″);
return(0);
}
//———————– ADJUST LOTS IF USING MONEY MANAGEMENT
if(MM==true)
Lots = subLotSize();
//———————– ENTRY
//———————– TOTAL ORDER BASE ON MAGICNUMBER AND SYMBOL
total = subTotalTrade();
//———————– SET VALUE FOR VARIABLE
OpenPricePrevious = iOpen(NULL,TimeFrame,120);
ClosePricePrevious = iClose(NULL,TimeFrame,120);
OpenPriceCurrent = iOpen(NULL,TimeFrame,0);
MAValuePrevious = iMA(NULL,TimeFrame,MAPeriod,0,MAMethod,MAPrice,120);
MAValueCurrent = iMA(NULL,TimeFrame,MAPeriod,0,MAMethod,MAPrice,0);
//———————– IF NO TRADE
if(total < 1)
{
//———————– BUY CONDITION
if(OpenPricePrevious<MAValuePrevious &&
OpenPriceCurrent <= MAValueCurrent)
{
ticket = subOpenOrder(OP_BUY); // open BUY order
subCheckError(ticket,”BUY”);
return(0);
}
//———————– SELL CONDITION
if(OpenPricePrevious >MAValuePrevious &&
OpenPriceCurrent <= MAValueCurrent)
{
ticket = subOpenOrder(OP_SELL); // open SELL order
subCheckError(ticket,”SELL”);
return(0);
}
return(0);
}
//———————– CHECK OPEN ORDER
//———————– FOR SIGNAL CHANGE – STOP AND REVERSE
//———————– AND TRAILING STOP
total = OrdersTotal();
if(TrailingStop>0 ||
StopAndReverse)
{
for(cnt=0; cnt<total; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol() &&
OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY) // buy position is opened
{
if(StopAndReverse) // signal change, close order and open new one
{
if(OpenPricePrevious>MAValuePrevious &&
OpenPriceCurrent <MAValueCurrent)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet); // close buy order
ticket = subOpenOrder(OP_SELL); // open sell order
subCheckError(ticket,”SELL”);
return(0);
}
}
if(TrailingStop>0) // trailing stop
{
if(Bid-OrderOpenPrice()>Point*TrailingStop &&
OrderStopLoss()<Bid-Point*TrailingStop)
{
e = OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
if(OrderType()==OP_SELL) // sell position is opened
{
if(StopAndReverse) // signal change, close order and open new one
{
if(OpenPricePrevious<MAValuePrevious &&
OpenPriceCurrent >MAValueCurrent)
{
e = OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Violet); // close sell order
ticket = subOpenOrder(OP_BUY); // open buy order
subCheckError(ticket,”BUY”);
return(0);
}
}
if(TrailingStop>0) // trailing stop
{
if(OrderOpenPrice()-Ask>Point*TrailingStop)
{
if(OrderStopLoss()>Ask+Point*TrailingStop || OrderStopLoss()==0)
{
e = OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
}
return(0);
}
//———————– END FUNCTION
相关资源
暂无评论...