稳定三角套利三币对冲源码 -MT4/5金融交易/ 源码分享,欢迎提出修正
简介: 三角套利是同时开立三个货币对的订单。交易
三角套利是同时开立三个货币对的订单。交易方向和货币对的选择方式使得同时开立的头寸可以相互保险。因此,您可以开立相当大的手数,而且风险很低。
三角期权:
EURUSD – USDJPY – EURJPY
USDCAD – CADCHF – USDCHF
EURGBP – GBPUSD – EURUSD
AUDUSD – USDCAD – AUDCAD
GBPAUD – AUDUSD – GBPUSD
总共有数百种期权,您可以使用 scripts-triangles 脚本来确定它们。他自己选择必要的三角形并将它们收集到一个文件中。EA顾问在三个指定的工具上开立三个头寸并控制它们的总利润。这种三角形中包含的头寸在不断移动。所有利润的金额都先增加,然后减少,不会超出大限度,即使在非常动荡的市场中也是如此。因此,无论价格如何变动,我们始终受到保障!一旦盈利额达到设定值,EA 就会关闭所有三个仓位。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//+--------------------------------------------------------------------------------+
//| 专家顾问:三角对冲网格交易系统 |
//| 版权 © 2023-2025, AI编程zblog |
//| http://eawalk.com |
//+--------------------------------------------------------------------------------+
#property copyright"Copyright © 2023, AI编程zblog "
#propertylink "http://eawalk.com"
#propertyversion "2.0"
#property strict
#propertydescription "优化版:三角对冲结合网格交易,带止损止盈和资金管理。"
// 输入参数(EA 面板)
extern stringSYMBOL1 = "GBPUSD"; // 第一货币对
extern stringSYMBOL2 = "USDJPY"; // 第二货币对
extern stringSYMBOL3 = "GBPJPY"; // 第三货币对
extern doubleBaseLot = 0.01; // 基础手数(网格起始手数)
extern doubleLotMultiplier = 1.5; // 网格手数倍增系数
extern int GridStep = 20; // 网格间距(点数)
extern int MaxOrders = 5; // 每货币对最大网格订单数
extern int TYPE1 = OP_BUY; // 第一货币对订单类型 (OP_BUY=买入, OP_SELL=卖出)
extern int TYPE2 = OP_BUY; // 第二货币对订单类型
extern int TYPE3 = OP_SELL; // 第三货币对订单类型
extern int Magic = 777888; // 魔法数字(订单标识)
extern doubleProfitClose = 10.0; // 总盈利目标(账户货币单位)
extern doubleStopLoss = 50.0; // 止损(点数)
extern doubleTakeProfit = 30.0; // 止盈(点数)
string AC; //账户货币单位
// 初始化
int OnInit() {
EventSetTimer(5); // 5秒定时器,减少CPU占用
AC =AccountCurrency();
return(INIT_SUCCEEDED);
}
// 主逻辑
void OnTick() {OnTimer(); }
void OnTimer() {
if(IsTesting() && OrdersTotal() == 0) {
double ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
if (OrderSend(Symbol(), OP_BUY, BaseLot, ask, 1000, ask - StopLoss *Point, ask + TakeProfit * Point, "测试", Magic, 0, clrNONE) == -1)
Print("测试错误:开单 ", Symbol(), ",错误:", GetLastError());
return;
}
doubleprofit1 = 0, profit2 = 0, profit3 = 0, totalProfit = 0;
intcount1 = 0, count2 = 0, count3 = 0; // 各货币对订单数
// 计算盈利和订单数量
for(int i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (Magic != OrderMagicNumber()) continue;
string sym = OrderSymbol();
if (sym != SYMBOL1 && sym != SYMBOL2 && sym!= SYMBOL3) continue;
double profit = OrderProfit() + OrderSwap() +OrderCommission();
if (sym == SYMBOL1) { profit1 += profit; count1++; }
if (sym == SYMBOL2) { profit2 += profit; count2++; }
if (sym == SYMBOL3) { profit3 += profit; count3++; }
}
}
totalProfit = profit1 + profit2 + profit3;
// 达到盈利目标时平仓
if(totalProfit >= ProfitClose) {
CloseAllOrders();
return;
}
// 显示信息
Comment(TimeCurrent(), "n", SYMBOL1, " 盈利:",DoubleToString(profit1, 2), " ", AC, " 订单数:", count1,
"n", SYMBOL2, " 盈利:",DoubleToString(profit2, 2), " ", AC, " 订单数:", count2,
"n", SYMBOL3, " 盈利:",DoubleToString(profit3, 2), " ", AC, " 订单数:", count3,
"n总盈利:", DoubleToString(totalProfit, 2), "", AC);
// 管理网格交易
ManageGrid(SYMBOL1, TYPE1, count1);
ManageGrid(SYMBOL2, TYPE2, count2);
ManageGrid(SYMBOL3, TYPE3, count3);
}
// 关闭所有订单
voidCloseAllOrders() {
for(int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS)) {
if (Magic != OrderMagicNumber()) continue;
string sym = OrderSymbol();
if (sym != SYMBOL1 && sym != SYMBOL2 && sym!= SYMBOL3) continue;
double closePrice = (OrderType() == OP_BUY) ? SymbolInfoDouble(sym,SYMBOL_BID) : SymbolInfoDouble(sym, SYMBOL_ASK);
if (!OrderClose(OrderTicket(), OrderLots(), closePrice,1000, clrNONE))
Print("关闭订单错误 ", sym, ",错误:", GetLastError());
}
}
}
// 网格交易管理
voidManageGrid(string symbol, int type, int orderCount) {
if(orderCount >= MaxOrders) return; // 超过最大订单数不再开单
doublelastPrice = 0, currentPrice = (type == OP_BUY) ? SymbolInfoDouble(symbol,SYMBOL_BID) : SymbolInfoDouble(symbol, SYMBOL_ASK);
doublelot = BaseLot * MathPow(LotMultiplier, orderCount); // 手数递增
// 查找最后一个订单的价格
for(int i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS)) {
if (Magic != OrderMagicNumber() || OrderSymbol() != symbol|| OrderType() != type) continue;
lastPrice = OrderOpenPrice();
break;
}
}
// 如果没有订单或价格偏离足够远,开启新订单
if(orderCount == 0 || MathAbs(currentPrice - lastPrice) >= GridStep *SymbolInfoDouble(symbol, SYMBOL_POINT)) {
double openPrice = (type == OP_BUY) ? SymbolInfoDouble(symbol,SYMBOL_ASK) : SymbolInfoDouble(symbol, SYMBOL_BID);
double sl = (type == OP_BUY) ? openPrice - StopLoss *SymbolInfoDouble(symbol, SYMBOL_POINT) : openPrice + StopLoss *SymbolInfoDouble(symbol, SYMBOL_POINT);
double tp = (type == OP_BUY) ? openPrice + TakeProfit *SymbolInfoDouble(symbol, SYMBOL_POINT) : openPrice - TakeProfit *SymbolInfoDouble(symbol, SYMBOL_POINT);
if (OrderSend(symbol, type, lot, openPrice, 1000, sl, tp, "网格对冲", Magic, 0,clrNONE) == -1)
Print("开单错误 ", symbol, ",手数:",lot, ",错误:", GetLastError());
}
}