EA策略:MACD金叉/死叉做单,自动补仓锁仓止盈
本EA策略基于MACD指标,实现自动交易,具体规则如下:
多单操作:
- 检查当前魔术码下'多单持仓' 是否为0,如果是,则MACD金叉的时候做多,初始手数为'初始多手数'。
- 每上涨'多补仓间距'微点,以第一个多单持仓订单的'多补仓倍数'进行补仓,补仓次数为'多补仓次数'。
- 多单持仓时,检查当前魔术码下的'空单持仓' 是否为0,如果是,并且当前最新价格低于第一个多单订单'多补仓间距'微点间距,则以'初始多手数'进行锁仓。
- 锁仓后,以第一个锁仓空单为基础,每下跌'多补仓间距'微点间距,以持仓第一个空单订单手数的'多补仓倍数'进行补仓做空,补仓次数为'多补仓次数'。
- 当多空总盈利达到'多空总盈利美元'时,全部平仓。
空单操作:
- 检查当前魔术码下的'空单持仓' 是否为0,如果是,则MACD死叉的时候做空,初始手数为'初始空手数'。
- 每下跌'空补仓间距'微点,以第一个空单持仓订单的'空补仓倍数'进行补仓,补仓次数为'空补仓次数'。
- 空单持仓时,检查当前魔术码下的'多单持仓' 是否为0,如果是,并且当前最新价格高于第一个空单订单'空补仓间距'微点间距,则以'初始空手数'进行锁仓。
- 锁仓后,以第一个锁仓多单为基础,每上涨'空补仓间距'微点间距,以持仓第一个多单订单手数的'空补仓倍数'进行补仓做多,补仓次数为'空补仓次数'。
- 当多空总盈利达到'多空总盈利美元'时,全部平仓。
EA属性:
- 魔术码:自定义
- 初始手数:自定义
- 补仓倍数:自定义
- 补仓次数:自定义
- 多空总盈利(美元):自定义
- 补仓间距:自定义
代码示例:
// 在原有代码的基础上添加以下内容
extern int 多魔术码 = 92133;
extern double 初始多手数 = 0.5;
extern double 多补仓倍数 = 0.6;
extern int 多补仓次数 = 5;
extern double 多空总盈利美元 = 40;
extern double 多补仓间距 = 0.001;
extern int 空魔术码 = 92133;
extern double 初始空手数 = 0.5;
extern double 空补仓倍数 = 0.6;
extern int 空补仓次数 = 5;
extern double 多空总盈利美元 = 40;
extern double 空补仓间距 = 0.001;
// 在OnTick函数中进行修改
void OnTick()
{
// 检查多单持仓是否为0
if (danshu(多魔术码, OP_BUY) == 0)
{
// MACD金叉且价格上涨
if (buy)
{
double currentProfit = (Ask - firstBuyOrderPrice) * 100000; // 换算为点数
double orderLots = OrderLots(多魔术码, OP_BUY); // 第一个多单的手数
if (currentProfit >= 100 && orderLots > 0)
{
double newLots = orderLots * 多补仓倍数; // 加仓手数为上一个多单手数的倍数
int res5 = OrderSend(Symbol(), OP_BUY, newLots, Ask, 30, stp_b, stk_b, "1", 多魔术码, 0, Red);
if (res5 > 0)
{
// 创建箭头对象等操作
// ...
}
if (res5 <= 0)
{
Sleep(time);
}
}
}
// 第一个多单持仓订单的盈利达到设定的总盈利美元
else if (duoyingkui(多魔术码) >= 多空总盈利美元)
{
close_allx(多魔术码); // 平仓所有多单订单
}
}
// 检查空单持仓是否为0
if (danshu(空魔术码, OP_SELL) == 0)
{
// MACD死叉且价格下跌
if (sell)
{
double currentProfit = (firstSellOrderPrice - Bid) * 100000; // 换算为点数
double orderLots = OrderLots(空魔术码, OP_SELL); // 第一个空单的手数
if (currentProfit >= 100 && orderLots > 0)
{
double newLots = orderLots * 空补仓倍数; // 加仓手数为上一个空单手数的倍数
int res5 = OrderSend(Symbol(), OP_SELL, newLots, Bid, 30, stp_s, stk_s, "1", 空魔术码, 0, Lime);
if (res5 > 0)
{
// 创建箭头对象等操作
// ...
}
if (res5 <= 0)
{
Sleep(time);
}
}
}
// 第一个空单持仓订单的盈利达到设定的总盈利美元
else if (duoyingkui(空魔术码) >= 多空总盈利美元)
{
close_allx(空魔术码); // 平仓所有空单订单
}
}
// 其他代码...
}
// 检查特定魔术码下的订单数量
int danshu(int magic, int type)
{
int count = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
break;
if (OrderType() == type && OrderMagicNumber() == magic)
{
count++;
}
}
return count;
}
// 获取特定魔术码下的总盈亏
double duoyingkui(int magic)
{
double totalProfit = 0.0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false)
break;
if (OrderMagicNumber() == magic)
{
totalProfit += OrderProfit() + OrderSwap() + OrderCommission();
}
}
return totalProfit;
}
请注意,以上代码仅供参考,并可能需要根据实际需求进行修改和完善。确保在使用之前进行充分测试。
原文地址: https://www.cveoy.top/t/topic/b5zJ 著作权归作者所有。请勿转载和采集!