for (int i = 0; i < ArraySize(Lots); i++) if (OrderSelect(0, SELECT_BY_POS) && SymbolInfoTick(_Symbol, Tick)) OrderClose(OrderTicket(), Lots[i], Tick.bid, 0);
constint Total = OrdersHistoryTotal();
for (int i = 0; i < Total; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) OrderPrint(); } }
在测试器 mt4orders_exampleexpert.mq5 中运行
在编写程序库时,我还没有完全意识到用户可能出现的问题。在您之前,所有问题都是在没有说明的情况下解决的。
EA 转换的简明示例不仅在库说明中,而且在其讨论中 - 在评论中(那里更清楚)。
多亏了 ilan1_4_strict.mq4,一切都很顺利,但我的 EA 出现了 75 个错误。这些错误是这样的
感谢使用 ilan1_4_strict.mq4,一切正常,但我的 ea 出现了 75 个错误。这些错误都属于这种性质:
至少,把整个图形部分扔掉。
为什么要把它放在测试器中?
至少,扔掉所有图形。
为什么还要在测试器中使用?
感谢使用 ilan1_4_strict.mq4,一切正常,但我的 ea 出现了 75 个错误。这些错误是这样的:
在 "讨论 "和 "说明 "中,有这样的话
这项工作只 影响订单系统。
当 MQL4 代码无需更改 即可在 MetaTrader 5 中运行时,创建这样一个完整库的可能性问题尚未解决。
请注意!
该库只包含一个文件 - MT4Orders.mqh。所有其他文件均附有使用该库的示例。使用程序库时不需要这些文件。
在 MT4->MT5 过渡期间,最困难的障碍是新的订单系统。MT4Orders 完全消除了这一困难。其他差异并不令人沮丧。因为它们很容易重写 -在这方面有方便的参考数据。该库工作的正确性体现在以下方面
以不同类型的 MT4/5-advisors为例(来自 kodobase):pips、news、martin、multicurrency 等。
关于交易、自动交易系统和测试交易策略的论坛。
错误、错误、问题
fxsaber, 2016.10.20 15:54
#include <Trade\Trade.mqh>;
#include <Trade\OrderInfo.mqh>
// 通过 MT5 标准库 - 仅限 MT5
// 设置卖出限价,然后设置其 SL/TP
void MT5Order( const double Price )
{
CTrade Trade;
if ((ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE) == SYMBOL_TRADE_EXECUTION_EXCHANGE)
Trade.SetTypeFilling(ORDER_FILLING_RETURN);
Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_LIMIT, 1, 0, Price, 0, 0, ORDER_TIME_GTC, 0, __FUNCTION__);
const ulong Ticket = Trade.ResultOrder();
if (Ticket > 0)
{
COrderInfo Order;
if (Order.Select(Ticket))
Trade.OrderModify(Order.Ticket(), Order.PriceOpen(), Order.PriceOpen() + SLTP, Order.PriceOpen() - SLTP, Order.TypeTime(), Order.TimeExpiration());
}
}
#include <MT4Orders.mqh> //https://www.mql5.com/zh/code/16006
// 通过 MT4-OSJS - 跨平台变体(MT4/5)
// 设置卖出限价,然后设置其 SL/TP
void MT4Order( const double Price )
{
const int Ticket = OrderSend(_Symbol, OP_SELLLIMIT, 1, Price, 0, 0, 0, __FUNCTION__);
if ((Ticket > 0) && OrderSelect(Ticket, SELECT_BY_TICKET))
OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + SLTP, OrderOpenPrice() - SLTP, OrderExpiration(), clrNONE);
}
void OnTick()
{
static bool FirstRun = true;
if (FirstRun)
{
const double Price = SymbolInfoDouble(_Symbol, SYMBOL_BID) + 100 * _Point;
MT5Order(Price); // 通过 MT5 标准库 - 仅限 MT5
MT4Order(Price); // 通过 MT4-OSJS - 跨平台变体(MT4/5)
FirstRun = false;
}
}
黄色突出显示的 MT4Order 函数与 MT5Order 函数的作用相同。在任何论坛中,黄色代码都会立即被理解,而 MT5 的替代代码则不会。
至于如何编写 MT5 代码,每个人都可以自己决定。例如,我使用 MT4Orders,在极少数情况 下也使用纯粹的(SB 功能较弱)MQL5。两种写作方式并行工作。但如果只通过 MT4Orders 来编写,订单系统将是跨平台的。因此,我练习编写可在两个平台上运行而无需更改的代码。
因此,我练习编写在两个平台上都能正常运行的代码。
关于交易、自动交易系统和测试交易策略的论坛
如何确定订单的最后收盘价 (MQL5)?
fxsaber, 2016.12.05 10:25 AM
void OnStart()
{
if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
Alert(OrderClosePrice());
}
{
int oldticket=0;
int Ticket=0;
ArrayResize(Mas_LOT,OrdersTotal(),3);
ArrayInitialize(Mas_LOT,0);
for(int i=0; i <= OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){
if (OrderSymbol()==Symbol()&& OrderMagicNumber() == Magik){
Mas_LOT[i][0] = OrderTicket();
Mas_LOT[i][1] = OrderLots();
Mas_LOT[i][2] = OrderType();
Mas_LOT[i][3] = (OrderProfit() + OrderSwap() + OrderCommission());
Mas_LOT[i][4] = OrderStopLoss();
Mas_LOT[i][5] = OrderOpenPrice();
Mas_LOT[i][6] = OrderTakeProfit();
}}}}
如何使用 MT4Orders.mqh 库将其转换为 mt5 的最佳方法
交易、自动交易系统和交易策略测试论坛
新版 MetaTrader 5 build 1525:以头寸形式展示历史并改进测试器
fxsaber, 2017.01.27 19:20
运行跨平台脚本
#property strict
#include <MT4Orders.mqh>
void OnStart()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick) && (OrdersTotal() == 0) &&
(OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0) > 0))
{
const double Lots[] = {0.6, 0.3, 0.1};
for (int i = 0; i < ArraySize(Lots); i++)
if (OrderSelect(0, SELECT_BY_POS) && SymbolInfoTick(_Symbol, Tick))
OrderClose(OrderTicket(), Lots[i], Tick.bid, 0);
const int Total = OrdersHistoryTotal();
for (int i = 0; i < Total; i++)
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
OrderPrint();
}
}
首先在 MT5-Hedge 上。我们得到了如此漂亮的 MT4 打印输出
#114769087 2017.01.27 19:57:25 buy 0.60 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -5.40 0
#114769088 2017.01.27 19:57:25 buy 0.30 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:25 1.06829 0.00 0.00 -2.70 0
#114769089 2017.01.27 19:57:25 buy 0.10 EURUSD 1.06838 0.00000 0.00000 2017.01.27 19:57:26 1.06829 0.00 0.00 -0.90 0
和经典报告
作为确认,我们在 MT4 上运行相同的脚本。
经典 MT4 报告
脚本日志打印输出
#170039287 2017.01.27 20:00:57 buy 0.60 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:57 1.06836 0.00 0.00 -10.80 to #170039289 0
#170039289 2017.01.27 20:00:57 buy 0.30 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -5.40 to #170039290 0
#170039290 2017.01.27 20:00:57 buy 0.10 EURUSD 1.06854 0.00000 0.00000 2017.01.27 20:00:58 1.06836 0.00 0.00 -1.80 from #170039289 0
您可以清楚地看到 MT4 和 MT5 中的脚本日志是一致的 - 跨平台运行。
ZY 如果通过 SB 为 MT5 编写脚本逻辑,脚本将无法正常工作。一般来说,很难说如何为 MT5 编写如此简单的 MQL4 逻辑。
按符号和 majic 选择不起作用
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}
OrderSelect 不起作用,无法选择订单(按索引选择票据)来使用它,附件中的简单示例,由于某些原因,它在mt5上不起作用。