初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1054

 

Igor Makanu:

标准CTrade不提供开箱即用的服务

在MT4平台上,有一些交易事项是 一行编码的。在MT5上,你不能通过SB做同样的事情,即使是一百行。在纯MQL5上,情况甚至更糟。这很好。

 

谢谢,很好的例子,我会研究的,这里有一个MT4的脚本--以点数确定利润。

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

我在10分钟内从头开始写?- 嗯,关于这一点,逻辑是简单明了的--你拿去写,在MT5中,到目前为止,我们只讨论真空中的球形马......如果交易和是否有订单,留下讨论账户净值或对冲的类型....。我们会在早上写一些东西。

 
Igor Makanu:

谢谢你,很好的例子,我将研究它,我为MT4做了一个脚本--以点来确定利润

我不需要告诉你如何在MT5中运行这个脚本。然而,该脚本本身有错误。

首先,我将向你展示历史

和执行的结果

Прибыль последнего закрытого ордера -259 пунктов


这里有错误

int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++) // Надо бежать в обратную сторону, т.к. последняя позиция может быть закрыта в ту же секунду, что и предпоследняя.
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t) // В отличие от MT4, в MT5 это можно не делать - сортировка по времени закрытия есть.
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point); // При таком вычислении легко потерять один пункт.
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
 
fxsaber:

还有这里的错误。

При таком вычислении легко потерять один пункт.

我从来没有想过这个问题,这个计划似乎是标准的:2个价格--找到差额并除以点数。

我同意其他的观点,但我需要思考,顺序搜索的方案是经典的,我想把时间与最高....,以防万一。我需要考虑一下,虽然这是我第一次这样做 - 99.99%的情况下,甚至没有人试图在MT4上交易hft TS。

 
Igor Makanu:

我从来没有想过这个问题,这个计划似乎是标准的:2个价格--找到差异并除以点数

铸造double->int时的损失。

我同意其他的观点,但我需要思考,执行命令的方案很经典,我想比较一下最....,以备不时之需。我需要考虑一下,虽然这是我第一次这样做 - 在99.99%的情况下,甚至没有人尝试在MT4上交易hft TS。

HFT与此毫无关系。CloseAll脚本很可能在一秒钟内关闭两个头寸。在MT4中你必须进行比较,在MT5中则没有必要。而且,通过ArraySort进行比较可能更容易(例如,如果你想快速改变到倒数第二个封闭位置)。

 
fxsaber:

铸造double->int时的损失。

这一切都很清楚,但我如何正确计算两个价格的整数点之差?

 
Igor Makanu:

这些都很清楚,但我如何计算2个价格之间的点差?

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

需要帮助计算今天关闭订单的总点数(Mql5)。

fxsaber, 2017.10.25 01:00

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

int PriceToInteger( const double Price, const double point )
{
  return((int)(Price / point + 0.1));
}

int GetTotalPips( const datetime From = 0 )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      if (OrderCloseTime() < From)
        break;
      else if (OrderType() <= OP_SELL)
      {
        const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
        
        Res += OrderType() ? PriceToInteger(OrderOpenPrice(), point) - PriceToInteger(OrderClosePrice(), point)
                           : PriceToInteger(OrderClosePrice(), point) - PriceToInteger(OrderOpenPrice(), point);
      }
        
  return(Res);
}

void OnStart()
{
  datetime Today = TimeCurrent();
  
  Today -= Today % PeriodSeconds(PERIOD_D1);
  
  Alert(GetTotalPips(Today));
}
 
fxsaber:

谢谢你!

我特别喜欢它。

const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);

我会记住这一点的,我通常把所有的东西都写在全局可见性中,你的例子读起来要好很多。


....


在订单循环中,SymbolInfoDouble(OrderSymbol(),SYMBOL_POINT);会不会每次都被重新计算,因为OrderSymbol()每次都不同?

 

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

初学者的问题 MQL5 MT5 MetaTrader 5

Igor Makanu, 2019.06.04 18:43

谢谢,很好的例子,我会研究的,这是我为MT4起草的一个脚本--以点来确定利润。

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

10分钟内从头开始写?- 嗯,大约是这样,逻辑简单明了--你拿去写吧,在MT5中我们讨论的只是真空中的球形马......如果交易和是否有订单,留下讨论账户净值或对冲的类型....。我们会在早上写一些东西。

我想问一下,为什么我们要取开盘价和收盘价之差的绝对值,然后,如果头寸的利润小于零,就用减号来代替这个值。
 
Alexey Viktorov:
那请问为什么我们要取开盘价和收盘价之差的绝对值,然后,如果该头寸的利润小于零,就用减号来代替该值。

我随心所欲地写了它--我想输出+100点或-100点,这是一个品味问题--我没有具体的任务,但要写条件来确定订单类型并比较开盘价收盘价,似乎会有太多的额外行......

ZS:这是一个程序员的论坛,不是吗?- 他们就是这样,他们可以把一段代码(尤其是别人的)优化10倍,用4行来代替5行))。