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

 

嗯,奇怪的情况,就像我提出的话题中的活动一样,我有一个问题,从我的角度来看是具体的,但到目前为止我得到的不是答案,而是 "你为什么需要它?

我想用SB CTrade 来做,这里有一个例子(由我的两个例子汇编而成):我们在9 TF的每一个新条形图 上用一个订单打开,我们记住票据,并通过票据号码确定一个平仓订单的方向

在MQL4中,测试人员的代码看起来是这样的

//+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
input int TP = 100;
input int SL = 100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };

ENUM_TIMEFRAMES  TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
CNewbar *BAR[9];
int ticket[9];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0;i<9;i++) BAR[i]=new CNewbar(TF[i]);
   ArrayInitialize(ticket,-1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i=0;i<9;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<9;i++)
      if(BAR[i].NewBar())
        {
         if(ticket[i]<0) ticket[i]=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-SL*_Point,Ask+TP*_Point);
         if(OrderSelect(ticket[i],SELECT_BY_TICKET) && OrderCloseTime()>0)
           {
            int cmd=1-OrderType();
            double open=cmd ? Bid : Ask;
            double tp = open - (cmd ? 1 : -1) * TP * _Point;
            double sl = open + (cmd ? 1 : -1) * SL * _Point;
            ticket[i]=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
           }
        }
  }

我们需要一个测试员的代码,即在优化器中检查的数量最少,工作速度最快。

如何用SB CTrade在MQL5中编写这段代码?

 
Igor Makanu:

嗯,奇怪的情况,就像我提出的话题中的活动一样,我有一个问题,从我的角度来看是具体的,但到目前为止我得到的不是答案,而是 "你为什么需要它?

我想用SB CTrade 来做,这里有一个例子(由我的两个例子汇编而成):我们在9 TF的每一个新条形图 上用一个订单打开,我们记住票据,并通过票据号码来确定一个平仓订单的方向

在MQL4中,测试人员的代码看起来是这样的

如何使用SB CTrade在MQL5中编写此代码?

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

初学者的常见问题 MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.07.21 12:56

所以,基础是POSITION_IDENTIFIER,但不是位置票。 这很重要,只是因为有了网 子。

位置标识符

职位标识符是一个唯一的数字,它被分配给每个新开的职位,并且在其整个生命周期内不会改变。它与开仓时的订单票相对应。

仓位标识符在每个订单(ORDER_POSITION_ID)和每个开启、改变或关闭它的交易(DEAL_POSITION_ID)中被指定。使用此属性来搜索与头寸相关的订单和交易。

当一个头寸在净值模式下被逆转(一个单一的进出交易),头寸的POSITION_IDENTIFIER标识符不会改变。然而,POSITION_TICKET被改变为导致逆转的订单票。在对冲模式下,不存在头寸逆转。


因此,我们必须跟踪位置标识符(POSITION_IDENTIFIER)。


现在,一个更准确的任务:在第一次运行时,我们打开一个买入仓位并记住它(警告:我们应该记住仓位ID,而不是票据)。如果该仓位已被关闭,我们就开一个相反的仓位:例如,从前有一个买入仓位,后来被关闭,这意味着我们马上开一个卖出仓位。


现在要解决这个问题就容易多了。


 
Vladimir Karputov:

也就是说,CTrade 不知道如何独立检测一个订单是开放还是关闭? 最后一个关闭的订单的类型是什么?

我应该使用哪个图书馆来实现这一目的?

 
Igor Makanu:

即CTrade不知道如何独立检测一个订单是开放还是关闭,最后关闭的订单是什么类型?

为此,我们应该使用哪个图书馆?

我已经告诉过你一百次了,所以请把 "秩序 "这个词从你的词汇中删除。除非你这样做,否则你将无法继续前进。总之,我可能无法帮助你。这真是太糟糕了。

 
Vladimir Karputov:

好吧,我已经告诉过你一百次了--把 "授权 "这个词从你的词汇中删除。除非你做到这一点,否则你就无法继续前进。总之,我可能帮不了你。这真是太糟糕了。

好吧,告诉我你说的是什么意思。

GN      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Ticket = 20
JF      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Identifier = 0
FQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======closePosition======
HG      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD, close #20 (0.73633 / 0.73637 / 0.73633)
PH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #21  buy 0.10 AUDUSD at 0.73637 done (based on order #21)
 KJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#21  buy 0.10 AUDUSD at 0.73637]
IL      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#21  buy 0.10 AUDUSD at 0.73637]
RN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 position #20  AUDUSD [done at 0.73637]
HN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Позиция с магиком 2544113114312914, тикетом 20 и лотом 0.1 успешно закрыта.
LO      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======checkMargin======
OF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD (0.73633 / 0.73637 / 0.73633)
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #22  buy 0.10 AUDUSD at 0.73637 done (based on order #22)
 RM      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#22  buy 0.10 AUDUSD at 0.73637]
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#22  buy 0.10 AUDUSD at 0.73637]
FF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 AUDUSD [done at 0.73637]
MJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.06.19 16:00:00   balance = 11308.94
JK      0       16:24:14.030    Core 1  2018.06.19 16:00:00   lot = 0.10
HQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Ticket = 22
CJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Identifier = 20
HR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======closePosition======
FI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD, close #22 (0.74021 / 0.74025 / 0.74021)
RF      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #23  sell 0.10 AUDUSD at 0.74021 done (based on order #23)
 ID      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#23  sell 0.10 AUDUSD at 0.74021]
GM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#23  sell 0.10 AUDUSD at 0.74021]
NQ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 position #22  AUDUSD [done at 0.74021]
PO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Позиция с магиком 2544113114312914, тикетом 22 и лотом 0.1 успешно закрыта.
FO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======checkMargin======
OI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD (0.74021 / 0.74025 / 0.74021)
JO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #24  sell 0.10 AUDUSD at 0.74021 done (based on order #24)
 LM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#24  sell 0.10 AUDUSD at 0.74021]
ND      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#24  sell 0.10 AUDUSD at 0.74021]
LI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.74021]
OJ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   balance = 11335.85
DK      0       16:24:14.030    Core 1  2018.07.04 08:00:00   lot = 0.10
PN      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Ticket = 24
QE      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Identifier = 22
NR      0       16:24:14.030    Core 1  2018.07.19 00:00:00   ======closePosition======
NF      0       16:24:14.030    Core 1  2018.07.19 00:00:00   market buy 0.10 AUDUSD, close #24 (0.73968 / 0.73989 / 0.73968)
JI      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal #25  buy 0.10 AUDUSD at 0.73989 done (based on order #25)
 QK      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal performed [#25  buy 0.10 AUDUSD at 0.73989]
MM      0       16:24:14.030    Core 1  2018.07.19 00:00:00   order performed buy 0.10 at 0.73989 [#25  buy 0.10 AUDUSD at 0.73989]
PN      0       16:24:14.030    Core 1  2018.07.19 00:00:00   CTrade::OrderSend: market buy 0.10 position #24  AUDUSD [done at 0.73989]
DO      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Позиция с магиком 2544113114312914, тикетом 24 и лотом 0.1 успешно закрыта.
LP      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Очистка данных произведена.
KK      0       16:24:14.030    Core 1  2018.08.08 16:00:00   ======checkMargin======
RI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   market sell 0.10 AUDUSD (0.73933 / 0.73937 / 0.73933)
GO      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal #26  sell 0.10 AUDUSD at 0.73933 done (based on order #26)
 OM      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal performed [#26  sell 0.10 AUDUSD at 0.73933]
JD      0       16:24:14.030    Core 1  2018.08.08 16:00:00   order performed sell 0.10 at 0.73933 [#26  sell 0.10 AUDUSD at 0.73933]
QI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.73933]
HN      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Ticket = 26
CF      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Identifier = 0
 
Vladimir Karputov:

好吧,我已经告诉过你一百次了--把 "授权 "这个词从你的词汇中删除。除非你做到这一点,否则你就无法继续前进。总之,我可能帮不了你。这真是太糟糕了。

好吧,让我重新表述一下这个问题。

如何用CTrade::ResultOrder()使用记忆中的票据?

来了解一下。

1.位置是否关闭?

2.被关闭的职位有什么类型的交易?

3.我们需要同时处理9个职位、订单或票据,或...套期保值账户上的任何术语


在这样的表述中,我的问题是明确的吗?(上面发布的MQl4下的可重复的例子)

ZS:我不能忘记词序,不幸的是这个词在帮助中与其他术语一起使用:https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder

 
Igor Makanu:

嗯,这是一个奇怪的情况,我似乎提出了这个话题,我的问题从我的角度来看是具体的,但我得到的不是答案,而是 "你为什么需要它?

原因是如此应对者的无能。我花了五分钟写完它,又花了一次尝试来检查它。


MT4

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

初学者的问题 MQL5 MT5 MetaTrader 5

fxsaber, 2019.07.21 12:54

void OnTick()
  {
   static int ticket1 = -1;
   
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-100*_Point,Ask+100*_Point);

   if(OrderSelect(ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd=1-OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : -1) * 100 * _Point;
     double sl = open + (cmd ? 1 : -1) * 100 * _Point;
     ticket1=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
    }
  }


MT5

#include <Trade\Trade.mqh>

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static CTrade Trade; // Не стал возиться с Deviation.
  static ulong ticket1 = 0;
 
  if (!ticket1)
    ticket1 = Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.1, Ask, Ask - 100 * _Point, Ask + 100 * _Point) ? Trade.ResultOrder() : 0;
  else if (!PositionSelectByTicket(ticket1) && HistorySelectByPosition(ticket1))
  {
    ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);
    double open = cmd ? Bid : Ask;
    double tp = open - (cmd ? 1 : -1) * 100 * _Point;
    double sl = open + (cmd ? 1 : -1) * 100 * _Point;
    ticket1 = Trade.PositionOpen(_Symbol, cmd, 0.1, open, sl, tp) ? Trade.ResultOrder() : 0;
  }
}


你不需要是一个强大的精通者来写这个,你只需要知道MT5的基础知识。


ZS 在确定封闭位置的类型方面,有一点细微的差别。但它在这里并没有起到作用。

 
fxsaber:

你不需要很强壮来写这个,你只需要知道MT5的基本知识。

谢谢你!

是的,我正在寻找一个解决方案,如果我不能用SB写成五行的话

但我是如何理解的,一个SB CTrade不能解决我的问题? 我还必须使用CPositionInfo?- 如果我想在同一时间由几个TF陪伴9个位置?

ZS:我坐在MQL5的帮助下与智能电视 - 相当好的描述贸易功能,SatB的使用是在一个问题....我认为将SB用于原始策略是有意义的,有点复杂--功能不足或使用不明显,也许我需要更多的练习--我将尝试 "扭曲 "SB。


再次感谢!

 
fxsaber:

原因是无能,所以回答。我花了五分钟来写,并尝试检查了一次。


MT4


MT5


你不需要是一个强大的精通者来写这个,你只需要知道MT5的基础知识。


你不需要知道基础知识,你只需要知道基本的MT5基础知识。但这在这里并不重要。

这是

ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);

有一个潜在的陷阱。

在历史清单中,认股权证并没有按照它们在该清单中出现的顺序排列。在开发图书馆时偶然发现了这个问题。 我依靠的是它。但事实证明,这并不那么简单。试着按以下顺序依次设置限价止损单:限价->止损->限价->止损->限价->止损,并在任何订单中分别删除,看看哪个订单是历史列表中的最后记录。你将会感到惊讶。

 
Artyom Trishkin:

这是在

有一个潜在的错误。

在历史列表中,订单没有按照它们在列表中出现的顺序排列。我在开发这个库的时候遇到了这个问题。 我依靠的是它。但事实证明,这并不那么简单。试着按以下顺序依次设置限价止损单:限价->止损->限价->止损->限价->止损,并在任何订单中分别删除,看看哪个订单是历史列表中的最后记录。你将会感到惊讶。

那里没有错误,因为列表是通过HistorySelectByPosition生成的。