オープンポジションをグループ分けする - ページ 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);
}
 

こんにちは、今回もお願いします。2日目 なぜこのコードが動作しないのか理解できない

//+------------------------------------------------------------------+
//| 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 イベントの処理にのみ関連しています。

イベントが発生し、ポジションを閉じる取引が実行されました。この瞬間、すでにポジションはなくなっている。これは、注文と案件のリストを選択 し(コード内にそのようなリストはありません)、読み取ることで確認できます。

そして、私たちは、ポジションが通常2つの注文と2つの取引しかないハッジ口座について話していることに注意してください。

こんにちは、ご迷惑でなければ、この投稿ですべてを的確に表現されていますね。上の2つの投稿で、私は必要な結果を得ようとしています-ポジションを閉じることを約束すること。やっぱり無理です。

どこに間違いや欠陥があるのか、ご指摘ください。

 
そして、この方法では、全く区別がないので、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に置き換えてみてください。

取引開始位置が 印刷される、つまりこの選択は有効です。しかし、取引-決済ポジションは端末の取引リスト(常に2~3行上)に表示されているにもかかわらず、どのように選択するのかが不明です。

 

もう頭の中がぐちゃぐちゃなので、最初からやってみることにします。映画の名作にあったように、「こんなの誰が作るんだ......?

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:

取引開始位置が 印刷される、つまりこの選択は有効です。しかし、端末の取引一覧(常に2~3行上)に表示されているにもかかわらず、取引(終値)を選択する方法は明確ではありません。

青いボタンを押して、デバッガーを通過させてみてください。


あらかじめ設定されたブレークポイントで、どこにどんな値があるのか、どんな値が期待されているのかを確認します。OK、エラーは出ていないようなので、チェックして、それ故にオープンポジションを書き、クローズまで長く待つ必要がないようにストップを調整する必要があります...。

 
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();で停止することもなく、すべて問題なく動作しています。

どうやら注文が履歴に追加され、トレードチケット待ちの状態になっているようですね。