extern int 均线参数一=34;
extern int 均线参数二=55;
extern int 均线参数三=89;
enum X1
{
比例下单=0,
固定下单=1,
};
extern X1 加仓方式=比例下单;
extern double 亏损比=0.1;
extern double 最大开仓量=1;
extern int 最大止损=80;
extern double 固定下单量=0.1;
extern double 赔率=4;
extern int 分型停顿参数=10;
extern int 保护性止损均线周期=89;
extern double 移动系数=1;
extern int 魔术号=123456;
extern int 滑点=35;
extern string 备注="分型停顿";
bool 数据显示开关=false;
double 多单=0.1;
double 空单=0.1;
string 名称=Symbol()+IntegerToString(魔术号);
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double 多单止损=Low[iLowest(Symbol(),0,MODE_LOW,分型停顿参数,1)];
double 多单止盈=Close[1]+赔率*(Close[1]-多单止损);
double 多单下单量=AccountBalance()*亏损比/(1000*(Close[1]-多单止损));
double 空单止损=High[iHighest(Symbol(),0,MODE_HIGH,分型停顿参数,1)];
double 空单止盈=Close[1]-赔率*(空单止损-Close[1]);
double 空单下单量=AccountBalance()*亏损比/(1000*(空单止损-Close[1]));
if(加仓方式==比例下单){多单=MathMin(MathMax(多单下单量,0.01),最大开仓量);空单=MathMin(MathMax(空单下单量,0.01),最大开仓量);}
if(加仓方式==固定下单){多单=固定下单量;空单=固定下单量;}
if(底分型停顿()==true && 多头持仓()==0 && 多头持仓()==0 && 多头排列( )==true )
{
int 开仓=OrderSend(Symbol(),OP_BUY,多单,Ask,滑点,多单止损,多单止盈,备注,魔术号,0,Red);
}
if(顶分型停顿()==true && 空头持仓()==0 && 空头持仓()==0 && 空头排列( )==true )
{
int ticket=OrderSend(Symbol(),OP_SELL,空单,Bid,滑点,空单止损,空单止盈,备注,魔术号,0,Green);
}
}
//+------------------------------------------------------------------+
//|当前持仓 |
//+------------------------------------------------------------------+
int 多头持仓()
{
int a=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==魔术号)
{
if(OrderType()==OP_BUY)
{
a=a+1;
}
}
}
}
return(a);
}
//+------------------------------------------------------------------+
int 空头持仓()
{
int a=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==魔术号)
{
if(OrderType()==OP_SELL)
{
a=a+1;
}
}
}
}
return(a);
}
//+------------------------------------------------------------------+
//分型停顿信号判断 |
//+------------------------------------------------------------------+
bool 顶分型停顿( )
{
bool 出现顶分型停顿=false;
int 顶分型顶点位置=iHighest(Symbol(),0,MODE_HIGH,分型停顿参数,1);
int 最近最低价位置=iLowest(Symbol(),0,MODE_LOW,顶分型顶点位置,2);
if(顶分型顶点位置>最近最低价位置&&Close[1]<Low[最近最低价位置])
{
出现顶分型停顿=true;
}
return(出现顶分型停顿);
}
bool 底分型停顿( )
{
bool 出现底分型停顿=false;
int 底分型顶点位置=iLowest(Symbol(),0,MODE_LOW,分型停顿参数,1);
int 最近最高价位置=iHighest(Symbol(),0,MODE_HIGH,底分型顶点位置,2);
if(底分型顶点位置>最近最高价位置&&Close[1]>High[最近最高价位置])
{
出现底分型停顿=true;
}
return(出现底分型停顿);
}
//+------------------------------------------------------------------+
//均线判断当前趋势 |
//+------------------------------------------------------------------+
//找出最近交叉点
int K线金叉标记()
{
int a=0;
for(int i=0;i<10000;i++)
{
if( iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i)>=iMA(Symbol(),0,均线参数三,0,MODE_EMA,PRICE_CLOSE,i))
{
a=i;
return(a);
}
}
return(a);
}
int K线死叉标记()
{
int a=0;
for(int i=0;i<10000;i++)
{
if( iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i)<iMA(Symbol(),0,均线参数三,0,MODE_EMA,PRICE_CLOSE,i))
{
a=i;
return(a);
}
}
return(a);
}
//多空趋势
bool 多头排列( )
{
bool 多头=false;
for(int i=0;i<K线金叉标记();i++)
if(iMA(Symbol(),0,均线参数一,0,MODE_EMA,PRICE_CLOSE,i)>iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i) &&
iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i)>iMA(Symbol(),0,均线参数三,0,MODE_EMA,PRICE_CLOSE,i))
{
多头=true;
}
else
{
多头=false;
break;
}
return(多头);
}
bool 空头排列( )
{
bool 空头=false;
for(int i=0;i<K线死叉标记();i++)
if(iMA(Symbol(),0,均线参数一,0,MODE_EMA,PRICE_CLOSE,i)<iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i) &&
iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i)<iMA(Symbol(),0,均线参数三,0,MODE_EMA,PRICE_CLOSE,i))
{
空头=true;
}
else
{
空头=false;
break;
}
return(空头);
}
- 一个简单的策略,不晓得哪里错了,回测不出东西
- EA不会在多对上运行,需要帮助
- 新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论
sheri_lanyue:
extern int 均线参数一=34;
extern int 均线参数二=55;
extern int 均线参数三=89;
enum X1
{
比例下单=0,
固定下单=1,
};
extern X1 加仓方式=比例下单;
extern double 亏损比=0.1;
extern double 最大开仓量=1;
extern int 最大止损=80;
extern double 固定下单量=0.1;
extern double 赔率=4;
extern int 分型停顿参数=10;
extern int 保护性止损均线周期=89;
extern double 移动系数=1;
extern int 魔术号=123456;
extern int 滑点=35;
extern string 备注="分型停顿";
bool 数据显示开关=false;
double 多单=0.1;
double 空单=0.1;
string 名称=Symbol()+IntegerToString(魔术号);
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double 多单止损=Low[iLowest(Symbol(),0,MODE_LOW,分型停顿参数,1)];
double 多单止盈=Close[1]+赔率*(Close[1]-多单止损);
double 多单下单量=AccountBalance()*亏损比/(1000*(Close[1]-多单止损));
double 空单止损=High[iHighest(Symbol(),0,MODE_HIGH,分型停顿参数,1)];
double 空单止盈=Close[1]-赔率*(空单止损-Close[1]);
double 空单下单量=AccountBalance()*亏损比/(1000*(空单止损-Close[1]));
if(加仓方式==比例下单){多单=MathMin(MathMax(多单下单量,0.01),最大开仓量);空单=MathMin(MathMax(空单下单量,0.01),最大开仓量);}
if(加仓方式==固定下单){多单=固定下单量;空单=固定下单量;}
if(底分型停顿()==true && 多头持仓()==0 && 多头持仓()==0 && 多头排列( )==true )
{
int 开仓=OrderSend(Symbol(),OP_BUY,多单,Ask,滑点,多单止损,多单止盈,备注,魔术号,0,Red);
}
if(顶分型停顿()==true && 空头持仓()==0 && 空头持仓()==0 && 空头排列( )==true )
{
int ticket=OrderSend(Symbol(),OP_SELL,空单,Bid,滑点,空单止损,空单止盈,备注,魔术号,0,Green);
}
}
//+------------------------------------------------------------------+
//|当前持仓 |
//+------------------------------------------------------------------+
int 多头持仓()
{
int a=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==魔术号)
{
if(OrderType()==OP_BUY)
{
a=a+1;
}
}
}
}
return(a);
}
//+------------------------------------------------------------------+
int 空头持仓()
{
int a=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==魔术号)
{
if(OrderType()==OP_SELL)
{
a=a+1;
}
}
}
}
return(a);
}
//+------------------------------------------------------------------+
//分型停顿信号判断 |
//+------------------------------------------------------------------+
bool 顶分型停顿( )
{
bool 出现顶分型停顿=false;
int 顶分型顶点位置=iHighest(Symbol(),0,MODE_HIGH,分型停顿参数,1);
int 最近最低价位置=iLowest(Symbol(),0,MODE_LOW,顶分型顶点位置,2);
if(顶分型顶点位置>最近最低价位置&&Close[1]<Low[最近最低价位置])
{
出现顶分型停顿=true;
}
return(出现顶分型停顿);
}
bool 底分型停顿( )
{
bool 出现底分型停顿=false;
int 底分型顶点位置=iLowest(Symbol(),0,MODE_LOW,分型停顿参数,1);
int 最近最高价位置=iHighest(Symbol(),0,MODE_HIGH,底分型顶点位置,2);
if(底分型顶点位置>最近最高价位置&&Close[1]>High[最近最高价位置])
{
出现底分型停顿=true;
}
return(出现底分型停顿);
}
//+------------------------------------------------------------------+
//均线判断当前趋势 |
//+------------------------------------------------------------------+
//找出最近交叉点
int K线金叉标记()
{
int a=0;
for(int i=0;i<10000;i++)
{
if( iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i)>=iMA(Symbol(),0,均线参数三,0,MODE_EMA,PRICE_CLOSE,i))
{
a=i;
return(a);
}
}
return(a);
}
int K线死叉标记()
{
int a=0;
for(int i=0;i<10000;i++)
{
if( iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i)<iMA(Symbol(),0,均线参数三,0,MODE_EMA,PRICE_CLOSE,i))
{
a=i;
return(a);
}
}
return(a);
}
//多空趋势
bool 多头排列( )
{
bool 多头=false;
for(int i=0;i<K线金叉标记();i++)
if(iMA(Symbol(),0,均线参数一,0,MODE_EMA,PRICE_CLOSE,i)>iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i) &&
iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i)>iMA(Symbol(),0,均线参数三,0,MODE_EMA,PRICE_CLOSE,i))
{
多头=true;
}
else
{
多头=false;
break;
}
return(多头);
}
bool 空头排列( )
{
bool 空头=false;
for(int i=0;i<K线死叉标记();i++)
if(iMA(Symbol(),0,均线参数一,0,MODE_EMA,PRICE_CLOSE,i)<iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i) &&
iMA(Symbol(),0,均线参数二,0,MODE_EMA,PRICE_CLOSE,i)<iMA(Symbol(),0,均线参数三,0,MODE_EMA,PRICE_CLOSE,i))
{
空头=true;
}
else
{
空头=false;
break;
}
return(空头);
}
lizhongwei123:
均线交叉逻辑不对