Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 194

 
Wer weiß - wenn Sie einen Teil eines Auftrags schließen, verschwindet dann sein Zauberer oder sein Kommentar?
 
Renat Akhtyamov:
Wer weiß - wenn Sie einen Teil des Ordens schließen, wird seine Magie oder sein Kommentar verschwinden?

Die Magie bleibt erhalten, der Bestellschein wird geändert und der Kommentar enthält den übergeordneten Bestellschein von #xxxxxxxxxxx. Der übergeordnete Auftrag hat ein untergeordnetes Auftragsticket: to#xxxxxxxxxxx

 
Artyom Trishkin:

Die Magie bleibt erhalten, der Bestellschein wird geändert und der Kommentar enthält den übergeordneten Bestellschein von#xxxxxxxxxxx. Der übergeordnete Auftrag hat ein untergeordnetes Auftragsticket: to#xxxxxxxxxxx

Gut. Ich danke Ihnen!
 
geratdc:


Ja, dieses K befindet sich auch in externenVariablen in Top Hat - vielleicht ist es der Rückgabewert einer Funktion...


Alexey, was können Sie zu meinem Problem sagen? Ich versuche, Trailing-Stops mit umgekehrten Aufträgen zu verbinden. Sind Sie jemals auf ein solches Problem gestoßen?

Und um etwas zum Problem zu sagen, muss man das Problem selbst verstehen. Und von diesem

geratdc:

Ich brauche Hilfe - ich habe 3 Stop-Orders, aber das Beispiel des Trailing-Stops aus den Video-Tutorials :) gilt nur für unverknüpfte Orders, in meinem Fall sind sie durch einen Algorithmus verknüpft, d.h. der Take-Profit wird durch die Summe der drei Orders berechnet oder durch eine, wenn ich in einen Trend geraten bin. Nun, ich habe an etwas gedacht, aber mein Expert Advisor hat nicht begonnen, mehr zu verdienen - es hat begonnen, die gleiche Menge an Aufträgen zu verdienen, aber ich bekomme 2-3 mal weniger Trades im Vergleich zu meinem vorherigen EA ohne Trailing. Mein Schleppen ist also kein Schleppen, sondern ein Unsinn. Kann mir jemand eine Idee geben, wie ich sie auf verknüpfte Aufträge setzen soll? Mir fällt leider nichts anderes ein. Hier ist das Ergebnis meines "Trailing" - es ist in blau dargestellt:

Das Ergebnis für 1 Test ist beigefügt. Gibt es dort einen Trailing-Stop oder nicht? Das verstehe ich nicht. Warum wurde der Gewinn im gleichen Zeitraum nicht erhöht? Nur die Zahl der Geschäfte ging um das 2-3fache zurück?


Ich kann nichts verstehen. Das Seltsamste ist"Ich habe etwas erfunden", aber haben Sie verstanden, was Sie erfunden haben? Und das ist"Wie schaffe ich es bei verknüpften Aufträgen". Aber dann heißt es: "Ich fürchte, mir fällt nichts anderes ein".

 
Alexey Viktorov:

Und um etwas zu diesem Problem sagen zu können, muss man das Problem selbst verstehen. Und von diesem.

Ich kann nichts verstehen. Das Seltsamste ist"Ich habe es herausgefunden", aber wissen Sie, was Sie herausgefunden haben? Und dann ist da noch die Frage: "Wie schaffe ich es auf die verlinkten Haftbefehle?" Aber dann heißt es: "Ich fürchte, mir fällt nichts anderes ein".


So wie ich es verstehe, können Trailing Stops nicht korrekt auf Aufträge angewandt werden, daher sollten wir dieser Funktion CalculateProfit viel Aufmerksamkeit schenken, und zwar der Variable "op", nach der Aufträge geschlossen werden, wenn die Summe der Gewinne für alle 3 Aufträge gleich TakeProfit ist, und versuchen, diese Variable zu durchforsten. Ich werde versuchen, mir etwas in dieser Richtung auszudenken. Ich verstehe, dass es schwierig ist, mit Dritten abracadabra)))).
 
geratdc:

So wie ich es verstehe, können Trailing Stops nicht korrekt auf Orders angewendet werden, deshalb sollten wir uns diese Funktion CalculateProfit genauer ansehen, insbesondere die Variable "op", nach der Orders geschlossen werden, wenn die Summe der Gewinne für alle 3 Orders gleich TakeProfit ist, und versuchen, über diese Variable zu trailen. Ich werde versuchen, mir etwas in dieser Richtung auszudenken. Ich verstehe, dass es schwierig ist, mit dem Abrakadabra Dritter umzugehen))).
Warum können Sie es nicht anwenden? Es ist notwendig, nicht etwas an die Funktionen anderer Leute anzuhängen oder zu erfinden, und Ihre eigenen so zu schreiben, dass sie alles ausführen, was Sie wollen. Was könnte das Problem sein? Berechnen Sie unabhängig von der Anzahl der Aufträge den Durchschnittspreis und gehen Sie von diesem Wert aus. Wenn eine Bedingung erfüllt ist, werden beim Durchlaufen aller Aufträge in der Schleife die Stopps auf einem neuen Niveau angeordnet, das aus dem Durchschnittspreis aller in einer Richtung bestehenden Aufträge berechnet wird.
 
//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern double  TakeProfit     = 1;
extern int     Step           = 1;

extern double  TrailXStep     = 1;
extern double  TrailXStop     = 1;

extern int     MaPeriod       = 100;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      //TakeProfit     *= 10;
      Step           *= 10;
      //TrailXStep     *= 10;
      //TrailXStop     *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1); 
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if (tp>TakeProfit)
   {
      TakeProfit+=tp;
   }
   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   if (op>=tp)
   {
         CloseAll();    
   }


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
      {  
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+

Dies ist eine Variante des Trailing durch die Funktion CalculateProfit(), beide Trailing-Varianten haben die gleichen Indikatoren im Handel - sowohl in der Anzahl der Trades als auch in den Gewinnen. Gewinne sind nicht viele - jetzt werde ich Volatilität und genauere Einstiegsindikatoren hinzufügen. Ich denke, ein und derselbe Indikator kann diese Probleme lösen, oder? Sagen wir, die letzten 5 Takte werden analysiert oder so ähnlich. Wie nennt man solche Balkenanzeigen? Und was ist der beste Zeitrahmen? Teilen Sie uns bitte Ihre Meinung mit, wie kann ich zwei Fliegen mit einer Klappe schlagen ... Ich habe zwei Fliegen mit einer Klappe geschlagen :)

Wie sehen Sie die Trailing Bars bei diesem EA?

 
Alexey Viktorov:
Warum können Sie es nicht anwenden? Sie müssen nicht etwas an die Funktion eines anderen anhängen oder erfinden, sondern Ihre eigene Funktion so schreiben, dass sie das tut, was Sie tun wollen. Wo könnte das Problem liegen? Berechnen Sie unabhängig von der Anzahl der Aufträge den Durchschnittspreis und gehen Sie von diesem Wert aus. Wenn eine Bedingung erfüllt ist, werden beim Durchlaufen aller Aufträge in der Schleife die Stopps auf einem neuen Niveau angeordnet, das aus dem Durchschnittspreis aller Aufträge einer Richtung berechnet wird.

Gerettet, danke. Das glaube ich noch nicht. Ich sollte eine Bibliothek mit Codes und Funktionen in meinem Kopf haben, während wir in den Video-Tutorials alle Dinge durchgehen, die ich bisher implementiert habe. Vielleicht werde ich besser darin und setze Ihren Rat in die Praxis um. Sieht das, was ich heute erfunden habe, wie ein Schleppnetz aus? Nun, der Expert Advisor führt die Trawls gemäß den Berichten durch, aber ich weiß nicht, welches das richtige ist - ein falsches Trawl erhöht nur die Verlustwahrscheinlichkeit. Ich würde sagen, dass die Wahrscheinlichkeit eines Fehlschlags bei 0,9 liegt, ungefähr so)))) Ich würde sagen, es ist sehr Angst vor flachen und der Indikator ist jetzt schwach - wir sind nur den Trend beitreten und wenn wir 3 Aufträge haben und der Markt plötzlich die Richtung ändert und gibt uns einen Drawdown - wir sind aus dem Geld.
 
geratdc:

Gerettet, danke. So kann ich noch nicht denken. Ich muss eine Bibliothek mit Codes und Funktionen in meinem Kopf haben, und ich bin die Video-Tutorials durchgegangen, das ist, was ich jetzt benutze. Vielleicht werde ich besser darin und setze Ihren Rat in die Praxis um. Sieht das, was ich heute erfunden habe, wie ein Schleppnetz aus? Nun, der Expert Advisor führt die Trawls gemäß den Berichten durch, aber ich weiß nicht, welches das richtige ist - ein falsches Trawl erhöht nur die Verlustwahrscheinlichkeit. Ich würde sagen, dass die Wahrscheinlichkeit eines Fehlschlags bei 0,9 liegt, ungefähr so)))) Ich würde sagen, es ist sehr Angst vor flachen und der Indikator ist jetzt schwach - wir sind nur den Trend beitreten und wenn wir 3 Aufträge haben und der Markt plötzlich die Richtung ändert und gibt uns einen Drawdown - wir sind aus dem Geld.

Nun, ich werde versuchen, meinen Teil zur Aufklärung beizutragen.

Ich werde Sie mit "Sie" ansprechen, wenn ich ihn abschicke. Ich habe einen Schnappschuss des Zeigers...

Bitte sagen Sie mir, ob es nicht falsch ist, die gleiche Funktion 5 Mal auf dem gleichen Tick aufzurufen? Aber das ist nur die Hälfte des Problems. Diese Funktion geht durch alle Aufträge. Und das alles 5 Mal in einem Tick... Und ich zähle 4 solcher Funktionen. Wir können leicht 3 weitere Funktionen in die Schleife einbauen, um alle Aufträge zu durchsuchen, ohne uns den Kopf zu zerbrechen.

Hier sind zwei von ihnen.

if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
if(cn==1 && CountBuy()==1)


else if(cn==1 && CountSell()==1) 
if(cn==2 && CountBuy()==1 && CountSell()==1) 


else if(cn==2 && CountSell()==1 && CountBuy()==1)

Diese sind.

Trailing();


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }


Es ist nicht einmal annähernd ein Rückstand.

Um dies zu verstehen, müssen wir uns über die Definition des Begriffs Trailing im Klaren sein. Ich kann mich nicht mehr wortwörtlich erinnern, aber es kann folgendermaßen beschrieben werden: "Verschieben des StopLoss-Levels, das dem Preis folgt, um mögliche Verluste zu verringern oder den "garantierten" Gewinn zu erhöhen.


Und dies

extern double price,op,cn,tp;

wie sieht es aus, wenn Sie den Expert Advisor ausführen? Wahrscheinlich vier Zeilen... werden sie benötigt?


Eine letzte Sache für heute: Sie brauchen keine Bibliothek im Kopf zu haben. Es genügt, eine Dokumentation zu haben und zu wissen, wie man sie benutzt. Ich kann mich immer noch nicht an alle Parameter von iMA(_Symbol, _Period, ,,,,,) erinnern und schreibe weiter nur nach einem Blick in die Dokumentation. Und damit fast alle Funktionen. Glücklicherweise wurden vor nicht allzu langer Zeit Tooltips eingeführt, die nicht sehr hilfreich sind. Ich versuche nicht, auswendig zu lernen, wie man diese oder jene Enums schreibt. Ich muss also jedes Mal in der Dokumentation nachsehen.

 

Können Sie mir sagen, welche Funktion den Status dieses Kontrollkästchens überprüft?


Grund der Beschwerde: