魔术码92133交易策略:自动挂单、补仓和止盈
魔术码92133交易策略:自动挂单、补仓和止盈
该策略使用魔术码92133,并包含以下功能:
- 自动挂单: 如果当前魔术码下没有持仓,则根据最新价格加100点挂单0.5手多单,同时根据最新价格减100点挂单0.5手空单。挂单的多单和空单只执行一次。如果挂单的多单成交,则删除挂单的空单;如果挂单的空单成交,则删除挂单的多单。第一单成交以后画蓝色实体标记线,只画第一单,平仓以后再继续。
- 趋势跟踪: 如果持仓多单,最新价在蓝色标记线以下100点,则做空0.5手;如果持仓空单,最新价在蓝色标记线以上100点,则做多0.5手。
- 补仓: 若持有多单,每上涨100点(间距为100点)补仓一次。补仓的手数为上一单多单手数的0.6倍。最多补仓5次。若持有空单,每下跌100点(间距为100点)补仓一次。补仓的手数为上一单空单手数的0.6倍。最多补仓5次。
- 止盈: 判断当前魔术码下的所有持仓订单,若总盈利达到40美金,触发全部平仓。
可更改参数
以下参数可以使用extern关键字来定义为可更改的参数:
- MagicNumber: 魔术码,默认值为92133。
- OrderVolume: 挂单手数,默认值为0.5。
- Gap: 间距,默认值为100。
- AddVolumeMultiplier: 补仓倍数,默认值为0.6。
- MaxAdditions: 补仓次数,默认值为5。
- ProfitTarget: 盈利目标(美金),默认值为40.0。
代码示例
以下是使用MQ4编写的根据您的要求进行的代码:
// 定义可更改参数
extern int MagicNumber = 92133; // 魔术码
extern double OrderVolume = 0.5; // 挂单手数
extern int Gap = 100; // 间距
extern double AddVolumeMultiplier = 0.6; // 补仓倍数
extern int MaxAdditions = 5; // 补仓次数
extern double ProfitTarget = 40.0; // 盈利目标(美金)
// 定义全局变量
bool firstTradeExecuted = false; // 是否已执行第一单交易
double markPrice = 0.0; // 蓝色标记线价格
void OnTick()
{
// 检查当前魔术码下是否持仓
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手
if (firstTradeExecuted && latestPrice < markPrice - Gap)
{
double sellVolume = OrderVolume;
if (OrderSend(Symbol(), OP_SELL, sellVolume, latestPrice, Slippage, 0, 0, 'Short Order', MagicNumber))
{
return;
}
}
// 如果第一单交易已执行并且最新价在蓝色标记线以上100点,做多0.5手
if (firstTradeExecuted && latestPrice > markPrice + 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 > markPrice + 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 < markPrice - 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分钟
}
}
// 检查给定魔术码下的持仓数量
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 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);
}
}
}
}
请将以上代码添加到您的MQ4文件中,并根据需要进行适当的调整和修改。
原文地址: https://www.cveoy.top/t/topic/b9GQ 著作权归作者所有。请勿转载和采集!