Einteilung der offenen Stellen in Gruppen - Seite 6

 
Es wurde eine neue Funktion hinzugefügt, mit der der Berater die Kaste einer Gruppe von Positionen in eine andere Kaste ändern kann.
//+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//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);
}
//+------------------------------------------------------------------+
 

Guten Abend. Ich würde gerne etwas von den Profis hören.

Welche Funktionen sind am besten geeignet, um die folgende Aufgabe zu erledigen?

Ich muss mehrere Positionen eröffnen (vom Markt, ohne Aufträge) und deren Tickets sofort in ein Array stellen.

Die Schwierigkeit besteht darin, diese Tickets zu bekommen. Ich habe keine Funktionen gefunden , die eine Position öffnen UND sie mit einem Ticket zurückgeben (wie in MT4).

Öffnen Sie einfach Transaktionen in der Schleife, Parameter usw. - keine Fragen, aber um ein Ticket zu erhalten, öffnen Sie einfach eine Position, NICHT HABEN!

Bitte beraten Sie mich.

Irgendwie geht das so:

Ticket = Function.Open Position(Buy, 0.01, ......);

 
Sergey Voytsekhovsky:

Eröffnung einer Position UND Rückgabe eines Tickets (wie in MT4).

.................... aber ein Ticket für eine gerade eröffnete Position zu bekommen, NICHT!!!

Bitte beraten Sie mich.

Wenn ich mich erinnere, kann ich nur ein Ticket für die letzte offene Stelle anfordern. Aber irgendwie scheint es mir ungeschickt, zu zweideutig, es gibt keine direkte Verbindung zwischen dem Auftrag im Code und der offenen Position. Sicherlich gibt es korrektere Methoden, wer hat Ideen oder vielleicht genug Erfahrung, bitte mitteilen?

 
Sergey Voytsekhovsky:

Das Einzige, was mir einfällt, ist, ein Ticket für die letzte offene Stelle in der Historie anzufordern. Aber irgendwie erscheint mir das ein bisschen unübersichtlich, zu unklar, es gibt keine direkte Verbindung zwischen dem Auftrag im Code und der offenen Position. Sicherlich gibt es korrektere Methoden, wer hat Ideen oder hat vielleicht genug Erfahrung, bitte mitteilen?

All dies habe ich in Artikeln beschrieben. Für mql5 und mql4 wird alles dort gemacht. Man kann eine Idee nehmen und eine Funktion daraus machen.

Allerdings. Sie haben eine Transaktion, in der die Bestandsidentifikation geschrieben wird. Lesen Sie mehr über die Angebote und ihre Eigenschaften in der Dokumentation.

 
Sergey Voytsekhovsky:

Guten Abend. Ich würde gerne etwas von den Profis hören.

Welche Funktionen sind am besten geeignet, um die folgende Aufgabe zu erledigen?

Ich muss mehrere Positionen eröffnen (vom Markt, ohne Aufträge) und deren Tickets sofort in ein Array stellen.

Die Schwierigkeit besteht darin, diese Tickets zu bekommen. Ich habe keine Funktionen gefunden , die eine Position öffnen UND sie mit einem Ticket zurückgeben (wie in MT4).

Öffnen Sie einfach Transaktionen in der Schleife, Parameter usw. - keine Fragen, aber um ein Ticket zu erhalten, öffnen Sie einfach eine Position, NICHT HABEN!

Bitte beraten Sie mich.

Irgendwie geht das so:

Ticket = 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:

Ich habe das alles in den Artikeln beschrieben. Für mql5 und mql4 wird alles dort gemacht. Sie können die Idee nehmen und die Funktion machen.

Allerdings. Sie haben einen Vertrag, in dem eine Positionskennung geschrieben ist. Lesen Sie mehr über die Angebote und ihre Eigenschaften in der Dokumentation.

Vielen Dank, ich werde das überprüfen.

 
Alexey Viktorov:

Großartig, das ist etwas, das ich jetzt tun kann :-). Ich werde es herausfinden und das Ergebnis posten, vielleicht hilft es ja auch jemand anderem.

 
Sergey Voytsekhovsky:

Großartig, das ist etwas, das ich jetzt tun kann :-). Ich werde es herausfinden und das Ergebnis posten, vielleicht hilft es ja auch jemand anderem.

Es gibt nur sehr wenige Menschen, die das nicht wissen. Und die, die es nicht wissen, sollten es nach dem Lesen dieses Threads können. Wenn sie es nicht können, ist es nicht die Sache des Königs... um herumzustöbern.

 
Artyom Trishkin:

Ich habe dies alles in den Artikeln beschrieben. Für mql5 und mql4 wird alles dort gemacht. Sie können die Idee nehmen und die Funktion machen.

Danke, in welchem Ihrer Artikel genau? Sie haben so viele davon.....

 

Guten Tag.

Auch hier wende ich mich an die Gurus in diesem Forum.

Ich habe eine kleine Funktion geschrieben. Es funktioniert, aber sehr langsam. Mir ist klar, dass der Algorithmus extrem ineffizient ist. Ich habe es hier gelesen:

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

dass eseine Funktion gibt, mit der man das Ende eines Arrays anfügen kann.

Ich verstehe nicht, wie man es benutzt, bitte helfen Sie mir, meine Vorstellungskraft wieder in Gang zu bringen, ich werde den Bereich, der mich interessiert, farblich markieren.

//+------------------------------------------------------------------+
//| Заполняем структуру своих позиций
//+------------------------------------------------------------------+
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);
}