Clearing im Prüfgerät - Seite 6

 
Roman Shiredchenko #:

Es gibt auch ein organisatorisches Problem, wenn jemand weiß, wie man es am besten lösen kann - bitte schreiben Sie es in Code - ich werde es an Sie weiterleiten:

im Allgemeinen, wie zu verstehen, dass der Auftragszyklus, eine neue Position - PROFIT begonnen hat - zu berücksichtigen, die durchschnittliche Eröffnungspreis der Position (Clearing ändert seinen Wert) zu nehmen:

um klar zu sein, kann ich sowohl vom Terminal über die Tasten selbst als auch durch einen Roboter mit magik....

Im Allgemeinen benötige ich einen Berichtspunkt, um den durchschnittlichen Einstiegskurs der Position zu berechnen.

Kann ich die Daten von hier verwenden und zum Beispiel die Zeit ablesen, zu der die vorherige Position mit Gewinn geschlossen wurde, und von dort aus die Differenz mit der realen Serverzeit nehmen, so wie wenn ich einen Zyklus vom Terminal aus starte - ohne einen Roboter:

Ich meine so etwas wie das hier:

wie die vergangene Position im Plus ist - dann hat die Abrechnung des aktuellen Zyklus bereits begonnen. und Aufträge - Sie müssen bereits sowohl den Einstiegspreis als auch das Volumen zählen, um den durchschnittlichen Einstiegspreis der Gesamtposition zu berechnen...

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


--------------------------------------------------------------

Natürlich sollte er idealerweise unabhängig vom Ergebnis des vorherigen Zyklus - Gewinn oder Verlust - abgeschlossen werden.

Der Start - der neue wurde zur Berechnung im Code markiert - der Durchschnittspreis des neuen aktuellen Zyklus der Durchschnitte, zum Beispiel, oder Füllungen - es spielt keine Rolle...

Ist jemand in der Lage, den Durchschnittspreis der Endposition zu berechnen? Ich bin es leid, den Code zu zählen und zu korrigieren - die Steinblume funktioniert nicht....:-)

Ich habe verschiedene Methoden in OnTrade Transaction () ausprobiert - viele zusätzliche Dinge fließen in die Berechnung ein, Lose werden im Ergebnis verdoppelt - das ist nicht richtig:

Veranstaltungen

"Wenn zum Beispiel eine Marktkauforder gesendet wird, wird sie verarbeitet, eine entsprechende Kauforder wird für das Konto erstellt, die Order wird ausgeführt, aus der Liste der offenen Orders entfernt, zur Orderhistorie hinzugefügt, dann wird ein entsprechendes Geschäft zur Historie hinzugefügt und eine neue Position erstellt. Alle diese Aktionen sind Handelsgeschäfte

"

Dies geschieht über On Trade Transaction ()

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {


 if ((Hour() <= 13 && Minute() < 44) || (Hour() >=14 && Minute() > 5) || 
          (Hour() <= 18 && Minute() < 44) || (Hour() >=19 && Minute() > 5)) 
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)   //TRADE_TRANSACTION_DEAL_ADD)
   
     {
      long deal_type = -1;
      long deal_entry = -1;
      long deal_magic = 0;

      double deal_volume = 0;
      double deal_price  = 0;
      string deal_symbol = "";

      if(HistoryDealSelect(trans.deal))
        {
         // Print(" deal_entry == DEAL_ENTRY_IN, last_price = ",last_price, " last_lots = ",last_lots);

         deal_type    = HistoryDealGetInteger(trans.deal, DEAL_TYPE);
         deal_entry   = HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
         deal_magic   = HistoryDealGetInteger(trans.deal, DEAL_MAGIC);

         deal_volume  = HistoryDealGetDouble(trans.deal, DEAL_VOLUME);
         deal_price   = HistoryDealGetDouble(trans.deal, DEAL_PRICE);
         deal_symbol  = HistoryDealGetString(trans.deal, DEAL_SYMBOL);
         Print(" deal_entry == DEAL_ENTRY_IN, deal_price = ", deal_price, " deal_volume = ", deal_volume);
        }
      else
         return;

      if(deal_symbol == _Symbol) // && deal_magic == MagicNumber)

         if(deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
           {
            // last_price    = deal_price;
            last_pos_type = (deal_type == DEAL_TYPE_BUY) ? POSITION_TYPE_BUY : POSITION_TYPE_SELL;
            // last_lots     = deal_volume;


          
            if (deal_type == DEAL_TYPE_BUY)
             {
              if(deal_volume > 0)  
              if (!PositionSelect(_Symbol) ||
                 (PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY   && 
                 NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) < last_price))
                        
             
              {
               // расчет средней цены СОВОКУПНОЙ ПОЗИЦИИ для общего случая - входа, как руками, так и роботом 
               last_price = (last_price * last_lots + NormalizeDouble(deal_price,_Digits) *
                             NormalizeDouble(deal_volume,0)) / (last_lots +  NormalizeDouble(deal_volume,0));
               last_price = NormalizeDouble(last_price,_Digits);
               
               last_lots = last_lots + NormalizeDouble(deal_volume,0); // накапливаем совокупный объем
              }
            Print(" OnTradeTransaction_BUY: last_price_BUY = ",last_price, " last_lots_BUY = ",last_lots, " N_max_B = ", N_max_B);
           }
           
         if (deal_type == DEAL_TYPE_SELL)
             {
              if(deal_volume > 0)  
              if (!PositionSelect(_Symbol) ||                
                 (PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL &&
                   (NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) == 0 ||
                    NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits) > last_price ))) 
                        
             
              {
               // расчет средней цены СОВОКУПНОЙ ПОЗИЦИИ для общего случая - входа, как руками, так и роботом 
               last_price = (last_price * last_lots + NormalizeDouble(deal_price,_Digits) *
                             NormalizeDouble(deal_volume,0)) / (last_lots +  NormalizeDouble(deal_volume,0));
               last_price = NormalizeDouble(last_price,_Digits);
               
               last_lots = last_lots + NormalizeDouble(deal_volume,0); // накапливаем совокупный объем
              }
            Print(" OnTradeTransaction_SELL: last_price_SELL = ",last_price, " last_lots_SELL = ",last_lots, " N_max_S = ", N_max_S);
           }   
           
         } // к if(deal_entry == DEAL_ENTRY_IN && (deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL))
     }
  }

Bei dieser Art von f-i - Lots wird bei der Berechnung des durchschnittlichen Positionseinstiegspreises (Netting) nicht korrekt gezählt.


Es ist vielleicht einfacher, dies über On Trade zu tun.

Ich schaue mir das gerade durch On Trade () an: hier wird alles erklärt, wir müssen nur noch die Berechnung in den Code einfügen und das ist alles... Im Grunde genommen.

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


Grundsätzlich gilt: Wenn eine erhöhte Position vorliegt, wird der Durchschnittspreis berechnet. Wenn die Position geschlossen wird, müssen alle Zwischenvariablen auf Null gesetzt werden. Im Grunde ist dort alles elementar.

Die Aufgabe besteht darin, Änderungen des Positionseröffnungskurses während des Clearings auszuschließen (wenn er zum Zeitpunkt des Clearings gleich dem Symbolpreis wird).

D.h. sie im Code zu lesen.

Обработка торговых событий в эксперте при помощи функции OnTrade()
Обработка торговых событий в эксперте при помощи функции OnTrade()
  • www.mql5.com
В 5-ой версии языка MQL появилась масса нововведений, в том числе работа с событиями различных типов (события таймера, торговые события, пользовательские и т.д.). Возможность обработки событий позволяет создавать совершенно новый тип программ для автоматического и полуавтоматического трейдинга. В этой статье мы рассмотрим торговые события и напишем для функции OnTrade() код, который будет обрабатывать событие Trade.
 
Roman Shiredchenko #:

Hat niemand einen fertigen Entwurf für die Berechnung des Durchschnittspreises einer Endposition? Ich habe es langsam satt, den Code zu zählen und zu korrigieren - es funktioniert nicht....:-)

Hier ist ein Stück meines alten, aber immer noch "kämpferischen" Codes:

               Pr=HistoryDealGetDouble(DealTicket,DEAL_PRICE);
               Vol=HistoryDealGetDouble(DealTicket,DEAL_VOLUME);
               if(st.Pos==0.0)
                  st.Price=Pr;
               if((ENUM_DEAL_TYPE)HistoryDealGetInteger(DealTicket,DEAL_TYPE)==DEAL_TYPE_BUY)
                 {
                  if(st.Pos>=0.0) // Увеличиваем лонг
                     st.PriceAvr=(st.PriceAvr*st.Pos+Pr*Vol)/(st.Pos+Vol);
                  else  // st.Pos<0
                    {
                     if(Vol<=-st.Pos) // Кроемся или сокращаем позу
                        Res=(-Vol)*(Pr-st.PriceAvr);
                     else if(Vol>-st.Pos) // Переворот в лонг
                       {
                        Res=st.Pos*(Pr-st.PriceAvr);
                        ClearClosedPos();
                        st.Price=Pr; st.PriceAvr=Pr;
                       }
                    }
                  st.Pos+=Vol; st.PlanPos-=Vol;
                 }
               else if((ENUM_DEAL_TYPE)HistoryDealGetInteger(DealTicket,DEAL_TYPE)==DEAL_TYPE_SELL)
                 {
                  if(st.Pos<=0.0) // Увеличиваем шорт
                     st.PriceAvr=(st.PriceAvr*(-st.Pos)+Pr*Vol)/(-st.Pos+Vol);
                  else  // st.Pos>0
                    {
                     if(Vol<=st.Pos) // Кроемся или сокращаем позу
                        Res=(Vol)*(Pr-st.PriceAvr);
                     else if(Vol>st.Pos) // Переворот в шорт
                       {
                        Res=st.Pos*(Pr-st.PriceAvr);
                        ClearClosedPos();
                        st.Price=Pr; st.PriceAvr=Pr;
                       }
                    }
                  st.Pos-=Vol; st.PlanPos+=Vol;
                 }
 
JRandomTrader #:

Hier ist ein Stück meines alten, aber immer noch "brauchbaren" Codes:

О!!! Vielen Dank für die schnelle Antwort - ich werde sie zur Überprüfung und Bearbeitung mitnehmen.
 
Roman Shiredchenko #:
О!!! Vielen Dank für die schnelle Antwort - ich werde sie zur Überprüfung und Bearbeitung aufnehmen.

Hinweis - "st" (es gibt eine ziemlich große Struktur, einschließlich Trails und Statistiken) ist genau der "Zustand" des Roboters - was nach einer Änderung (und beim Deinit) auf die Festplatte geschrieben und beim Yinit geladen wird.

Und ja, höchstwahrscheinlich werden st.Price und st.PriceAvr hier nicht wirklich gebraucht, einer reicht, aber der Code ist alt, mehr als 5 Jahre, und alle meine "Kampf"-Roboter sind daran gebunden, also "erste Regel der Luftfahrtmechanik - nicht mit dem funktionierenden Mechanismus herumspielen".

 

das Ergebnis des Clearings ist die Übertragung aller Positionen auf den aktuellen Preis, d.h. auf den Durchschnittspreis innerhalb der Spanne

Wer interessiert sich für diesen Austausch? ...

 
JRandomTrader #:

Hinweis - "st" (es gibt eine ziemlich große Struktur, einschließlich Trails und Statistiken) ist genau der "Zustand" des Roboters - was nach einer Änderung (und beim Deinit) auf die Festplatte geschrieben und beim Yinit geladen wird.

Und ja, höchstwahrscheinlich werden st.Price und st.PriceAvr hier nicht wirklich gebraucht, einer reicht, aber der Code ist alt, mehr als 5 Jahre, und alle meine "Kampf"-Roboter sind daran gebunden, also "erste Regel der Luftfahrtmechanik - nicht mit dem funktionierenden Mechanismus herumspielen".

Danke für die Klarstellung, ich werde sie als grundlegend betrachten.
 
Renat Akhtyamov #:

das Ergebnis des Clearings ist die Übertragung aller Positionen auf den aktuellen Preis, d.h. auf den Durchschnittspreis innerhalb der Spanne

Wer interessiert sich für diesen Austausch? ...

Ich werde die Datei hier posten, sobald ich sie fertiggestellt habe.
 
Renat Akhtyamov #:

das Ergebnis des Clearings ist die Übertragung aller Positionen auf den aktuellen Preis, d.h. auf den Durchschnittspreis innerhalb der Spanne

Wer kümmert sich um die Börse? ...

Ich handle nur an der Börse.

 
JRandomTrader #:

Ich handle nur an der Börse.

und ich handle nur mit Devisen.

Ich weiß nicht, wie man an der Börse handelt.

Ich habe es erlebt, ich habe es erlebt.

nicht mein Ding - neu lernen

Übrigens, warum ist der Durchschnittspreis auf dem Markt nicht der Preis nach dem Clearing?

// sonst würde ich dort handeln ;)

// aber wie sich herausstellt, geben sie dem Glas nicht alles, sie verstecken es ein wenig, d.h. das Glas ist scheiße?

 
Roman Shiredchenko #:
Ich werde es hier posten, sobald ich die Kurzgeschichte fertiggestellt habe.

Alles ist seit langem in der Rubrik Börsenhandel veröffentlicht worden

https://www.mql5.com/ru/forum/67298/page3#comment_2109451

ФОРТС: В помощь начинающим
ФОРТС: В помощь начинающим
  • 2015.12.08
  • www.mql5.com
Установка отложенного ордера командой OrderSend().