MT4自动交易策略:基于魔术码的多空双向网格交易系统
MT4自动交易策略:基于魔术码的多空双向网格交易系统
本策略是一个基于魔术码的多空双向网格交易系统,适用于MetaTrader 4(MT4)平台。
策略逻辑
1. 初始化
- 定义可更改参数:
magicNumber:魔术码,用于区分不同策略的订单initialLots:初始手数interval:网格间距replenishmentMultiplier:补仓倍数maxReplenishmentCount:最大补仓次数takeProfitAmount:止盈金额
2. 入场逻辑
- 无持仓时:
- 以最新价加
interval点挂单一次多单,手数为initialLots。 - 以最新价减
interval点挂单一次空单,手数为initialLots。
- 以最新价加
- 多单成交:
- 删除挂单的空单。
- 在持仓价的基础上,每间隔
interval点,开仓一次多单,开仓手数为上一个多单手数的replenishmentMultiplier倍,最多补仓maxReplenishmentCount次。
- 空单成交:
- 删除挂单的多单。
- 在持仓价的基础上,每间隔
interval点,开仓一次空单,开仓手数为上一个空单手数的replenishmentMultiplier倍,最多补仓maxReplenishmentCount次。
3. 加仓逻辑
- 持有多单无空单,且最新价小于第一个多单持仓价
interval点时,以initialLots手数做空。 - 持有空单无多单,且最新价大于第一个空单持仓价
interval点时,以initialLots手数做多。
4. 平仓逻辑
- 当所有订单总盈利达到
takeProfitAmount时,平掉所有订单。
代码实现
extern int magicNumber = 92133;
extern double initialLots = 0.5;
extern int interval = 100;
extern double replenishmentMultiplier = 0.6;
extern int maxReplenishmentCount = 5;
extern double takeProfitAmount = 80;
int totalOrders = 0;
int buyOrders = 0;
int sellOrders = 0;
double lastBuyOrderPrice = 0;
double lastSellOrderPrice = 0;
void OpenOrder(double lots, int type) {
double price = Ask;
if (type == OP_BUY) {
lastBuyOrderPrice = price;
buyOrders++;
} else if (type == OP_SELL) {
lastSellOrderPrice = price;
sellOrders++;
}
totalOrders++;
OrderSend(Symbol(), type, lots, price, 3, 0, 0, 'MagicNumber', magicNumber, 0, Green);
}
void CloseOrder(int ticket) {
OrderClose(ticket, OrderLots(), OrderClosePrice(), 3, Red);
totalOrders--;
if (OrderType() == OP_BUY)
buyOrders--;
else if (OrderType() == OP_SELL)
sellOrders--;
}
void ReplenishOrder(int type) {
double lots = OrderLots() * replenishmentMultiplier;
if (type == OP_BUY && buyOrders < maxReplenishmentCount)
OpenOrder(lots, OP_BUY);
else if (type == OP_SELL && sellOrders < maxReplenishmentCount)
OpenOrder(lots, OP_SELL);
}
void OnTick() {
double price = Ask;
int orders = OrdersTotal();
if (buyOrders > 0 && sellOrders == 0 && price < lastBuyOrderPrice - interval) {
CloseAllOrders();
OpenOrder(initialLots, OP_SELL);
}
if (buyOrders > 0 && sellOrders == 0 && price > lastSellOrderPrice + interval) {
CloseAllOrders();
OpenOrder(initialLots, OP_BUY);
}
double totalProfit = 0;
for (int i = 0; i < orders; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber() == magicNumber)
totalProfit += OrderProfit();
}
}
if (totalProfit >= takeProfitAmount)
CloseAllOrders();
}
void CloseAllOrders() {
int orders = OrdersTotal();
for (int i = orders - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber() == magicNumber)
CloseOrder(OrderTicket());
}
}
}
void OnInit() {
totalOrders = 0;
buyOrders = 0;
sellOrders = 0;
lastBuyOrderPrice = 0;
lastSellOrderPrice = 0;
}
void start() {
OnTick();
}
免责声明
本策略仅供学习和参考,不构成任何投资建议。在实际交易中,您需要根据自己的风险承受能力和市场情况进行调整和优化。使用本策略造成的任何损失,作者概不负责。
原文地址: https://www.cveoy.top/t/topic/cr7q 著作权归作者所有。请勿转载和采集!