MQL4 突破交易策略:基于前K线高低点构建
MQL4 突破交易策略:基于前K线高低点构建
本文提供一个使用MQL4语言编写的突破交易策略,该策略根据当前价格突破前K线高低点进行交易信号判断,并设置追踪止盈和部分平仓机制。
策略逻辑:
- 空单入场: 当价格跌破前K根柱线的最低价时,在当前柱线开盘价做空一单。之后,如果价格每上涨超过前一个订单价格50个点,则加仓做空一单。* 空单出场: 当价格触及前K根柱线的最低价时,平仓20%的空头仓位。在当前柱线收盘时,平掉所有剩余空头仓位。* 多单入场: 当价格突破前K根柱线的最高价时,在当前柱线开盘价做多一单。之后,如果价格每下跌超过前一个订单价格50个点,则加仓做多一单。* 多单出场: 当价格触及前K根柱线的最高价时,平仓20%的多头仓位。在当前柱线收盘时,平掉所有剩余多头仓位。
**MQL4 代码:**mql4int k = 5; // 前K个周期double openOrdersPrice = 0; // 记录开仓价格bool isShortEntry = false; // 是否进行空单入场bool isLongEntry = false; // 是否进行多单入场
// 函数:空单入场逻辑void ShortEntryLogic(){ double highestPrice = High[Highest(NULL, 0, MODE_HIGH, k, 0)]; // 获取前k个周期的最高价
if (Low[0] < highestPrice) { // 当前k线开盘时做空一单 OrderSend(Symbol(), OP_SELL, Lots, Ask, Slippage, 0, 0, '', MagicNumber, 0, Red);
openOrdersPrice = Bid; // 记录开仓价格 isShortEntry = true; // 设置空单入场标志为true } else if (Bid > openOrdersPrice + 50) { // 价格每大于前一个订单价50个点再做空一单 OrderSend(Symbol(), OP_SELL, Lots, Ask, Slippage, 0, 0, '', MagicNumber, 0, Red);
openOrdersPrice = Bid; // 记录开仓价格 }}
// 函数:空单出场逻辑void ShortExitLogic(){ double lowestPrice = Low[Lowest(NULL, 0, MODE_LOW, k, 0)]; // 获取前k个周期的最低价
if (Bid <= lowestPrice) { // 价格触及前k最低价平仓20% int totalOrders = OrdersTotal(); for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { double closePrice = Bid; double closeLots = OrderLots() * 0.2; // 平仓20%的手数
OrderClose(OrderTicket(), closeLots, closePrice, Slippage, Red); } } } }}
// 函数:多单入场逻辑void LongEntryLogic(){ double lowestPrice = Low[Lowest(NULL, 0, MODE_LOW, k, 0)]; // 获取前k个周期的最低价
if (High[0] > lowestPrice) { // 当前k线开盘时做多一单 OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, 0, 0, '', MagicNumber, 0, Blue);
openOrdersPrice = Ask; // 记录开仓价格 isLongEntry = true; // 设置多单入场标志为true } else if (Ask < openOrdersPrice - 50) { // 价格每小于前一个订单价50个点再做多一单 OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, 0, 0, '', MagicNumber, 0, Blue);
openOrdersPrice = Ask; // 记录开仓价格 }}
// 函数:多单出场逻辑void LongExitLogic(){ double highestPrice = High[Highest(NULL, 0, MODE_HIGH, k, 0)]; // 获取前k个周期的最高价
if (Ask >= highestPrice) { // 价格触及前k最高价平仓20% int totalOrders = OrdersTotal(); for (int i = totalOrders - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { double closePrice = Ask; double closeLots = OrderLots() * 0.2; // 平仓20%的手数
OrderClose(OrderTicket(), closeLots, closePrice, Slippage, Blue); } } } }}
// OnTick事件处理函数void OnTick(){ if (isShortEntry) { ShortExitLogic(); } else if (isLongEntry) { LongExitLogic(); } else { ShortEntryLogic(); LongEntryLogic(); }}
代码说明:
k:定义前K个周期的数量。*openOrdersPrice:用于记录每次开仓的价格,方便计算加仓点位。*isShortEntry和isLongEntry:用于标记当前是否已经入场做空或做多,避免重复开仓。*ShortEntryLogic和LongEntryLogic:分别实现空单和多单的入场逻辑。*ShortExitLogic和LongExitLogic:分别实现空单和多单的出场逻辑。*OnTick函数:在每个价格变动时被调用,用于执行交易策略。
注意:
- 以上代码仅供参考,实际使用时需要根据自己的需求进行调整。* 交易外汇和差价合约等杠杆化产品具有高风险,并不适合所有投资者。在进行任何交易之前,请确保您了解风险并寻求独立的财务建议。
原文地址: https://www.cveoy.top/t/topic/ojI 著作权归作者所有。请勿转载和采集!