MT4 代码:根据最新价格触发挂单,自动交易策略
MT4 代码:根据最新价格触发挂单,自动交易策略
以下代码实现了根据最新价格触发挂单,自动做多做空,并设置止盈和止损。代码包括自动清仓,刷新状态等功能,有效提高交易效率。
extern int magicNumber = 92133;
extern double initialLotSize = 0.5;
extern double profitTarget = 80.0;
extern int maxReentries = 4;
extern int pipsThreshold = 100;
bool hasOpenPositions = false;
bool hasPendingOrders = false;
void OnTick()
{
// 获取当前魔术码下的持仓订单和挂单
int ordersCount = OrdersTotal();
int historyCount = OrdersHistoryTotal();
RefreshStatus();
// 当前没有持仓且没有挂单时,触发挂单
if (!hasOpenPositions && !hasPendingOrders)
{
double currentBid = MarketInfo(Symbol(), MODE_BID);
double currentAsk = MarketInfo(Symbol(), MODE_ASK);
// 触发挂单做多
double buyStopPrice = currentAsk + pipsToPoints(200);
int ticket = OrderSend(Symbol(), OP_BUYSTOP, initialLotSize, buyStopPrice, 0, 0, 0, 'Buy Stop Order', magicNumber, 0, Blue);
// 触发挂单做空
double sellStopPrice = currentBid - pipsToPoints(200);
ticket = OrderSend(Symbol(), OP_SELLSTOP, initialLotSize, sellStopPrice, 0, 0, 0, 'Sell Stop Order', magicNumber, 0, Red);
}
// 获取当前魔术码下所有订单的总盈利
double totalProfit = 0.0;
for (int i = 0; i < ordersCount; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == magicNumber)
{
totalProfit += OrderProfit();
}
}
}
// 当总盈利达到止盈金额时进行清仓
if (totalProfit >= profitTarget)
{
for (int i = ordersCount - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == magicNumber)
{
bool closeSuccess = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 4, Red);
if (closeSuccess)
{
Print('Order closed successfully.');
}
else
{
int error = GetLastError();
Print('Failed to close order. Error code: ', error);
}
}
}
}
for (int i = historyCount - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderMagicNumber() == magicNumber)
{
bool deleteSuccess = OrderDelete(OrderTicket());
if (deleteSuccess)
{
Print('Order deleted successfully.');
}
else
{
int error = GetLastError();
Print('Failed to delete order. Error code: ', error);
}
}
}
}
Sleep(60000); // 1分钟后重新开始判断是否有持仓订单和挂单
RefreshStatus();
// 触发新的挂单逻辑,与上面类似
}
// 其他逻辑...
}
double pipsToPoints(int pips)
{
return pips * Point;
}
void RefreshStatus()
{
hasOpenPositions = false;
hasPendingOrders = false;
int ordersCount = OrdersTotal();
int historyCount = OrdersHistoryTotal();
for (int i = 0; i < ordersCount; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == magicNumber && OrderType() <= OP_SELL)
{
hasOpenPositions = true;
break;
}
}
}
for (int i = 0; i < historyCount; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderMagicNumber() == magicNumber && OrderType() <= OP_SELLSTOP)
{
hasPendingOrders = true;
break;
}
}
}
}
这次的代码在OnTick函数之外添加了一个新的函数RefreshStatus,该函数用于刷新持仓和挂单的状态。在OnTick函数的开头和清仓后都会调用RefreshStatus函数来更新持仓和挂单的状态,以确保判断的准确性。
注意:
- 代码中使用了
magicNumber来识别属于当前策略的订单。 initialLotSize是初始手数,可以根据需求进行调整。profitTarget是止盈目标,可以根据需求进行调整。maxReentries和pipsThreshold可以根据需求进行调整,用于控制止损和重新入场。- 代码中的
OrderSend,OrderClose,OrderDelete等函数需要根据具体交易平台进行调整。 - 使用前请仔细阅读代码并测试,确保代码的正确性。
建议:
- 在使用该代码之前,请进行充分的测试,并根据实际情况进行调整。
- 使用该代码进行交易存在风险,请谨慎使用。
- 使用该代码进行交易需要您对MT4交易平台有一定的了解。
- 该代码仅供参考,不构成投资建议。
原文地址: https://www.cveoy.top/t/topic/dsAf 著作权归作者所有。请勿转载和采集!