MT4 交易策略:魔术码 92133 滑点 4 的挂单与补仓策略
这是一个适用于 MetaTrader 4(MT4)平台的挂单与补仓交易策略。该策略使用魔术码'92133',滑点'4',并根据最新价格设置挂单、补仓以及止盈条件。
策略设定:
- 挂单条件: 当当前魔术码下持仓订单数 = 0 且挂单数 = 0 时,根据最新价格加'200'微点触发一次挂单做多,同时根据最新价格减'200'点触发一次挂单做空。挂单手数为初始手数,即'0.5'手。2. 持仓/挂单判断: 如果持仓数或挂单数 > 0,不触发挂单。3. 顺势补仓: 若持仓多单,每上涨'100'微点补仓一次,补仓手数为上一个多单手数的'2'倍,最大补仓次数'4'次;若持仓空单,每下跌'100'微点补仓一次,补仓手数为上一个空单手数的'2'倍,最大补仓次数'4'次。4. 多空共存: 多空单可以同时存在,空头信号不要平仓多单,多头信号不要平仓空单。5. 止盈清仓: 当当前魔术码下所有订单的总盈利达到'80'美金(止盈金额),则清仓,清仓以后删除所有挂单,并在'1'分钟以后重新开始判断当前魔术码下是否有持仓订单,同时判断当前魔术码下是否存在挂单,若没有持仓并且没有挂单,则根据最新价格加'200'微点触发一次挂单做多,同时根据最新价格减'200'点触发一次挂单做空。挂单手数为初始手数,即'0.5'手。
参数设置:
以上步骤中的魔术码、初始手数、止盈金额、补仓倍数、补仓次数、补仓间距, 使用 extern 来定义为可更改的参数。
代码实现:
您可以根据提供的策略设定,自行编写适用于 MetaTrader 4(MT4)平台的函数和变量。
**示例代码:**mq4// 定义参数extern int MagicNumber = 92133;extern double InitialLotSize = 0.5;extern double ProfitTarget = 80;extern int MaxRebuyCount = 4;extern int RebuyInterval = 100;extern int Slippage = 4;
// 持仓订单数int GetOpenOrderCount(int magicNumber) { int count = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber) { count++; } } return count;}
// 挂单数int GetPendingOrderCount(int magicNumber) { int count = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == magicNumber) { break; } if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber) { break; } count++; } return count;}
// 判断是否触发挂单条件bool ShouldPlacePendingOrders(int magicNumber) { double latestPrice = MarketInfo(Symbol(), MODE_BID); if (GetOpenOrderCount(magicNumber) == 0 && GetPendingOrderCount(magicNumber) == 0) { if (latestPrice + Slippage > NormalizeDouble(OrderClosePrice(), Digits) + 200 * Point) { OrderSend(Symbol(), OP_BUY, InitialLotSize, latestPrice + Slippage, 0, 0, 0, 'Buy Order', magicNumber, 0, clrBlue); } if (latestPrice - Slippage < NormalizeDouble(OrderClosePrice(), Digits) - 200 * Point) { OrderSend(Symbol(), OP_SELL, InitialLotSize, latestPrice - Slippage, 0, 0, 0, 'Sell Order', magicNumber, 0, clrRed); } return true; } return false;}
// 顺势补仓void RebuyOrders(int magicNumber) { double latestPrice = MarketInfo(Symbol(), MODE_BID); for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber) { if (OrderType() == OP_BUY) { int rebuyCount = MathMin(OrderTicket(), MaxRebuyCount); double lotSize = OrderLots(); for (int j = 0; j < rebuyCount; j++) { lotSize *= 2; OrderSend(Symbol(), OP_BUY, lotSize, latestPrice + Slippage, 0, 0, 0, 'Buy Order', magicNumber, 0, clrBlue); } } if (OrderType() == OP_SELL) { int rebuyCount = MathMin(OrderTicket(), MaxRebuyCount); double lotSize = OrderLots(); for (int j = 0; j < rebuyCount; j++) { lotSize *= 2; OrderSend(Symbol(), OP_SELL, lotSize, latestPrice - Slippage, 0, 0, 0, 'Sell Order', magicNumber, 0, clrRed); } } break; } }}
// 清仓void CloseAllOrders(int magicNumber) { for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == magicNumber) { OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clrNone); } } Sleep(60000); // 1分钟后重新开始判断 if (GetOpenOrderCount(magicNumber) == 0 && GetPendingOrderCount(magicNumber) == 0) { ShouldPlacePendingOrders(magicNumber); }}
// 在OnTick()函数中使用以上函数void OnTick() { int magicNumber = MagicNumber; if (AccountProfit() >= ProfitTarget) { CloseAllOrders(magicNumber); return; } if (ShouldPlacePendingOrders(magicNumber)) { return; } if (GetOpenOrderCount(magicNumber) > 0 || GetPendingOrderCount(magicNumber) > 0) { return; } RebuyOrders(magicNumber)
原文地址: https://www.cveoy.top/t/topic/dvjp 著作权归作者所有。请勿转载和采集!