オープンポジションをグループ分けする - ページ 6

 
アドバイザーが、あるグループのカーストを別のカーストに変更できる機能を追加しました。
//+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//array_base[][observations] основная база, в которой нужно провести изменения
//array_change[]             массив с тикетами позиций, касту которых нужно изменить
//array_change[]             номер касты, к которой нужно приписать позиции
//+------------------------------------------------------------------+
int Transfer_Positions_Specified_Caste_by_Tickets(int &array_base[][observations], 
                                                  int &array_change[], 
                                                  int new_caste){
int size_change = ArraySize (array_change);
int size_base   = ArrayRange(array_base,0);

   for(int i=0; i<size_change; i++){
      int ticket_change = array_change[i];
      for(int a=0; a<size_base; a++){
         if(array_base[a][0] == ticket_change ||
            array_base[a][1] == ticket_change){
            array_base[a][2]  = new_caste;
            break;}}}    
   ArrayFree(array_change);
       
return(size_change);
}
//+------------------------------------------------------------------+
 

こんばんは。プロの意見を聞いてみたい。

以下のような作業を行う場合、どのような機能を使用するのが良いのかご教示ください。

私は(注文なしで市場から)いくつかのポジションを開き、すぐにそれらのチケットを配列に配置する必要があります。

難しいのは、これらのチケットを取得することです。私は、(MT4のように)ポジションを開き、チケットでそれを返す関数を見つけられませんでした。

ループ、パラメータなどで取引を開くだけ - 質問なし、しかし、チケットを取得するには、ちょうどポジションを開く、NOT HAVE!

アドバイスお願いしますplz

なんとなく、こんな感じです。

チケット=Function.Open Position(Buy, 0.01, ......).

 
Sergey Voytsekhovsky:

ポジションをオープン し、チケットをリターンする(MT4と同様)。

.................................でも、オープンしたばかりのポジションのチケットを手に入れるには、必要!!!!

アドバイスをお願いします。

思い立ったら、最後のオープンポジションのチケットしかリクエストできない。しかし、なぜか不器用で、あまりにも曖昧で、コードでの注文とオープンポジションの間に直接的なつながりがないように思えます。もっと正しい方法があるはずですが、どなたかアイデアをお持ちの方、あるいは十分な経験をお持ちの方、教えてください。

 
Sergey Voytsekhovsky:

履歴の最後のオープンポジションのチケットをリクエストすることくらいしか思いつきません。しかし、なぜか不器用な感じがします。あまりにもあいまいで、コード内の注文とオープンポジションの間に直接的なつながりがないのです。もっと正しい方法があるはずですが、どなたかアイデアをお持ちの方、あるいは十分な経験をお持ちの方は、教えてください。

これらのことは、これまでにも記事で紹介してきました。mql5とmql4については、すべてそこで行われます。アイデアを形にし、機能を作ることができる。

しかしポジション識別子が書き込まれたトランザクションがあります。ディールとそのプロパティについては、ドキュメントをお読みください。

 
Sergey Voytsekhovsky:

こんばんは。プロの意見を聞いてみたい。

以下のような作業を行う場合、どのような機能を使用するのが良いのかご教示ください。

私は(注文なしで市場から)いくつかのポジションを開き、すぐにそれらのチケットを配列に配置する必要があります。

難しいのは、これらのチケットを取得することです。私は、(MT4のように)ポジションを開き、チケットでそれを返す関数を見つけられませんでした。

ループ、パラメータなどで取引を開くだけ - 質問なし、しかし、チケットを取得するには、ちょうどポジションを開く、NOT HAVE!

アドバイスお願いしますplz

なんとなく、こんな感じです。

チケット=Function.Open Position(Buy, 0.01, ......).

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
   {
    ulong ticket = trans.position; // тикет позиции
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
      {
      }
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)// закрылась позиция
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP)
     }
   }
 }
 
Artyom Trishkin:

すべて記事で記述しています。mql5とmql4については、すべてそこで行われます。アイデア次第で、機能を実現できる。

しかしポジション識別子が書かれている案件がありますね。ディールとそのプロパティについては、ドキュメントをお読みください。

ありがとうございます!調査してみます。

 
Alexey Viktorov:

素晴らしい、これはもうやるしかないですね:-)。私も解決して、その結果を必ず投稿します。もしかしたら、他の誰かの役に立つかもしれません。

 
Sergey Voytsekhovsky:

素晴らしい、これはもうやるしかないですね:-)。私も解決して、その結果を必ず投稿します。もしかしたら、他の誰かの役に立つかもしれません。

知らない人はほとんどいないでしょう。そして、知らない人はこのスレッドを読んだらできるようになるはずです。できないなら、王様には関係ない...。をつつく。

 
Artyom Trishkin:

すべて記事で記述しています。mql5とmql4については、すべてそこで行われます。アイデア次第で、機能を作ることができます。

ありがとうございます、具体的にはどの記事で?そんなにたくさんあるんですね......。

 

こんにちは。

今回もこの掲示板の達人たちに訴えます。

小さな関数を書きました。効果はありますが、非常にゆっくりです。アルゴリズムが非常に非効率的であることは理解しています。ここで読みました。

https://www.mql5.com/ru/articles/567

配列の末尾に追加する関数が あること。

使い方がよくわからない、想像力を取り戻すために、興味のあるところを色分けしてあげるので、よろしくお願いします。

//+------------------------------------------------------------------+
//| Заполняем структуру своих позиций
//+------------------------------------------------------------------+
int Fill_Position_Structure(int kodclana)
{
   int n = 0;
   if(!Refresh_Rates())return(false);
   int SizeTotalPosition = PositionsTotal();
   int SizeArrayPosition = ArraySize(ArrayPosition);
//---Запись новых позиций в структуру        
   for(int i=0; i < SizeTotalPosition; i++)
      {//---Из списка открытых позиций выбираю очередную, предполагаю что она НОВАЯ, определяю ее ВремяЖизни, 
       //----проверяю есть ли она в массиве позиций, если есть, значит СТАРАЯ, обновляю ВремяЖизни, считаю, выхожу. 
         bool  new_pos  = true;
         ulong ticket   = PositionGetTicket(i);
         int   lifetime = DatetimeToInteger(TimeCurrent() - m_position.Time());
         SizeArrayPosition = ArraySize(ArrayPosition);
         for(int y = 0; y < SizeArrayPosition; y++)
            {
               if(ArrayPosition[y].ticket_pos == ticket)
                  {
                     ArrayPosition[y].lifetime_candle = lifetime/60*_Period;
                     ArrayPosition[y].lifetime_sek    = lifetime;
                     ArrayPosition[y].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
                     new_pos = false;
                     n++;
                     break;
                  }
            }
         if(new_pos)
            {//---Если НОВАЯ, забиваю позицию в массив со всеми параметрами
               ArrayResize(ArrayPosition, SizeArrayPosition+1, 1);
               ArrayPosition[SizeArrayPosition].lifetime_candle = lifetime/60*_Period;
               ArrayPosition[SizeArrayPosition].lifetime_sek    = lifetime;
               ArrayPosition[SizeArrayPosition].ticket_pos      = ticket;
               ArrayPosition[SizeArrayPosition].kod_clana       = kodclana;
               ArrayPosition[SizeArrayPosition].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
               ArrayPosition[SizeArrayPosition].type            = m_position.PositionType();
               n++;
            }
      }   
//---Удаление закрытых позиций из структуры  
      SizeArrayPosition = ArraySize(ArrayPosition);
      SizeTotalPosition = PositionsTotal();
      
      for(int z = 0; z < SizeArrayPosition; z++)
         {
            ulong ticket_cl   = ArrayPosition[z].ticket_pos;
            bool  cl_position = true;
            
            for(int i = 0; i < SizeTotalPosition; i++)
               {
                  if(ticket_cl == PositionGetTicket(i))
                     {
                        cl_position = false;
                        n++;
                        break;
                     }
                }
            if(cl_position)
               {
               ArrayRemove(ArrayPosition,z,1);
               Sleep(SLEEPTIME*slp);
               SizeArrayPosition = ArraySize(ArrayPosition);
               }
         }
return(n);
}