系统交易

如何查看最后关闭的交易数据:利润、类型和符号 - 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
如何在MetaTrader 4中使用虚拟止损和止盈设置
MetaTrader4
如何在MetaTrader 4中使用虚拟止损和止盈设置

虚拟止损止盈脚本概述今天给大家介绍一个非常实用的交易工具——Virtual_SL_TP_Pending_with_SL_Trailing.mq4。这个脚本专为帮助交易者管理交易而设计,能够设置虚拟止损和止盈水平,并包含一个可选的跟随止损功能。脚本功能详细解析以下是这个脚本的主要功能和特点:版权和链接:提供了版权信息以及开发者网站的链接。版本:标明脚本的版本号。描述:包含脚本的详细信息,包括开发者的邮箱,以及使用软件的风险提示。输入参数:用户可以自定义EA行为的外部变量,包括:StopLossPoints:初始止损点数。TakeProfitPoints:初始止盈点数。SpreadThreshold:虚拟止损/止盈的点差阈值。TrailingStopPoints:虚拟挂单的跟随止损点数。EnableTrailing:启用或禁用跟随止损的选项。全局变量:在脚本中使用的变量,用于存储初始点差、虚拟止损、虚拟止盈和挂单价格。初始化函数(OnInit):当EA附加到图表时,初始化EA,并根据输入参数计算初始的虚拟止损、止盈和挂单价格。价格波动函数(OnTick):每当价格波动时调用,检查点差是否超过阈值,并相应调整虚拟止损、止盈和挂单价格。同时监测价格是否触及虚拟止损或止盈并平仓。如果启用跟随止损且价格到达挂单价格,则会以跟随止损的方式放置虚拟挂单。平仓函数(ClosePosition):当价格触及虚拟止损或止盈时平仓。挂单放置函数(PlacePendingOrder):如果启用跟随止损,则以跟随止损的方式放置虚拟挂单。这个EA为交易者提供了一种灵活的交易管理方式,可以利用虚拟水平和跟随止损功能,帮助大家在MetaTrader 4中自动化交易管理流程。

2024.04.10
基于预设条件的简单趋势跟随交易策略 - MetaTrader 4 专用脚本
MetaTrader4
基于预设条件的简单趋势跟随交易策略 - MetaTrader 4 专用脚本

今天,我想和大家分享一个适用于MetaTrader 4(MT4)的简单趋势跟随交易策略脚本。这段脚本可以帮助我们在预设条件下进行买入和卖出,下面就来详细了解一下这个脚本的结构和功能。 初始化:脚本在成功初始化时会打印一条消息,让我们知道它已准备就绪。 反初始化:在脚本被反初始化时,它也会打印一条消息,方便我们跟踪状态。 OnTick 函数:每当市场价格发生变化时,这个函数就会被执行。 a. 重置持仓跟踪变量:脚本会重置跟踪当前买入和卖出持仓的变量。 b. 检查已开订单:脚本会遍历所有已开的订单,以确认是否存在买入或卖出持仓。 c. 开设买入持仓:如果没有已开的买入持仓,并且“OpenBuyPosition”标志被设为真,脚本会尝试根据当前市场报价开设一个买入持仓,并设置止损和止盈。 d. 开设卖出持仓:如果没有已开的卖出持仓,并且“OpenSellPosition”标志被设为真,脚本会尝试根据当前市场询价开设一个卖出持仓,并设置止损和止盈。 e. 检查已平仓订单:脚本会检查是否有已平仓的订单。如果某个买入或卖出订单盈利平仓,它会重置对应的持仓标志。 输入参数:脚本提供了输入参数,包括手数、止损、止盈,以及控制是否开设买入或卖出持仓的标志。 免责声明:脚本中包含一条警告,提醒用户使用时需自行承担风险,创作者对可能导致的损失不承担任何责任。 总体而言,这个脚本旨在自动化执行基于趋势跟随策略的买卖订单,用户可以根据自己的需求自定义参数,例如手数和交易方向。不过,建议大家在实际交易前一定要谨慎使用,并进行充分的测试。

2024.04.10
利用移动止损策略优化你的交易表现
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
MetaTrader 4:如何使用账户货币关闭盈利和亏损的交易
MetaTrader4
MetaTrader 4:如何使用账户货币关闭盈利和亏损的交易

在交易的世界里,我们常常需要及时关闭盈利或亏损的交易。今天,我想和大家分享一个关于MetaTrader 4的EA(专家顾问)的新功能,它能帮助我们在账户货币中自动管理这些交易。 //+------------------------------------------------------------------------------------------------------------------------------+ //|Close_on_PROFIT_or_LOSS_inAccont_Currency_V2 优化更新: //| //|1. 增加错误处理:该代码包含错误处理,能够处理无法关闭或删除订单的情况。 //|2. 代码优化:优化了代码,避免重复,提高了可读性。 //|3. 效率提升:移除了不必要的循环或计算。 //|4. EA去初始化时清除所有图表对象。 //+------------------------------------------------------------------------------------------------------------------------------+ 当设置为0时,EA将不会执行任何操作。 要设置Positive_Closure_in_Account_Currency,必须高于当前的权益金额,否则交易将立即执行。 例如:如果权益为55000美元,而Positive_Closure_in_Account_Currency设置为55500美元,目标是盈利500美元。 如果 Positive_Closure_in_Account_Currency > 0 且 < 55000美元,将立即执行交易。 同样,Negative_Closure_in_Account_Currency必须低于当前的权益金额,否则交易会立即执行。 例如:如果权益为55000美元,Negative_Closure_in_Account_Currency设置为54500美元,目标是亏损不超过500美元。 如果 Negative_Closure_in_Account_Currency > 55000美元,将立即执行交易。 建议降低点差数值以避免点差波动,但市场总是有其自身的规律,可能会导致更高的盈利或亏损。 如果设置的点差低于交易对的平均点差,那么这些交易将不会被执行。 警告:使用此软件需自担风险,外汇市场波动极大! #property copyright     "Copyright 2024, MetaQuotes Ltd." #property link          "https://www.mql5.com" #property version       "1.01" #property description   "persinaru@gmail.com" #property description   "IP 2024 - 免费开源" #property description   "此EA在账户货币中关闭所有交易的盈利与亏损。" #property description   "警告:使用此软件需自担风险。" #property description   "该脚本的创建者不对任何损失或损害负责。" #property strict #property show_inputs extern string  Closures = "EA在达到盈利或亏损时关闭所有交易和挂单。盈利与亏损以账户货币计算。"; extern int Positive_Closure_in_Account_Currency     = 0; extern int Negative_Closure_in_Account_Currency     = 0; extern int Spread = 10;

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

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

2024.02.29
首页 上一页 2 3 4 5 6 7 8 9 10 11 12 下一页 末页