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

 
Vladimir Karputov:

在执行交易订单 后,出现的是一个位置,而不是一个订单!

有一些服务器,你可以重现这样的情况

PositionGetTicket(0) = 73401069 
PositionSelect(_Symbol) = true 
OrderGetTicket(0) = 73401069 
PositionsTotal() = 1
OrdersTotal() = 1, ORDER_STATE_STARTED


也就是说,我们同时 在终端有以下订单

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0


并从它的相同位置

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0
 
Vladimir Karputov:

因此,首先用语言描述你正在做什么,你想得到什么。使用 "买入交易指令 "和 "卖出交易指令 "代替ORDER。其结果是一个 "买入头寸 "或 "卖出头寸"。

好吧,让我们把讨论简化为代码中的例子。 这里是用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

int ticket1=-1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticket1=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,NormalizeDouble(Ask-100*_Point,_Digits),NormalizeDouble(Ask+100*_Point,_Digits));

   if(OrderSelect(ticket1,SELECT_BY_TICKET))
     {
      if(OrderCloseTime()>0)
        {
         int cmd=OrderType()==OP_BUY ? OP_SELL : OP_BUY;
         double tp = cmd==OP_BUY ? NormalizeDouble(Ask+100*_Point,_Digits) : NormalizeDouble(Bid-100*_Point,_Digits);
         double sl = cmd==OP_BUY ? NormalizeDouble(Ask-100*_Point,_Digits) : NormalizeDouble(Bid+100*_Point,_Digits);
         ticket1=OrderSend(_Symbol,cmd,0.1,Ask,30,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+

TS的本质:当你一开始打开一个买入订单,并记住订单的票据(在票据上工作),然后检查订单是否被关闭 - 看看是什么类型的订单,并把相反的订单,并记住票据,如此循环。

我需要在MQL5中使用SB CTrade复制一个类似的例子。

 
Igor Makanu:

好吧,让我们把讨论简化为代码中的例子,这里是用MQL4编写的代码--我对测试人员的版本感兴趣,即最少的检查等。

TS的精髓:当你一开始打开一个买入订单,并记住订单的票据(在票据上工作),然后检查订单是否被关闭 - 看看什么类型的订单,并把相反的订单,并记住票据,等等。

我需要在MQL5中使用SB CTrade复制一个类似的例子。

在这里,小鼓手将说出他对你的看法))))
 
Alexey Viktorov:
现在小鼓手将告诉你他对你的看法))))

让它说话,但我们需要知道票号是开仓还是平仓,如果是平仓,我们需要知道平仓交易订单 是什么类型

(黑体字--反正是命令!--因为在TC的头条账户中)

 
Igor Makanu:

好吧,让我们把讨论简化为代码中的例子。 我在MQL4中写了一段代码--我对Tester版本感兴趣,即检查的最小值等。

第二个OrderSend 包含一个错误。而正常化是没有必要的。在论坛上(不仅如此),代码越短越容易阅读。
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);
    }
  }

我需要一个类似的例子,在MQL5中使用CTrade SB重现。

我需要一个类似的例子,在MQL5中使用CTrade SB进行复制。

 

所以,基本的是POSITION_IDENTIFIER,但不是位置票。这一点很重要,正是因为有了网线

位置标识符

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

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

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


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


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


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

 
Vladimir Karputov:

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

在写例子的时候,要看得更 一点。

 
fxsaber:
第二个OrderSend包含一个错误。我不需要正常化。在论坛上(不仅如此),当代码较短时,更容易阅读。

是的,我明白了,我临时写的代码--在测试器中运行--它起作用了,把它复制到论坛上。


fxsaber:

你得再努力一点。

这就是我在论坛上寻求帮助的原因!- 我决定对SB CTrade的能力进行评估--我以一项初级任务为例,到目前为止,结果是否定的!


弗拉基米尔-卡尔普托夫

现在解决这个问题将变得更加容易。

我知道你是论坛的活跃成员。 你能在MQL5下使用CTrade服务器重现我的,或者说更正的fxsaber 代码吗?

 
Igor Makanu:

是的,我明白了,我临时写的代码--在测试器中运行--它起作用了,把它复制到论坛上。

当我开始写EA时,我总是从一张白纸开始(我推荐这样做)。可能最常见的是以一个带有On-functions的标题开始。

 
Igor Makanu:

这就是我在论坛上寻求帮助的原因!- 我决定评估CTrade的能力--我以一项初级任务为例,到目前为止,结果是负面的!我决定对其进行评估。

还有一个更短的例子。

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

mql5语言的特点、微妙之处以及技巧

fxsaber, 2018.02.15 11:48

OrderCloseBy(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0));

如果不是在测试器中,在MT5中很难处理这个问题。