MQL4 代码示例:基于魔术码的自动交易策略
MQL4 代码示例:基于魔术码的自动交易策略
本篇博客文章提供了一个完整的 MQL4 代码示例,该示例展示了如何使用魔术码来管理您的交易策略。该策略包括自动开仓、加仓和平仓功能。
代码功能
- 使用魔术码区分不同的交易策略。* 当没有持仓时,自动以当前价格上下一定点数挂单开仓。* 当价格突破第一个持仓订单的价格一定点数时,自动加仓。* 当总盈利达到预设目标时,自动平仓所有订单。
代码示例cpp// 检查给定魔术码下的持仓数量int CheckPositions(int magicNumber){ int totalPositions = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { if (OrderType() == OP_BUY || OrderType() == OP_SELL) totalPositions += OrderLots(); } } return totalPositions;}
// 检查给定魔术码下的特定订单类型的持仓数量int CheckPositionsType(int magicNumber, int orderType){ int totalPositions = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == orderType) { totalPositions += OrderLots(); } } return totalPositions;}
// 获取给定魔术码下的第一个特定订单类型的持仓价格double GetFirstPositionPrice(int magicNumber, int orderType){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == orderType) { return OrderOpenPrice(); } } return 0.0;}
// 获取给定魔术码下的最后一个特定订单类型的持仓手数double GetLastPositionVolume(int magicNumber, int orderType){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == orderType) { return OrderLots(); } } return 0.0;}
// 计算给定魔术码下的总盈利double GetTotalProfit(int magicNumber){ double totalProfit = 0.0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { totalProfit += OrderProfit(); } } return totalProfit;}
// 删除给定魔术码下的所有指定订单类型的挂单void DeletePendingOrders(int magicNumber, int orderType){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol() && OrderType() == orderType) { OrderDelete(OrderTicket()); } }}
// 平掉给定魔术码下的所有持仓订单void CloseAllPositions(int magicNumber){ for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { if (OrderType() == OP_BUY || OrderType() == OP_SELL) { OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, clrNone); } } }}
// 在OnTick()函数中使用以上函数
void OnTick(){ // 检查当前魔术码下的持仓是否为0 if (CheckPositions(MagicNumber) == 0) { double currentPrice = MarketInfo(Symbol(), MODE_BID); // 获取当前价格
// 以当前价格加100点挂单0.5手多单 double buyPrice = currentPrice + Gap; double buyVolume = OrderVolume; if (OrderSend(Symbol(), OP_BUY, buyVolume, buyPrice, Slippage, 0, 0, 'Buy Order', MagicNumber)) { // 以当前价格减100点挂单0.5手空单 double sellPrice = currentPrice - Gap; double sellVolume = OrderVolume; if (OrderSend(Symbol(), OP_SELL, sellVolume, sellPrice, Slippage, 0, 0, 'Sell Order', MagicNumber)) { // 删除挂单的多单和空单 DeletePendingOrders(MagicNumber, OP_BUY); DeletePendingOrders(MagicNumber, OP_SELL); } } }
// 获取最新价 double latestPrice = MarketInfo(Symbol(), MODE_BID);
// 如果最新价低于第一个多单持仓价100点,开始做空0.5手 double firstBuyPrice = GetFirstPositionPrice(MagicNumber, OP_BUY); if (latestPrice < firstBuyPrice - Gap) { double sellVolume = OrderVolume; if (OrderSend(Symbol(), OP_SELL, sellVolume, latestPrice, Slippage, 0, 0, 'Short Order', MagicNumber)) { return; } }
// 如果最新价高于第一个空单持仓价100点,开始做多0.5手 double firstSellPrice = GetFirstPositionPrice(MagicNumber, OP_SELL); if (latestPrice > firstSellPrice + Gap) { double buyVolume = OrderVolume; if (OrderSend(Symbol(), OP_BUY, buyVolume, latestPrice, Slippage, 0, 0, 'Long Order', MagicNumber)) { return; } }
// 检查当前魔术码是否持仓多单 if (CheckPositionsType(MagicNumber, OP_BUY)) { double lastBuyVolume = GetLastPositionVolume(MagicNumber, OP_BUY); double currentProfit = GetTotalProfit(MagicNumber);
// 每上涨100点补仓一次,最多补仓5次 for (int i = 0; i < MaxAdditions; i++) { if (latestPrice > firstBuyPrice + Gap * (i + 1) && currentProfit < ProfitTarget) { double buyVolume = lastBuyVolume * AddVolumeMultiplier; if (OrderSend(Symbol(), OP_BUY, buyVolume, latestPrice, Slippage, 0, 0, 'Additional Buy Order', MagicNumber)) { return; } } } }
// 检查当前魔术码是否持仓空单 if (CheckPositionsType(MagicNumber, OP_SELL)) { double lastSellVolume = GetLastPositionVolume(MagicNumber, OP_SELL); double currentProfit = GetTotalProfit(MagicNumber);
// 每下跌100点补仓一次,最多补仓5次 for (int i = 0; i < MaxAdditions; i++) { if (latestPrice < firstSellPrice - Gap * (i + 1) && currentProfit < ProfitTarget) { double sellVolume = lastSellVolume * AddVolumeMultiplier; if (OrderSend(Symbol(), OP_SELL, sellVolume, latestPrice, Slippage, 0, 0, 'Additional Sell Order', MagicNumber)) { return; } } } }
// 判断当前魔术码下的所有持仓订单,若总盈利达到40美金,触发全部平仓 double totalProfit = GetTotalProfit(MagicNumber); if (totalProfit >= ProfitTarget) { CloseAllPositions(MagicNumber); Sleep(60000); // 平仓后等待1分钟 }}
代码说明
MagicNumber,Gap,OrderVolume,MaxAdditions,AddVolumeMultiplier,ProfitTarget,Slippage这些变量需要在代码中预先定义。* 代码中的注释解释了每一部分的功能。
注意事项
- 这只是一个简单的交易策略示例,实际应用中需要根据市场情况进行调整。* 在使用该代码之前,请确保您了解其工作原理并进行充分的测试。
希望这篇博客文章对您有所帮助!
原文地址: https://www.cveoy.top/t/topic/b8rA 著作权归作者所有。请勿转载和采集!