ArtificialIntelligence_Panda
//+------------------------------------------------------------------+//| ArtificialIntelligence_Panda.mq4 |
//| Copyright 2011-2023, Justin Tao |
//| https://www.mql5.com/zh/users/taofei7456 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, Justin Tao"
#property link "https://www.mql5.com/zh/users/taofei7456"
extern string 初始开仓量;
extern double Lots=0.01;
string TradeSignal="N/A";//交易信号,Buy,Sell,N/A
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
SendTradeSignal();
Trade();
//----
return(0);
}
//+------------------------------------------------------------------+
/*
函数:根据信号新开仓以及挂单处理
根据ATR参数计算止损点,针对持仓订单执行移动止损
平仓:止损自动平仓
*/
void Trade()
{
int mySPREAD=MarketInfo(Symbol(),MODE_SPREAD);//获取市场滑点
double CurrentSL,CurrentTP;
//根据ATR参数计算止损点,ATR(0)*1.5为止损
double StopLoss=1.5*iATR(NULL,0,14,0);
//新开仓
if (OrdersTotal()==0)
{
if (TradeSignal=="Sell")
{
CurrentSL=Bid+StopLoss;//当前价的止损价
CurrentTP=Bid-StopLoss;
OrderSend(Symbol(),OP_SELL,Lots,Bid,mySPREAD,CurrentSL,CurrentTP);
}
if (TradeSignal=="Buy")
{
CurrentSL=Ask-StopLoss;//当前价的止损价
CurrentTP=Ask+StopLoss;
OrderSend(Symbol(),OP_BUY,Lots,Ask,mySPREAD,CurrentSL,CurrentTP);
}
}
//补仓
if (OrdersTotal()>0)
{
if (OrderSelect(OrdersTotal()-1,SELECT_BY_POS)==false) return(0);//选择当前订单
//新增仓订单时间不足一个时间周期,不做任何操作返回
if (TimeCurrent() - OrderOpenTime() <=Period()*60) return (0);
//开始补仓
if (TradeSignal=="Sell")
{
CurrentSL=Bid+StopLoss;//当前价的止损价
CurrentTP=Bid-StopLoss;
OrderSend(Symbol(),OP_SELL,Lots,Bid,mySPREAD,CurrentSL,CurrentTP);
}
if (TradeSignal=="Buy")
{
CurrentSL=Ask-StopLoss;//当前价的止损价
CurrentTP=Ask+StopLoss;
OrderSend(Symbol(),OP_BUY,Lots,Ask,mySPREAD,CurrentSL,CurrentTP);
}
}
//移动止损止盈:遍历所有持仓单,修改止损止盈价位
if (OrdersTotal()>0)
{
int G_Count;
for(G_Count=OrdersTotal();G_Count>=0;G_Count--)
{
if(OrderSelect(G_Count,SELECT_BY_POS)==false) continue;
else
{
if (OrderProfit()>0 && OrderType()==0)
{
CurrentSL=Ask-StopLoss;//当前价的止损价
CurrentTP=Ask+StopLoss;
OrderModify(OrderTicket(),OrderOpenPrice(),CurrentSL,CurrentTP,0);
}
if (OrderProfit()>0 && OrderType()==1)
{
CurrentSL=Bid+StopLoss;//当前价的止损价
CurrentTP=Bid-StopLoss;
OrderModify(OrderTicket(),OrderOpenPrice(),CurrentSL,CurrentTP,0);
}
}
}
}
}
/*
函数:计算交易信号
1、两条均线:EMA5 EMA55
2、两条布林线: 标准差2和标准差1,ma为20
3、EMA55向上,当5日均线上穿20日均线(布林中轨),发出做多Buy信号
4、EMA55向下,当5日均线下穿20日均线,发出做空Sell信号
5、55均线无明确方向,发出N/A信号
6、布林线开口收缩小于10点,发出N/A信号
*/
string SendTradeSignal()
{
//获取指标度数
TradeSignal="N/A";
double myMA_5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);//MA5
double myBollong_Up=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,0);//布林20日上线
double myBollong_Main=iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0);//布林20日主线
double myBollong_Down=iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0);//布林20日下线
//判断MA55的方向,10个蜡烛连续依次大于(小于)为向上(向下),否则,不交易
string MA55_UpSignal,MA55_DownSignal;//MA55方向临时信号变量
string Bolling_Signal;//布林带临时信号变量
int i;//循环变量
for (i=0;i<10;i++)
{
double MA_55_now=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i);//MA55当前值
double MA_55_pre=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i+1);//MA55前值
if (MA_55_now>MA_55_pre) MA55_UpSignal="UP";//连续大于,给出向上信号
if (MA_55_now<=MA_55_pre)//出现小于等于,给出不交易信号,中断判断循环
{
MA55_UpSignal="N/A";
break;
}
}
for (i=0;i<10;i++)
{
MA_55_now=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i);//MA55当前值
MA_55_pre=iMA(NULL,0,55,0,MODE_EMA,PRICE_CLOSE,i+1);//MA55前值
if (MA_55_now<MA_55_pre) MA55_DownSignal="Down";//连续小于,给出向下信号
if (MA_55_now>=MA_55_pre)//出现大于等于,给出不交易信号,中断判断循环
{
MA55_DownSignal="N/A";
break;
}
}
//EMA55向上,当5日均线上穿20日均线(布林中轨),发出做多Buy信号
if (MA55_UpSignal=="UP" && (myMA_5>myBollong_Main)) TradeSignal="Buy";
//EMA55向下,当5日均线下穿20日均线,发出做空Sell信号
if (MA55_DownSignal=="Down" && (myMA_5<myBollong_Main)) TradeSignal="Sell";
//判断布林线不交易信号
if (MathAbs(myBollong_Up-myBollong_Down)<100*Point) TradeSignal="N/A";
//文字显示、图表标注交易信号
SetLable("信息栏","交易信号:"+TradeSignal,5,20,10,"Verdana",Olive);
DrawTradPoint(TradeSignal,Close);
return(TradeSignal);//函数返回交易信号
}
/*
函数:在屏幕上显示标签
LableName:标签名称;LableDoc:文本内容;LableX:标签X位置;LableY:标签Y位置;
DocSize:文本字号;DocStyle:文本字体;DocColor:文本颜色
*/
void SetLable(string LableName,string LableDoc,int LableX,int LableY,
int DocSize,string DocStyle,color DocColor)
{
ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
ObjectSetText(LableName,LableDoc,DocSize,DocStyle,DocColor);
ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
}
/*
函数:画出交易点,红箭头为卖出,绿箭头为买入,圆圈为突破点
*/
void DrawTradPoint(string mySignal,double myPrice)
{
if (mySignal=="Buy")
{
ObjectCreate("BuyPoint-"+Time,OBJ_ARROW,0,Time,myPrice);
ObjectSet("BuyPoint-"+Time,OBJPROP_COLOR,Green);
ObjectSet("BuyPoint-"+Time,OBJPROP_ARROWCODE,241);
}
if (mySignal=="Sell")
{
ObjectCreate("SellPoint-"+Time,OBJ_ARROW,0,Time,myPrice);
ObjectSet("SellPoint-"+Time,OBJPROP_COLOR,Red);
ObjectSet("SellPoint-"+Time,OBJPROP_ARROWCODE,242);
}
}
干货满满,一看就懂{:1_210:} liuqianshuai 发表于 2023-5-28 11:09
干货满满,一看就懂
多多交流,微信taofei7456 不开单 外汇韭菜78 发表于 2023-5-31 09:37
不开单
可以开单,是不是MT4版本问题?或者重新生成EX4文件 回测不出楼主的澳美效果图 怎么生成EX4文件? {:1_189:}
页:
[1]