稳定三角套利三币对冲源码 -MT4/5金融交易/ 源码分享,欢迎提出修正
稳定三角套利三币对冲源码 -MT4/5金融交易/ 源码分享,欢迎提出修正
免费
  • 人气:45

稳定三角套利三币对冲源码 -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());

   }

}

2021-10-22_00-20-48-1.png

 SHAPE  * MERGEFORMAT

 SHAPE  * MERGEFORMAT