Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 828

 
Grüße. Die Frage ist eher eine logische Frage.
Das so genannte Anti-Martingale-System, mit einer Begrenzung der Anzahl der Erhöhungen. Wenn Sie mit Gewinn schließen, wird das nächste Lot um einen Faktor erhöht. Bei einem Verlust oder wenn die Anzahl der gewinnbringenden Positionen in einer Reihe die angegebene Anzahl übersteigt, entspricht das Lot dem Startlot.
Wie kann ich nach Überschreiten der festgelegten Anzahl profitabler Positionen den Zyklus der Erhöhung erneut starten?
int K_U_=5;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);//лот последней закрытой позиции
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }


/

 
lil_lil:
Grüße. Die Frage ist eher eine logische Frage.
Das so genannte Anti-Martingale-System, mit einer Begrenzung der Anzahl der Erhöhungen. Wenn Sie mit Gewinn schließen, wird das nächste Lot um einen Faktor erhöht. Bei einem Verlust oder wenn die Anzahl der gewinnbringenden Positionen in einer Reihe die angegebene Anzahl übersteigt, entspricht das Lot dem Startlot.
Wie kann ich nach Überschreiten der festgelegten Anzahl profitabler Positionen den Zyklus der Erhöhung erneut starten?


/

Beispiel imStop-Loss-Take-Profit-Code: Die Losgröße wird in der Variablen "ExtLot" gespeichert (überschrieben, erhöht und auf Minimum zurückgesetzt), die auf globaler Programmebene (im Header) deklariert ist. OnTradeTransaction() fängt Trades des Typs "Market Exit" ab und prüft, wie der Trade geschlossen wurde - mit Take Profit oder Stop Loss:

         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               ExtLot*=2.0;
            else if(deal_reason==DEAL_REASON_TP)
               ExtLot=m_symbol.LotsMin();
           }

Bei Stop Loss verdoppeln wir das Lot, bei Take Profit setzen wir die Lotgröße auf den Mindestwert zurück.


Hinweis: Im Expert Advisor selbst ist die Berechnung von Stop Loss und Take Profit ein wenig fehlerhaft - der Code wird aber bald neu veröffentlicht werden.

 
Vladimir Karputov:

Beispiel imStop-Loss-Take-Profit-Code: Die Losgröße wird in der auf globaler Programmebene (im Header) deklarierten Variablen "ExtLot" gespeichert (überschrieben, erhöht und auf Minimum zurückgesetzt). OnTradeTransaction() fängt Trades des Typs "Market Exit" ab und prüft, wie der Trade geschlossen wurde - mit Take Profit oder Stop Loss:

Bei Stop Loss verdoppeln wir das Lot, bei Take Profit setzen wir die Lotgröße auf den Mindestwert zurück.


Hinweis: Im Expert Advisor ist die Berechnung von Stop-Loss und Take-Profit leicht fehlerhaft - der Code wird aber bald neu veröffentlicht.

Ich berechne die Anzahl der gewinnbringenden Geschäfte, die hintereinander getätigt werden, und wenn sie 5 übersteigt, kehre ich zum anfänglichen Lot zurück. Position 6 wird mit dem anfänglichen Lot eröffnet und Position 7 sollte mit dem Volumen = Lot 6 multipliziert mit dem Koeffizienten eröffnet werden, usw. Wenn 5 weitere gewinnbringende Positionen vorhanden sind, kehren Sie zum ursprünglichen Los zurück.

Gewinnbringende Positionen sind 20 in einer Reihe. Ihre Lose sollten sein: 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


 
lil_lil:

Ich zähle die Anzahl der gewinnbringenden Geschäfte in einer Reihe, wenn sie 5 übersteigt, kehre ich zum Ausgangslot zurück, Position 6 wird mit dem Ausgangslot eröffnet und Position 7 sollte mit dem Volumen = Lot 6 multipliziert mit dem Koeffizienten eröffnet werden, usw. Wenn 5 weitere gewinnbringende Positionen vorhanden sind, kehren Sie zum ursprünglichen Los zurück.

Gewinnbringende Positionen sind 20 in einer Reihe. Ihre Lose sollten sein: 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


Sie müssen eine statische Variable in der Funktion der Loszählung verwenden. Und so funktioniert es:

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   static int counter=0;
   for(int i=0;i<18;i++)
     {
      Print(counter);
      counter++;
      if(counter==5)
         counter=0;
     }
  }
//+------------------------------------------------------------------+

Ergebnis:

0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
Dateien:
Test_1.mq5  2 kb
 
Vladimir Karputov:

Sie müssen eine statische Variable in der Funktion der Loszählung verwenden. Und so funktioniert es:

Ergebnis:

Ich habe nach Ihrem Beispiel zurückgesetzt, aber es funktioniert nicht die Reihenfolge der Loserhöhung

Es gibt 20 profitable Positionen in einer Reihe. Ihre Partien sollten 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 1, 1, 1, 1, 1, ............lauten, aber es sollte1, 2, 4, 8,16, 1, 1, 1, 1 sein.

Was ist los?

int K_U_=5;  double   Lots=1.0;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }
  
//+------------------------------------------------------------------

int CountProfit(const string Symb,const long MagicNumber=0)
  {
    int counter=0;
   ulong Ticket;

   if(HistorySelect(0,LONG_MAX))
      for(int i=HistoryDealsTotal()-1; i>=0; i--){
      
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {
            if(HistoryDealGetDouble(Ticket,DEAL_PROFIT)>0)
            counter++; else
               break;
           }
           }
   if(counter==K_U_)
      counter=0;
   return(counter);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LotLastCloPos(const string Symb,const long MagicNumber=0)
  {
   ulong Ticket;
   double lot_=0;

   if(HistorySelect(0,LONG_MAX))
      for(int i=0; i<HistoryDealsTotal(); i++)
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {

            lot_=HistoryOrderGetDouble(Ticket,ORDER_VOLUME_INITIAL);

           }

   return(lot_);
  }
 
lil_lil:

Ich führe den Nullabgleich gemäß Ihrem Beispiel durch, aber ich erhalte nicht die Reihenfolge der Loserhöhung

Es gibt 20 profitable Positionen in einer Reihe. Ihre Partien sollten 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 sein und es stellt sich so heraus:1, 2, 4, 8,16, 1, 1, 1, 1, 1, 1 ............

Was ist los?

Sie wollen OnTradeTransaction also immer noch nicht auf normale Art und Weise verwenden? Sie ziehen es also vor, EXAKT die gesamte Handelsgeschichte (seit 1970) anzufordern? Und warum?

 
Vladimir Karputov:

Sie wollen also nicht richtig mit OnTradeTransaction arbeiten? Sie ziehen es also vor, die ABSOLUT GESAMTE Handelsgeschichte (seit 1970) anzufordern? Warum?

Ich habe einen Grund gefunden, Klammern.

Was meinen Sie, ich will nicht, was hatOnTradeTransaction mit meiner Frage zu tun;)

 

Jetzt sehe ich, zwei Beiträge vor meiner Frage, ein Beispiel für die Berechnung.

Ich danke Ihnen.

 
lil_lil:

Ich habe den Grund gefunden, Klammern.

Was meinen Sie damit, dass ich das nicht möchte? Was hatOnTradeTransaction mit meiner Frage zu tun?)

Ich frage nur nach dem Handelsverlauf

HistorySelect(0,LONG_MAX)

bedeutet, dass die gesamte Historie dieses Handelskontos seit 1970 abgefragt wird. Dies ist sehr suboptimal:

  • Was ist, wenn das Konto Tausende von Geschäften enthält?
  • Was ist, wenn Sie (Gott bewahre) bei jedem Häkchen diesen Antrag stellen?

 

Bitte teilen Sie uns die Funktionen mit, die mit dem Handelsverlauf arbeiten.

Ich benötige Informationen über das Datum der letzten Handelseröffnung, den Handelsschluss, das Volumen, das finanzielle Ergebnis und die Art des Handels (Kauf oder Verkauf).

Wenn Sie ähnliche Funktionen haben, teilen Sie sie bitte mit.