将开放的职位分成若干组 - 页 10

 

我把它放在那里,让公众来评判。虽然我还没有附上任何支票,但我想它们应该可以发挥作用。

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)// Открылась позиция
            {
               if(PositionSelectByTicket(trans.position))
                  {
                     int SizeArrayPosition = ArraySize(ArrayPosition);
                     ArrayResize(ArrayPosition,SizeArrayPosition+1);
                        
                        ArrayPosition[SizeArrayPosition].kod_clana                      = 0;
                        ArrayPosition[SizeArrayPosition].open_price                     = trans.price;
                        ArrayPosition[SizeArrayPosition].ticket_position                = trans.position;
                        ArrayPosition[SizeArrayPosition].identi_position                = PositionGetInteger(POSITION_IDENTIFIER);
                        ArrayPosition[SizeArrayPosition].open_tyme            = (datetime)PositionGetInteger(POSITION_TIME);
                        ArrayPosition[SizeArrayPosition].type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
                        
                     Print("\n"
                     "Открылась новая позиция: ticket = ",ArrayPosition[SizeArrayPosition].ticket_position);
                  }
            }
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == (DEAL_ENTRY_OUT || DEAL_ENTRY_OUT_BY))// Закрылась позиция
            {
               int SizeArrayDealOut = ArraySize(ArrayDealOut);
               ArrayResize(ArrayDealOut,SizeArrayDealOut+1);
               ArrayDealOut[SizeArrayDealOut].ticket_position_out = trans.position;
               ArrayDealOut[SizeArrayDealOut].identi_position_out = HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);
            }          
      }
  }

而在OnTick的某处:DelitClosePositionFromArrayPosition()。

//+------------------------------------------------------------------+
//| Удаляем закрытые позиции из массива структуры
//+------------------------------------------------------------------+
int DelitClosePositionFromArrayPosition()
{
   int n = 0;
   if(!Refresh_Rates())return(false);
//---Удаление закрытых позиций из структуры  
   int SizeArrayDealOut  = ArraySize(ArrayDealOut);
   int SizeArrayPosition = ArraySize(ArrayPosition);
   if(SizeArrayDealOut > 0)
      {
         for(int i = SizeArrayDealOut+1; i > 0; i--)
            {
               for(int y = SizeArrayPosition+1; y > 0; y--)
                  {
                     if(ArrayPosition[y].identi_position == ArrayDealOut[i].identi_position_out)
                        {
                           if(ArrayRemove(ArrayPosition,y,1) && ArrayRemove(ArrayDealOut,i,1))
                              {
                                 SizeArrayDealOut  = ArraySize(ArrayDealOut);
                                 SizeArrayPosition = ArraySize(ArrayPosition);
                                 n++;
                                 break;
                              }
                        }
                  }
            }
      }            
return(n);
}
 

下午好,我再一次恳求。第二天,我不明白为什么这段代码不工作了

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         Print("Зашла сделка ########## ",trans.position," ###########");
         
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)// Открылась позиция
            {
               if(PositionSelectByTicket(trans.position))
                  {
                     int SizeArrayPosition = ArraySize(ArrayPosition);
                     ArrayResize(ArrayPosition,SizeArrayPosition+1);
                        
                        ArrayPosition[SizeArrayPosition].kod_clana                         = 0;
                        ArrayPosition[SizeArrayPosition].open_price                        = trans.price;
                        ArrayPosition[SizeArrayPosition].ticket_position                   = trans.position;
                        ArrayPosition[SizeArrayPosition].identi_position                   = PositionGetInteger(POSITION_IDENTIFIER);
                        ArrayPosition[SizeArrayPosition].open_tyme               = (datetime)PositionGetInteger(POSITION_TIME);
                        ArrayPosition[SizeArrayPosition].type_position = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
                        ArrayPosition[SizeArrayPosition].StopLoss                          = trans.price_sl;
                        ArrayPosition[SizeArrayPosition].TakeProfit                        = trans.price_tp;
                        
                       
                        Print("Открыта позиция +++ ",trans.position," +++ записана в структуру ArrayPosition ++++++++++++++");        

                  }
            }
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) != DEAL_ENTRY_IN)
            {
               Print("Закрыта позиция --- ",trans.position," --- записана в структуру ArrayDealOut ------------");
            }
      }
  }

打印 "Deal entered.... "很顺利,然后应该有一个分叉,一些交易"Open position .... "被打印出来,但所有其他交易(这些是通过TakeProfit关闭头寸 的交易)没有被打印

我不明白问题出在哪里。我将在下面用颜色标出损失的交易。

2020.04.12 11:27:33.103 Core 1  2018.01.02 18:54:00   CTrade::OrderSend: market buy 0.01 EURUSD tp: 1.20621 [done at 1.20574]
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:54:00   Зашла сделка ########## 1042 ###########
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:54:00   Открыта позиция +++ 1042 +++ записана в структуру ArrayPosition ++++++++++++++
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:54:00   Зашла сделка ########## 1043 ###########
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:54:00   Открыта позиция +++ 1043 +++ записана в структуру ArrayPosition ++++++++++++++
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:55:43   take profit triggered #1039  sell 0.01 EURUSD 1.20579 tp: 1.20532 [#1044  buy 0.01 EURUSD at 1.20532]
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:55:43   deal #1044  buy 0.01 EURUSD at 1.20527 done (based on order #1044)
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:55:43   deal performed [#1044  buy 0.01 EURUSD at 1.20527]
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:55:43   order performed buy 0.01 at 1.20527 [#1044  buy 0.01 EURUSD at 1.20532]
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:55:43   Зашла сделка ########## 1039 ###########
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:56:30   take profit triggered #1042  sell 0.01 EURUSD 1.20571 tp: 1.20523 [#1045  buy 0.01 EURUSD at 1.20523]
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:56:30   deal #1045  buy 0.01 EURUSD at 1.20523 done (based on order #1045)
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:56:30   deal performed [#1045  buy 0.01 EURUSD at 1.20523]
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:56:30   order performed buy 0.01 at 1.20523 [#1045  buy 0.01 EURUSD at 1.20523]
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:56:30   Зашла сделка ########## 1042 ###########
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:57:00   На символе EURUSD открылся новый бар в 2018.01.02 18:57
2020.04.12 11:27:33.103 Core 1  2018.01.02 18:57:00   market sell 0.01 EURUSD tp: 1.20458 (1.20507 / 1.20509 / 1.20507)

所以它就像SOS !!!

 
Alexey Viktorov:

Alexey,这只是指OnTradeTransaction 事件的处理。

一个事件发生了,一个关闭头寸的交易已经被执行。此刻,这个位置已经不在了。你可以通过选择一个订单和交易的列表 来确认(代码中没有这样的列表),并阅读

请注意,我们谈论的是一个Hedge账户,该账户的头寸通常只有两个订单和两个交易。

下午好,如果不麻烦你的话,你在这个帖子里准确地描述了一切。我上面的两个帖子,我是想得到我需要的结果--承诺平仓。我还是不明白。

请告诉我,我哪里有错误或缺陷?????。

 
而这种方式根本就没有区别,所以事实证明,在TakeProfit上平仓也符合DEAL_ENTRY_IN 的要求?
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         Print("Зашла сделка ########## ",trans.position," ###########");
         
            if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)// Открылась позиция
               {
                  Print("Открыта позиция +++ ",trans.position," +++ записана в структуру ArrayPosition ++++++++++++++");        
               }
            if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) != DEAL_ENTRY_IN)
               {
                  Print("Закрыта позиция --- ",trans.position," --- записана в структуру ArrayDealOut ------------");
               }
      }
  }


2020.04.12 12:10:27.368 Core 1  2018.01.03 04:58:00   CTrade::OrderSend: modify position #1252  EURUSD (sl: 0.00000, tp: 0.00000) [done]
2020.04.12 12:10:27.368 Core 1  2018.01.03 04:59:38   take profit triggered #2540  sell 0.01 EURUSD 1.20473 tp: 1.20425 [#2676  buy 0.01 EURUSD at 1.20425]
2020.04.12 12:10:27.368 Core 1  2018.01.03 04:59:38   deal #2676  buy 0.01 EURUSD at 1.20425 done (based on order #2676)
2020.04.12 12:10:27.368 Core 1  2018.01.03 04:59:38   deal performed [#2676  buy 0.01 EURUSD at 1.20425]
2020.04.12 12:10:27.368 Core 1  2018.01.03 04:59:38   order performed buy 0.01 at 1.20425 [#2676  buy 0.01 EURUSD at 1.20425]
2020.04.12 12:10:27.368 Core 1  2018.01.03 04:59:38   Зашла сделка ########## 2540 ###########
2020.04.12 12:10:27.368 Core 1  2018.01.03 04:59:38   Открыта позиция +++ 2540 +++ записана в структуру ArrayPosition ++++++++++++++
2020.04.12 12:10:27.368 Core 1  2018.01.03 04:59:40   take profit triggered #2473  sell 0.01 EURUSD 1.20472 tp: 1.20424 [#2677  buy 0.01 EURUSD at 1.20424]

 
Sergey Voytsekhovsky:
这样一来,根本就没有分离,事实证明,在TakeProfit关闭头寸也符合 DEAL_ENTRY_IN 的要求

在我看来,对OnTradeTransaction事件的处理已经做了一些改变。

尝试将TRADE_TRANSACTION_DEAL_ADD替换为TRADE_TRANSACTION_HISTORY_ADD

 
Alexey Viktorov:

在我看来,OnTradeTransaction事件的处理有了一些变化。

尝试将TRADE_TRANSACTION_DEAL_ADD替换为TRADE_TRANSACTION_HISTORY_ADD

没有帮助。谢谢你的反馈。

 
Alexey Viktorov:

在我看来,对OnTradeTransaction事件的处理做了一些改变。

尝试将TRADE_TRANSACTION_DEAL_ADD替换为TRADE_TRANSACTION_HISTORY_ADD

交易开仓 被打印出来,也就是说,这个选择是有效的。但不清楚如何选择交易--平仓,尽管它们在终端交易的列表中是可见的(总是高出几行/三行)。

 

我会从头开始尝试,因为我的脑子已经乱了。正如那部经典电影所说--"谁会像这样建造.....????"。

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {

   if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)
      {
         Print("Торговая транзакция = Добавление сделки в историю ######### Тикет сделки # ",trans.deal," ###########");
  
      }
  }

一笔交易,但还没有交易单。我理解得对吗?

2020.04.12 14:14:19.287 Core 1  2018.01.02 13:15:00   deal performed [#405  buy 0.01 EURUSD at 1.20646]
2020.04.12 14:14:19.287 Core 1  2018.01.02 13:15:00   order performed buy 0.01 at 1.20646 [#405  buy 0.01 EURUSD at 1.20646]
2020.04.12 14:14:19.287 Core 1  2018.01.02 13:15:00   CTrade::OrderSend: market buy 0.01 EURUSD tp: 1.20694 [done at 1.20646]
2020.04.12 14:14:19.287 Core 1  2018.01.02 13:15:00   Торговая транзакция = Добавление сделки в историю #########  Тикет сделки # 0 ###########
2020.04.12 14:14:19.287 Core 1  2018.01.02 13:15:00   Торговая транзакция = Добавление сделки в историю #########  Тикет сделки # 0 ###########
2020.04.12 14:14:19.287 Core 1  2018.01.02 13:16:02   take profit triggered #394  sell 0.01 EURUSD 1.20675 tp: 1.20627 [#406  buy 0.01 EURUSD at 1.20627]
2020.04.12 14:14:19.287 Core 1  2018.01.02 13:16:02   deal #406  buy 0.01 EURUSD at 1.20627 done (based on order #406)
2020.04.12 14:14:19.287 Core 1  2018.01.02 13:16:02   deal performed [#406  buy 0.01 EURUSD at 1.20627]
 
Sergey Voytsekhovsky:

交易开仓 被打印出来,也就是说,这个选择是有效的。但如何选择交易--平仓--并不清楚,尽管它们在终端的交易列表中是可见的(总是高出几行/三行)。

试着按下蓝色按钮传入调试器。


预先设定的断点,并检查数值的位置和预期的数值是什么。好吧,我似乎没有看到任何错误,所以我必须检查,因此写下开仓,调整止损,这样我就不用等很久才能关闭......

 
Sergey Voytsekhovsky:

我会从头开始尝试,因为我的脑子已经乱了。正如那部经典电影所说--"谁会像这样建造.....????"。

有一笔交易,但还没有交易单。我没看错吧?

我根本就不明白什么。以下是我运行中的EA的一段代码

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)
   {
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)
     {
      if(PositionSelectByTicket(trans.position && PositionGetString(POSITION_SYMBOL) == _Symbol) && PositionGetInteger(POSITION_MAGIC) == magick)
       {
        if(HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)))
         {
          double priceGrid = HistoryOrderGetDouble(HistoryOrderGetTicket(0), ORDER_PRICE_OPEN);
          if(priceGrid == 0)
            DebugBreak();

而且它从来没有在DebugBreak() 上停止过;所以一切工作都没有任何问题。

显然,你有一个订单被添加到历史中,你在等待一张交易单。