FORTS:帮助初学者 - 页 5

 
Mikhail Filimonov:

经常使用和有用的功能

重新设计了GetPositionPrice()函数。

这个函数显示了错误的结果,或者说是错误的结果。我研究了一下,发现在调头时(即在进/出交易期间),头寸ID并没有改变,正如文件中描述的那样。

https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties

仓位逆转将其ID改为导致逆转的订单票。

如果出现逆转,你的GetPositionPrice可以堆积2个或更多相反方向的头寸,并为它们计算出一个平均价格。这样的头寸平均价格是没有实际作用的。

那么,仓位ID在逆转时是否会改变?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
转动时位置号不会改变
 
如何从进/出场交易中分辨出哪个交易量关闭了之前的头寸,哪个交易量打开了新头寸?
 
igorbel:
你怎么能从一个进出交易中看出哪个交易量关闭了之前的头寸,哪个交易量打开了新的头寸?
你可以把它与当前的开放进行比较。但最好是通过它的id来检查位置的历史,当你翻转它时,它不会改变...买/卖量来帮助。
 
Dennis Kirichenko:
它可以与当前的开放位置进行比较。但最好是通过它的id来考察历史上的位置,当位置颠倒时,它不会改变......。买/卖量来帮助。

最近,当你转身时,位置标识会发生变化。这方面的文件已经更新....

位置标识符

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

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

仓位的逆转将其标识符改为导致逆转的订单票。

 
Dennis Kirichenko:
你可以把它与目前的开放进行比较。但最好是通过id来检查历史上的位置,在逆转过程中不会发生变化......。买/卖量来帮助。

这根本就不是一个选项。之前的头寸也可能因为反转等原因而被打开。这可能是一个选择,但显然不是一个最佳选择。

 
Andrey Barinov:

最近,当你转身时,位置标识会发生变化。这方面的文件已经更新....

位置标识符

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

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

仓位的逆转将其标识符改为导致逆转的订单票。

它是这样写的,但实际上没有什么变化。

如果你喜欢,我的代码。

long pos_id1,pos_id2,pos_id3;
   ulong deal1_ticket=xxx;
   ulong deal2_ticket=xxx;
   ulong deal3_ticket=xxx;
   if(!HistoryDealSelect(deal1_ticket))
      Print(__FUNCTION__+": deal 1 not selected. Error=",GetLastError());   
   pos_id1=HistoryDealGetInteger(deal1_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal1_ticket,", position ID=",pos_id1);
   if(!HistoryDealSelect(deal2_ticket))
      Print(__FUNCTION__+": deal 2 not selected. Error=",GetLastError());
   pos_id2=HistoryDealGetInteger(deal2_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal2_ticket,", position ID=",pos_id2);
   if(!HistoryDealSelect(deal3_ticket))
      Print(__FUNCTION__+": deal 3 not selected. Error=",GetLastError());
   pos_id3=HistoryDealGetInteger(deal3_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal3_ticket,", position ID=",pos_id3);

其中deal2_ticket是进/出交易票,deal1_ticket是进/出交易前的票,deal3_ticket是进/出交易后的票。在这三种情况下,我都得到了相同的位置标识。

 
igorbel:

它是这么说的,但实际上没有任何变化。

如果你喜欢,我的代码。

其中deal2_ticket是进/出交易票,deal1_ticket是进/出交易前的票,deal3_ticket是进/出交易后的票。在这三种情况下,我都得到了相同的位置标识。

我的正在改变。在最新的1340版本上进行尝试。
 
igorbel:
那么我们如何从一个进场/出场交易中确定哪个交易量关闭了前一个仓位,哪个仓位打开了新的仓位?

该专家顾问在净值账户上以 "历史调试 "模式运行。这个例子有点粗糙,因为它计算出在交易历史中只有一个 "IN/OUT "类型的交易。

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
CTrade my_trade;
long deal_positions_id_in_out=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static int t=0;
   if(t==20)
     {
      my_trade.Buy(0.02);
     }
   if(t==25)
     {
      my_trade.Buy(0.01);
     }
   if(t==30)
     {
      my_trade.Sell(0.07);
     }
   if(t==40)
     {
      my_trade.PositionClose(Symbol());
     }
   if(t==50)
     {
      //--- request trade history 
      HistorySelect(0,TimeCurrent());
      long     deal_positions_id=0;
      double   deal_volume=0;
      long     deal_entry=0;
      long     deal_type=0;
      ulong    ticket=0;
      for(int i=0;i<HistoryDealsTotal();i++)
        {
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_positions_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
            deal_volume=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            deal_entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
            deal_type=HistoryDealGetInteger(ticket,DEAL_TYPE);
            if(deal_entry==DEAL_ENTRY_INOUT)
               deal_positions_id_in_out=deal_positions_id;
            Print("DEAL_POSITION_ID ",deal_positions_id,
                  ", DEAL_VOLUME ",DoubleToString(deal_volume,2),
                  ", DEAL_ENTRY ",EnumToString((ENUM_DEAL_ENTRY)deal_entry),
                  ", DEAL_TYPE ",EnumToString((ENUM_DEAL_TYPE)deal_type));
           }
        }
     }
   if(t==55)
     {
      //--- request trade history 
      HistorySelect(0,TimeCurrent());
      long     deal_positions_id=0;
      double   deal_volume=0;
      long     deal_entry=0;
      long     deal_type=0;
      ulong    ticket=0;
      double   volume_in=0;
      double   volume_out=0;
      for(int i=0;i<HistoryDealsTotal();i++)
        {
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_positions_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
            deal_volume=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            deal_entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
            deal_type=HistoryDealGetInteger(ticket,DEAL_TYPE);
            if(deal_positions_id==deal_positions_id_in_out && deal_entry==DEAL_ENTRY_IN)
               volume_in+=deal_volume;
            else if(deal_positions_id==deal_positions_id_in_out && deal_entry==DEAL_ENTRY_INOUT)
               volume_out=deal_volume;
           }
        }
      Print("DEAL_POSITION_ID ",deal_positions_id_in_out,
            ": volume in ",DoubleToString(volume_in,2),", volume out ",DoubleToString(volume_out,2));
     }
   t++;
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+

首先,在所有已执行的交易和完成平仓后,所有交易的描述都会显示出来(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY,DEAL_TYPE),在此基础上,IN/OUT类型的交易的DEAL_POSITION_ID被记住。

然后,它再次浏览历史记录,并对具有DEAL_POSITION_ID的交易的所有条目进行汇总。

我们得到的东西是这样的。

10:58:23.963    Test (EURUSD,H1)        2016.01.04 00:06:42   CTrade::OrderSend: instant buy 0.04 EURUSD at 1.08732 [done at 1.08732]
10:58:30.692    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 0, DEAL_VOLUME 0.00, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BALANCE
10:58:30.784    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.02, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BUY
10:58:32.074    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.01, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BUY
10:58:33.826    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.07, DEAL_ENTRY DEAL_ENTRY_INOUT, DEAL_TYPE DEAL_TYPE_SELL
10:58:37.237    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 4, DEAL_VOLUME 0.04, DEAL_ENTRY DEAL_ENTRY_OUT, DEAL_TYPE DEAL_TYPE_BUY
10:59:07.397    Test (EURUSD,H1)        2016.01.04 00:07:19   DEAL_POSITION_ID 2: volume in 0.03, volume out 0.07
附加的文件:
Test.mq5  5 kb
 
Andrey Barinov:
对我来说,它正在改变。在最新的Build 1340上试试。
这就是我所尝试的。你在什么市场上改变?
原因: