程序库: MT4Orders - 页 9

 
fxsaber:

在测试器 mt4orders_exampleexpert.mq5 中运行

在编写程序库时,我还没有完全意识到用户可能出现的问题。在您之前,所有问题都是在没有说明的情况下解决的。

EA 转换的简明示例不仅在库说明中,而且在其讨论中 - 在评论中(那里更清楚)。

多亏了 ilan1_4_strict.mq4,一切都很顺利,但我的 EA 出现了 75 个错误。这些错误是这样的


 
Nauris Zukas:

感谢使用 ilan1_4_strict.mq4,一切正常,但我的 ea 出现了 75 个错误。这些错误都属于这种性质:


至少,把整个图形部分扔掉。

为什么要把它放在测试器中?

 
ivanivan_11:

至少,扔掉所有图形。

为什么还要在测试器中使用?

你可以这么做,但还是有很多 bug。
 
Nauris Zukas:

感谢使用 ilan1_4_strict.mq4,一切正常,但我的 ea 出现了 75 个错误。这些错误是这样的:

在 "讨论 "和 "说明 "中,有这样的话

这项工作 影响订单系统。

当 MQL4 代码无需更改 即可在 MetaTrader 5 中运行时,创建这样一个完整库的可能性问题尚未解决。

请注意!

该库只包含一个文件 - MT4Orders.mqh。所有其他文件均附有使用该库的示例。使用程序库时不需要这些文件。

在 MT4->MT5 过渡期间,最困难的障碍是新的订单系统。MT4Orders 完全消除了这一困难。其他差异并不令人沮丧。因为它们很容易重写 -在这方面有方便的参考数据。该库工作的正确性体现在以下方面

以不同类型的 MT4/5-advisors为例(来自 kodobase):pips、news、martin、multicurrency 等。

这就是如何使用 MQL5 编写程序

关于交易、自动交易系统和测试交易策略的论坛。

错误、错误、问题

fxsaber, 2016.10.20 15:54

#define SLTP (10 * _Point)

#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 来编写,订单系统将是跨平台的。因此,我练习编写可在两个平台上运行而无需更改的代码。

 
fxsaber:

因此,我练习编写在两个平台上都能正常运行的代码。

谢谢! 我以后可能也要考虑一下这个选项。
 

关于交易、自动交易系统和测试交易策略的论坛

如何确定订单的最后收盘价 (MQL5)?

fxsaber, 2016.12.05 10:25 AM

#include <MT4Orders.mqh>

void OnStart()
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
    Alert(OrderClosePrice());
}
 
void Terminal()
{            
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();

}}}}

例如,mt4 中的订单数组对于计算平均止盈/止损等非常有用和方便,同样的数组也可以输入修改和拖网函数,但如何使用 MT4Orders.mqh 或不使用 MT4Orders.mqh库将 其转换为 mt5 会更好呢?
 
Aleksey Semenov:
如何使用 MT4Orders.mqh 库将其转换为 mt5 的最佳方法
添加
#include <MT4Orders.mqh>
 
跨平台示例

交易、自动交易系统和交易策略测试论坛

新版 MetaTrader 5 build 1525:以头寸形式展示历史并改进测试器

fxsaber, 2017.01.27 19:20

运行跨平台脚本

// MQL4&5 代码

#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 打印输出

#114769046 2017.01.27 19:57:25 balance 0.00  1 0 0 2017.01.27 19:57:11 0 0.00 0.00 50000.00 0
#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

和经典报告

订单
开仓时间订单符号类型成交量价格S / LT / P时间条件评论
2017.01.27 19:57:25131208025欧元兑美元买入1.00 / 1.001.068382017.01.27 19:57:25成交
2017.01.27 19:57:25131208027欧元兑美元卖出0.60 / 0.601.068292017.01.27 19:57:25成交
2017.01.27 19:57:25131208030欧元兑美元卖出0.30 / 0.301.068292017.01.27 19:57:25成交
2017.01.27 19:57:26131208031欧元兑美元卖出0.10 / 0.101.068292017.01.27 19:57:26已成交
交易
交易时间成交符号类型交易方向成交量价格订单佣金掉期利润余额评论
2017.01.27 19:57:11114769046余额0.000.0050 000.0050 000.00
2017.01.27 19:57:25114769085欧元兑美元买入1.001.068381312080250.000.000.0050 000.00
2017.01.27 19:57:25114769087欧元兑美元卖出卖出0.601.068291312080270.000.00-5.4049 994.60
2017.01.27 19:57:25114769088欧元兑美元卖出卖出0.301.068291312080300.000.00-2.7049 991.90
2017.01.27 19:57:26114769089欧元兑美元卖出卖出0.101.068291312080310.000.00-0.9049 991.00

作为确认,我们在 MT4 上运行相同的脚本。

经典 MT4 报告

已关闭交易:
票据打开时间类型大小项目价格S / LT / P关闭时间价格佣金税费掉期利润
1700392462017.01.27 20:00:41余额存款50 000.00
1700392872017.01.27 20:00:57买入0.60欧元兑美元1.068540.000000.000002017.01.27 20:00:571.068360.000.000.00-10.80
至 #170039289
1700392892017.01.27 20:00:57购买0.30欧元兑美元1.068540.000000.000002017.01.27 20:00:581.068360.000.000.00-5.40
至 #170039290
1700392902017.01.27 20:00:57购买0.10欧元兑美元1.068540.000000.000002017.01.27 20:00:581.068360.000.000.00-1.80
来自 #170039289

脚本日志打印输出

#170039246 2017.01.27 20:00:41 balance 0.01  0 0 0 2017.01.27 20:00:41 0 0.00 0.00 50000.00 Deposit 0
#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 (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}

OrderSelect 不起作用,无法选择订单(按索引选择票据)来使用它,附件中的简单示例,由于某些原因,它在mt5上不起作用。

附加的文件: