系统交易

雷蒙德云天指标:提升您的交易策略的利器
MetaTrader5
雷蒙德云天指标:提升您的交易策略的利器

雷蒙德云天指标简介 在交易市场中,选择合适的工具是成功的关键。雷蒙德云天指标(Raymond Cloudy Day)作为一款功能强大的交易辅助工具,致力于帮助交易者制定更明智的决策。 核心特点: 创新计算方法: 雷蒙德云天指标的核心是其独特的计算方法,提供高度准确和可靠的交易信号,帮助交易者做出明智的决策。 买卖扩展信号: 该指标确认潜在的趋势扩展,适合买入或卖出,并指示价格是否会回到主要计算点,为交易者提供战略性见解。 获利点(TP): 获利点可用于锁定利润或作为常规点位,给予策略执行更大的灵活性。 支撑/阻力线: 所有计算得出的点位都可作为支撑或阻力线,提供对潜在价格变动和市场行为的更深入理解。 使用优势: 提高准确性:通过创新的计算方法和先进的算法结合,雷蒙德云天指标能够更准确地识别趋势,提升您的决策过程。 多功能性:无论您是初学者还是经验丰富的交易者,雷蒙德云天指标都能满足您的需求,提供简单易用及高级功能。 定制交易策略: 请注意,目前EA中包含的策略仅为演示版本,尚未经过全面测试。我们鼓励您将自己的交易策略与雷蒙德云天指标结合使用,以充分发挥其潜力。尝试不同的方法,调整指标以适应您的交易风格,从而获得最佳效果。 体验雷蒙德的独特视角和我们的编码专业知识,借助雷蒙德云天指标优化您的交易策略,最大化您的市场成功。

2024.07.14
使用Prop Firm助手函数的突破策略 - MetaTrader 5专家分享
MetaTrader5
使用Prop Firm助手函数的突破策略 - MetaTrader 5专家分享

大家好, 今天来给大家更新一下我的《简单有效的突破策略》。在这个代码中,我增加了一些针对prop firm挑战的助手函数。 通常来说,要通过prop firm的挑战,你需要满足以下三个主要条件: 目标利润 不违反最大日损失 不违反最大损失 在这个代码中,我加入了两个函数来检查“目标利润”和“接近违反最大日损失”的情况,以便自动平掉所有仓位并删除所有未决订单。而对于“最大损失”,这实际上取决于你的交易策略和风险管理,所以在这个MQL5脚本中不再提及。 //+------------------------------------------------------------------+ //| Prop Firm助手函数                                       | //+------------------------------------------------------------------+ // 删除所有未决订单并平掉所有仓位 void ClearAll(string message) {    Comment(message);    for (int i = OrdersTotal() - 1; i >= 0; i--)    {       ulong orderTicket = OrderGetTicket(i);       if (OrderSelect(orderTicket))       {          trade.OrderDelete(orderTicket);       }    }    for (int i = PositionsTotal() - 1; i >= 0; i--)    {       ulong posTicket = PositionGetTicket(i);       trade.PositionClose(posTicket);    } } // 检查是否达到了利润目标 bool isPassed() {    return AccountInfoDouble(ACCOUNT_EQUITY) > PASS_CRITERIA; } // 检查是否即将违反最大日损失 bool isDailyLimit() {    MqlDateTime date_time;    TimeToStruct(TimeCurrent(), date_time);    int current_day = date_time.day, current_month = date_time.mon, current_year = date_time.year;       // 当前余额    double current_balance = AccountInfoDouble(ACCOUNT_BALANCE);       // 获取今天已平仓交易的盈亏    HistorySelect(0, TimeCurrent());    int orders = HistoryDealsTotal();       double PL = 0.0;    for (int i = orders - 1; i >= 0; i--)    {       ulong ticket=HistoryDealGetTicket(i);       if(ticket==0)       {          Print("HistoryDealGetTicket失败,没有交易历史");          break;       }       double profit = HistoryDealGetDouble(ticket,DEAL_PROFIT);       if (profit != 0)       {          // 获取交易时间          MqlDateTime deal_time;          TimeToStruct(HistoryDealGetInteger(ticket, DEAL_TIME), deal_time);          // 检查交易时间          if (deal_time.day == current_day && deal_time.mon == current_month && deal_time.year == current_year)          {             PL += profit;          }          else             break;       }    }    double starting_balance = current_balance - PL;    double current_equity   = AccountInfoDouble(ACCOUNT_EQUITY);    return current_equity < starting_balance - DAILY_LOSS_LIMIT; } 我们需要指定的参数如下: input string dd = "-------------PROP FIRM CHALLENGE-----------------"; input bool   isChallenge = false; input double PASS_CRITERIA = 110100; input double DAILY_LOSS_LIMIT = 4500; 希望这个脚本对你们有所帮助!

2024.05.11
如何查看最后关闭的交易数据:利润、类型和符号 - MetaTrader 5
MetaTrader5
如何查看最后关闭的交易数据:利润、类型和符号 - MetaTrader 5

在这篇博文中,我将教你如何通过代码块获取最后关闭交易的数据,而无需使用循环。这个方法简单易用,非常适合想要快速查看交易记录的朋友们。 步骤说明 首先,创建一个变量来设置当前日期的开始时间(这个步骤可以选择不做)。 接下来,创建一些其他变量,用于打印图表输出,以及在其他代码块中使用(这也是可选的)。 将此代码放入 OnTick(); 函数中,每次有新报价时都会显示结果,你也可以设置为每根K线显示一次。 代码示例 // 变量定义 string DayStart = "00:00"; // 日开始时间 double LastClosed_Profit; // 最后关闭交易的利润 string TradeSymbol, TradeType; // 专家初始化-------------------- int OnInit()   {    return(INIT_SUCCEEDED);   } // 专家去初始化------------------- void OnDeinit(const int reason)   {   } // 每次报价时执行-------------------------- void OnTick()   { // 检查最后关闭的交易    CheckLastClosed();   } //+------------------------------------------------------------------+ // 检查最后关闭的交易 void CheckLastClosed()   {    datetime HistoryTime = StringToTime(DayStart); // 从日开始到当前时间的历史数据    if(HistorySelect(HistoryTime,TimeCurrent))      {       int Total = HistoryDealsTotal();       // 获取最后交易的票据号码并选择它以便进一步处理       ulong Ticket = HistoryDealGetTicket(Total -1);       // 获取需要的数据       LastClosed_Profit = NormalizeDouble(HistoryDealGetDouble(Ticket,DEAL_PROFIT),2);       TradeSymbol      = HistoryOrderGetString(Ticket,ORDER_SYMBOL);       // 判断是卖出交易       if(HistoryDealGetInteger(Ticket,DEAL_TYPE) == DEAL_TYPE_BUY)         {          TradeType = "卖出交易";         }       // 判断是买入交易       if(HistoryDealGetInteger(Ticket,DEAL_TYPE) == DEAL_TYPE_SELL)         {          TradeType = "买入交易";         }       // 输出到图表       Comment("\n","交易总数 - :  ", Total,               "\n","最后交易票据 - :  ", Ticket,               "\n", "最后关闭利润 -:  ", LastClosed_Profit,               "\n", "最后交易类型 -:  ", TradeType);      }   } //+------------------------------------------------------------------+ 如果你想获取整个交易历史(从账户开始的所有交易),可以使用 HistorySelect(); 函数,如下所示: // 获取整个历史 HistorySelect(0,TimeCurrent()); 希望这个方法能帮助到你,让你更轻松地管理自己的交易历史!

2024.04.22
MetaTrader 5 中的计数器实现:如何设置 X 次计数与等待
MetaTrader5
MetaTrader 5 中的计数器实现:如何设置 X 次计数与等待

01. 计数 "X" 次后执行。 步骤 01 - 创建一个变量来设定 计数限制,你可以将其作为 输入参数,便于代码优化。 步骤 02 - 创建另一个变量来存储已计数的次数。 步骤 03 - 一旦 计数器 达到你设定的 计数限制,这意味着是时候执行你指定的代码块了。 步骤 04 - 执行完代码后,务必 重置计数器,否则它会无限计数。 你也可以为计数器块设置过滤条件,例如,>> "如果这个条件成立,则计数一次。" input int count = 50; // 将计数限制设为输入 int Counter; // 计数器变量 // 专家初始化 -------------------- int OnInit() { return(INIT_SUCCEEDED); } // 专家反初始化 ------------------- void OnDeinit(const int reason) { } // 专家每个 tick 执行 -------------------------- void OnTick() { Counter++; // 每个 tick 计数加 1。 Comment("当前计数 -:", Counter); if(Counter == count) // 计数 "X" 次后执行 | 这个代码块每次计数达到时只执行一次。 {      // 你的代码在这里...... Alert(count," 次已计数"); Counter = 0; // 在代码块结束时重置计数器。这是必须的。 } } // OnTick 结束  <<---------------------- 02. 计数 "X" 次后等待 "X" 次再执行。 这种方法可以用来实现等待和执行、执行和等待的逻辑。 步骤 01 - 创建变量来设定 计数限制 和 等待限制,你可以将它们作为 输入参数,便于代码优化。 步骤 02 - 创建另一个变量来存储计数和等待的次数。 步骤 03 - 一旦 计数器 和你的 计数限制 相等,意味着是时候执行你的代码块。 步骤 04 - 一旦 等待器 和你的 等待限制 相等,意味着是时候稍等一下。 步骤 05 - 一旦达到等待限制,务必 重置计数器 和 等待器,否则将会停止工作。 你也可以为计数器块和等待器块设置 过滤条件,例如,>> "如果这个条件成立,则等待一下" input int count = 50; // 将计数限制设为输入 input int wait = 50; // 将等待限制设为输入 int Counter; // 计数器变量,默认值为 "0" int Waiter; // 等待器变量,默认值为 "0" // 专家初始化 -------------------- int OnInit()   {    return(INIT_SUCCEEDED);   } // 专家反初始化 ------------------- void OnDeinit(const int reason)   {   } // 专家每个 tick 执行 -------------------------- void OnTick()   {    Comment("已计数的 ticks -: ", Counter, " ", "已等待的 ticks -: ", Waiter);    if(Counter < count) // 执行 "X" 次      {       Counter++; // 更新计数器       // 你的代码在这里。      }    else       if(Waiter < wait) // 等待 "X" 次         {          Waiter++; // 更新等待器          // 你的代码在这里。         }    if(Waiter == wait) // 达到等待限制      {       Counter = 0; // 重置计数器       Waiter = 0; // 重置等待器      }   } // OnTick 结束  <<---------------------- //+------------------------------------------------------------------+ 特别提示 -: 你可以通过修改上面的代码,移除等待代码块,来实现 "执行 X 次后停止" 的功能。这样就会计数特定次数后停止工作,直到计数器被重置。如果你将这些变量创建为全局变量,可以在代码的任何地方进行重置。

2024.04.14
使用历史K线检测新K线的高效代码块 - MetaTrader 5专家
MetaTrader5
使用历史K线检测新K线的高效代码块 - MetaTrader 5专家

在之前的代码中,我使用了时间来检测新K线。这次我们换个方式,利用K线数量来检测新K线。这个方法比使用时间的方法更轻便且更快速。声明一个整数类型的变量来存储K线数量。在初始化时,为"BarsTotal_OnInt"赋值K线数量。使用iBars();函数在实时图表中为"BarsTotal_OnTick"变量赋值K线数量。这个变量会在每次波动时更新。使用注释和警报来检查代码的准确性。int BarsTotal_OnInt; int BarsTotal_OnTick; //+------------------------------------------------------------------+ //| 专家初始化函数                                   | //+------------------------------------------------------------------+ int OnInit()   {      BarsTotal_OnInt = iBars(NULL,PERIOD_CURRENT); // 初始化时赋值总K线数量    return(INIT_SUCCEEDED);   }    void OnTick() // 每次波动函数   {      BarsTotal_OnTick = iBars(NULL,PERIOD_CURRENT); // 存储最新的K线数量       if(BarsTotal_OnTick > BarsTotal_OnInt) // 新K线到达    {     BarsTotal_OnInt = BarsTotal_OnTick; // 更新历史记录。     Alert("新K线到达!");     Comment("历史K线数量 -: ", BarsTotal_OnInt, "\n", "实时K线数量 -: ", BarsTotal_OnTick); // 你的代码可以在这里添加。-------------------------- // 你可以更新一个"标志"/变量用于后续使用。    }   }

2024.04.11
利用移动止损策略优化你的交易表现
MetaTrader5
利用移动止损策略优化你的交易表现

这个代码块在你使用止损的情况下也能正常工作。 需求说明 你需要包含 "Trade.mqh",以便访问 CTrade 类,这样你就可以对持仓和订单进行操作。 #include <Trade\Trade.mqh> // <<------------------------------------------ 包含这个 "Trade.mqh" 以访问 CTrade 类 你需要设置一个 输入参数,以调整你想要的移动距离。虽然这不是必需的,但为了方便,设置一个是好的。 input double Trailing_Step = 3.0; 你需要定义一个 CTrade 类的实例,名称可以随意。最好在 OnInit 事件处理程序之后定义它。 接下来,你需要创建一个 if 语句 来检查当前是否有持仓在运行。这个语句每次 tick 时调用 Check_TrailingStop(); 函数。这一点很重要,因为 EA 应该能够 顺畅而快速 地调整止损。请记得把这个语句放在 OnTick 事件处理程序的顶部,以确保正常工作。 //+------------------------------------------------------------------+ //| 专家初始化函数 | //+------------------------------------------------------------------+ int OnInit() { //--- 创建定时器 EventSetTimer(60); //--- return(INIT_SUCCEEDED); } CTrade trade; // <<------------------------------------------ 声明 "CTrade" 类,你可以用任何你想要的名字替换 "trade" void OnTick() { if(PositionsTotal() > 0) { // 如果有持仓时,每次 tick 调用移动止损函数 Check_TrailingStop(); } } 你需要声明一个自定义函数 Check_TrailingStop();(在这个例子中)。你可以用任何你想要的名字。 自定义函数会循环遍历 所有打开的持仓,并根据你设置的距离来调整它们。 void Check_TrailingStop() { int totalPositions = PositionsTotal(); for(int count = 0; count < totalPositions; count++) { ulong TicketNo = PositionGetTicket(count); // 使用持仓的 'index' 获取持仓票号 if(PositionSelectByTicket(TicketNo)) { // 使用票号选择持仓 if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { // 检查持仓类型 double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); // <<-------------------获取当前止损 double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(bidPrice - (Trailing_Step * Point()), _Digits); if(stopLoss < openPrice) { // 如果没有止损 if(bidPrice > openPrice && trailingLevel > openPrice) { // 每个持仓仅运行一次,设置初始止损 trade.PositionModify(ticket, trailingLevel, takeProfit); // 使用 "CTrade.trade" 修改移动止损 } } if(bidPrice > openPrice && trailingLevel > stopLoss) { // 检查移动止损水平是否高于之前的水平 trade.PositionModify(ticket, trailingLevel, takeProfit); // 使用 "CTrade.trade" 修改移动止损 } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); double askPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(askPrice + (Trailing_Step * Point()), _Digits); if(stopLoss < openPrice) { // 如果没有止损 if(askPrice < openPrice && trailingLevel < openPrice) { // 每个持仓仅运行一次,设置初始止损 trade.PositionModify(ticket, trailingLevel, takeProfit); // 使用 "CTrade.trade" 修改移动止损 } } if(askPrice < openPrice && trailingLevel < stopLoss) { // 检查移动止损水平是否高于之前的水平 trade.PositionModify(ticket, trailingLevel, takeProfit); // 使用 "CTrade.trade" 修改移动止损 } } } } }

2024.04.05
MetaTrader 5 新K线检测简单代码分享
MetaTrader5
MetaTrader 5 新K线检测简单代码分享

大家好!今天我想和大家分享一段简单的代码,用于在MetaTrader 5中检测新K线的生成。这个功能对每位交易者来说都非常重要,能够帮助我们及时掌握市场动态。 这段代码的基本原理非常简单。首先,代码会存储上一个K线的时间(Time of the previous bar)。然后,我们在这个时间上加上60秒(即1分钟,当然你也可以根据需要调整时间),这样就得到了当前K线的收盘时间。 当当前时间等于当前K线的收盘时间时,就意味着新K线已经生成。 在这段代码中,使用了一个布尔类型的变量NewBarReceived来避免多次调用代码块,也就是说这段代码每次K线生成时只会执行一次。你可以在代码中看到使用了Comment();和PlaySound("ok.wav");来检查代码的准确性,如果不需要可以删除。 当当前时间超过当前K线的收盘时间时,标记会重置为false,以便检查下一根K线的到来。(具体可以查看代码中的注释)。 //+------------------------------------------------------------------+ //|                                                            新K线检测.mq5 | //|                                                            作者:H A T Lakmal | //|                                                             https://t.me/Lakmal846 | //+------------------------------------------------------------------+ bool NewBarReceived = false; // 用于控制的标志。 //+------------------------------------------------------------------+ //| 专家初始化函数                                   | //+------------------------------------------------------------------+ int OnInit()   { //--- 创建定时器    EventSetTimer(60); //---    return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ //| 专家去初始化函数                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   { //--- 销毁定时器    EventKillTimer();   } //+------------------------------------------------------------------+ //| 专家每个Tick的处理函数                                             | //+------------------------------------------------------------------+ void OnTick()   {    datetime TimePreviousBar = iTime(_Symbol,PERIOD_M1,1);    datetime TimeCurrentClose = TimePreviousBar + 60; // 当前K线的收盘时间。    datetime Time_Current = TimeCurrent();    if(Time_Current == TimeCurrentClose && NewBarReceived == false)      {       PlaySound("ok.wav");   // 用于确认是否正常工作。       NewBarReceived = true; // 更新标志以避免多次调用。       // 在这里添加你的代码 ----- (执行某些操作)      }    else       if(Time_Current > TimeCurrentClose)         {          NewBarReceived = false; // 重置标志以准备下一根K线。          // 在这里添加你的代码 ----- (执行某些操作)         }    Comment(" " +  " " +  "当前K线时间 -: " + TimeToString(TimePreviousBar,TIME_DATE|TIME_MINUTES|TIME_SECONDS) +            " " + "当前收盘时间 -: " +TimeToString(TimeCurrentClose,TIME_DATE|TIME_MINUTES|TIME_SECONDS) +            " " + "当前时间 -: " + TimeToString(Time_Current,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " +" " + "新K线到达 -: " + NewBarReceived); // 用于检查计算结果   } //+------------------------------------------------------------------+ //| 定时器函数                                                    | //+------------------------------------------------------------------+ void OnTimer()   { //---   } //+------------------------------------------------------------------+ //| 交易函数                                                   | //+------------------------------------------------------------------+ void OnTrade()   { //---   } //+------------------------------------------------------------------+ //| 图表事件函数                                              | //+------------------------------------------------------------------+ void OnChartEvent(const int id,                   const long &lparam,                   const double &dparam,                   const string &sparam)   { //---   } //+------------------------------------------------------------------+ 希望这段代码能对大家有所帮助!如果你有任何问题或者想法,欢迎在评论区留言,我们一起交流学习!

2024.04.05
用MQL5实现算法交易的神经网络实例
MetaTrader5
用MQL5实现算法交易的神经网络实例

了解《用MQL5实现算法交易的神经网络》《用MQL5实现算法交易的神经网络》是一本专为希望在交易中运用机器学习和神经网络的算法交易者而设计的实用指南。无论你是刚入门的新手,还是已经有一定基础的交易者,这本书都能带你深入了解如何使用高级人工智能技术来构建交易策略。书中共分为七个章节,涵盖了你需要了解的所有内容,帮助你入门神经网络,并将其集成到你的MQL5交易机器人中。通过简单易懂的解释,你将学习到机器学习的基础知识,探索不同类型的神经网络,包括卷积神经网络和递归神经网络,以及更复杂的架构解决方案和注意力机制。为了帮助你在MQL5环境中将这些解决方案整合到你的交易机器人中,书中提供了大量的实用实例。此外,书中还探讨了多种改善模型收敛的方法,如批量归一化(Batch Normalization)和Dropout等技术。作者还提供了关于如何训练神经网络以及如何将其嵌入到你的交易策略中的实用指导。你将学习如何创建交易专家顾问(Expert Advisors),以便在新数据上测试训练模型的表现,从而评估其在实际金融市场中的潜力。《用MQL5实现算法交易的神经网络》不仅仅是一本书,它是一本可以帮助你将先进的决策技术集成到交易算法中的实用指南,潜在地改善你的财务结果。今天就开始学习机器学习的高级能力,将你的交易提升到一个新的水平吧!

2024.02.29
MetaTrader 5连接断开声音提醒工具使用指南
MetaTrader5
MetaTrader 5连接断开声音提醒工具使用指南

大家好!今天给大家分享一个非常实用的工具——在MetaTrader 5上实现连接和断开时的声音提醒。这款小工具可以帮助我们更好地监控交易平台的状态,避免错过重要的交易机会。 工具简介 这个工具的使用方法非常简单,只需将声音文件添加到指定的文件夹中,然后编译这个EA工具即可。 如何添加声音文件 将你准备好的声音文件(.wav格式)放入到 MQL5\Files\Sounds 文件夹中。 编译EA工具 复制下面的代码并进行编译,注意:代码中有注释说明,使用 #resource 可能会导致上传失败。 //+------------------------------------------------------------------+ //|                               Connect_Disconnect_Sound_Alert.mq5 | //|                                Copyright 2024, Rajesh Kumar Nait | //|                  https://www.mql5.com/en/users/rajeshnait/seller | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, Rajesh Kumar Nait" #property link      "https://www.mql5.com/en/users/rajeshnait/seller" #property version   "1.00" #include <Trade/TerminalInfo.mqh> bool     first             = true; bool     Now_IsConnected   = false; bool     Pre_IsConnected   = true; datetime Connect_Start = 0, Connect_Stop = 0; CTerminalInfo terminalInfo; //--- Sound files #resource "\\Files\\Sounds\\CONNECTED.wav" #resource "\\Files\\Sounds\\DISCONNECTED.wav" //+------------------------------------------------------------------+ //| Expert initialization function                                   | //+------------------------------------------------------------------+ int OnInit()   { //---       ResetLastError();       while ( !IsStopped() ) {          Pre_IsConnected = Now_IsConnected;          Now_IsConnected = terminalInfo.IsConnected();          if ( first ) {             Pre_IsConnected = !Now_IsConnected;          }          if ( Now_IsConnected != Pre_IsConnected ) {             if ( Now_IsConnected ) {                Connect_Start = TimeLocal();                if ( !first ) {                   if(!PlaySound("::Files\\Sounds\\DISCONNECTED.wav"))                      Print("Error: ",GetLastError());                }                if ( IsStopped() ) {                   break;                }                if(!PlaySound("::Files\\Sounds\\CONNECTED.wav"))                   Print("Error: ",GetLastError());             } else {                Connect_Stop = TimeLocal();                if ( !first ) {                   if(!PlaySound("::Files\\Sounds\\CONNECTED.wav"))                      Print("Error: ",GetLastError());                }                if ( IsStopped() ) {                   break;                }                if(!PlaySound("::Files\\Sounds\\DISCONNECTED.wav"))                   Print("Error: ",GetLastError());             }          }          first = false;          Sleep(1000);       } //---    return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ 视频教程 如果你需要更直观的教程,可以观看下面的视频:

2024.01.08
深入探讨MQL5编程:MetaTrader 5的高级工具与集成
MetaTrader5
深入探讨MQL5编程:MetaTrader 5的高级工具与集成

第七部分:MQL5高级工具 《MQL5编程为交易者服务》的第七部分介绍了MQL5 API的高级功能,这些功能在开发MetaTrader 5程序时将非常有用。这些功能包括自定义金融符号、内置经济日历事件以及网络、数据库和密码学等通用技术。 这一部分主要讨论了库(Libraries)——一种特殊的程序类型,提供了连接其他MQL程序的现成API。同时,也探讨了开发软件包的可能性,以及将逻辑上互相关联的程序组合成项目的方法。 最后,我们将介绍与其他软件环境的集成,包括Python的使用。 我们将首先研究资源(Resources),这些是可以嵌入程序代码的任何类型的文件。资源可以包含: 多媒体元素 来自外部程序的“硬”设置 以编译格式存在的其他MQL5程序 MQL5开发环境允许在源文件中包含应用数据数组、图像、声音和字体,使程序成为一个自给自足、便于最终用户使用的产品。 我们将特别关注以BMP格式存储的光栅图像的图形资源:你将学习如何动态创建、编辑和在图表上显示它们。 在书的最后部分,我们将研究MQL5中的OpenCL集成。OpenCL是一个开放标准,适用于多处理器系统中的并行编程,包括图形处理器(GPU)和中央处理单元(CPU)。它使得计算密集型任务的加速成为可能,前提是算法可以进行并行化。这些任务可能包括神经网络的训练、傅里叶变换和方程组的求解。 在MQL程序中使用OpenCL,需要制造商提供的特殊驱动程序,并支持OpenCL版本1.1及以上。虽然不一定需要图形卡,但中央处理器同样可以用于并行计算。

2023.12.16
首页 上一页 1 2 3 4 5 6 7 8 9 10 下一页 末页