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

 

Warum kann der EA den Preis der schwebenden Order (Verkaufsstopp) nicht auf einen profitableren Preis ändern?


Die folgende Funktion definiert die Notwendigkeit, den offenen Preis eines schwebenden Auftrags zu verschieben

if(orders_total > 0 && position_total == 0)
     {
      OrderGetTicket(0)
      if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP)
        {
         if(OrderGetDouble(ORDER_PRICE_OPEN) - SymbolInfoDouble(_Symbol,SYMBOL_ASK) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_ASK) + ((double)dist * _Point));
        }
      else if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
        {
         if(SymbolInfoDouble(_Symbol,SYMBOL_BID) - OrderGetDouble(ORDER_PRICE_OPEN) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_BID) - ((double)dist * _Point));
        };
     };


... und dies ist die Funktion, die bereits den offenen Preis des schwebenden Auftrags bewegt

void Mode_Order(string act, double price)
  {
   
   MqlTradeRequest request; ZeroMemory(request);
   MqlTradeResult  result;  ZeroMemory(result);
   
   request.symbol = _Symbol;
   
   if(act == "S")
     {
      request.action   = TRADE_ACTION_SLTP;
      request.position = PositionGetTicket(0);
      request.sl       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) - ((double)stop * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) + ((double)stop * _Point));
      request.tp       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) + ((double)profit * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) - ((double)profit * _Point));
     }
   else
     {
      request.action   = TRADE_ACTION_MODIFY;
      request.position = OrderGetTicket(0);
      request.price    = NormalizeDouble(price,_Digits);
     };
   
   if(!OrderSend(request,result)) Print("Не удалось изменить параметры ордера. Код ошибки "+(string)result.retcode);
   
  }
 
Alexandr Sokolov:

Warum kann der EA den Preis der schwebenden Order (Verkaufsstopp) nicht auf einen profitableren Preis ändern?


Die folgende Funktion definiert die Notwendigkeit, den offenen Preis eines schwebenden Auftrags zu verschieben


... Und dies ist die Funktion, die bereits den offenen Preis der schwebenden Order bewegt

Ist dieser Auftrag der einzige? Funktioniert die SLTP-Änderung? Wenn nicht, sollten Take und Stop normalisiert werden.

dist1 ist gleich was? Hier sollte die Reihenfolge anstelle der Position gesetzt werden

request.position = OrderGetTicket(0);
 
Aleksey Mavrin:

Ist der Auftrag der einzige? Funktioniert die SLTP-Änderung? Wenn nicht, sollten Sie die Aufnahme normalisieren und beenden.

dist1 ist gleich was? Wir sollten die Reihenfolge und nicht die Position festlegen

Herzlichen Dank! Das war mir nicht aufgefallen, es scheint eine Kleinigkeit zu sein - aber ohne funktioniert es nicht


... Der Auftrag ist der einzige, alles funktioniert, das einzige Problem war das Verschieben des schwebenden Auftrags

 
Alexandr Sokolov:

Herzlichen Dank! Das war mir nicht aufgefallen, scheinbar eine Kleinigkeit - aber ohne sie funktioniert es nicht


... Der Auftrag ist der einzige, alles funktioniert, das einzige Problem war das Verschieben des schwebenden Auftrags

1. Bitte 2. hmm, ich werde es trotzdem normalisieren, gegen die Sünde. Ihr Preis ergibt sich aus der ganzen Zahl multipliziert mit einem normalisierten Double, im allgemeinen Fall wird offenbar auch ein normalisiertes Double erhalten, aber irgendwo habe ich gelesen, dass es nicht immer, ein paar Mal im Jahr kann es bekommen

etwa 1,132500000000000000000000001

und dann Ärger, zum richtigen Zeitpunkt, wenn der stärkste Trend nicht funktioniert, und die Hypothek wieder, hallo)))

Ich könnte mich irren, aber ich selbst beruhige und normalisiere immer.

 
Aleksey Mavrin:

1. Bitte 2. hmmm, ich normalisiere sowieso, um der Sünde willen. Sie erhalten den Preis aus einem Ganzen multipliziert mit einem normalisierten Doppelten, im allgemeinen Fall erhalten Sie anscheinend auch ein normalisiertes Doppeltes, aber ich habe irgendwo gelesen, dass nicht immer, ein paar Mal im Jahr könnten Sie erhalten

etwa 1,132500000000000000000000001

und dann Ärger, zum richtigen Zeitpunkt, wenn der stärkste Trend nicht funktioniert, und die Hypothek wieder, hallo)))

Ich könnte mich irren, aber ich selbst beruhige und normalisiere immer.

Mathematische Operationen an zwei normierten Zahlen ergeben nicht-normierte Ergebnisse.

Um ein normiertes Ergebnis von mathematischen Operationen mit reellen Zahlen zu erhalten, müssen Sie den normierten Wert dieser mathematischen Operationen zurückgeben.

Norm(1.11111) + Norm(2.22222) = NoNorm(res)

Norm(1.11111 + 2.22222) = Norm(res)

 

@ Artyom Trishkin

Ich habe den Code mit diesem Thema beigefügt.

Ich habe den Code in der Codebasis gefunden. Bei der Änderung des Codes gab es ein Problem.

Der Eingabeteil enthält die folgenden Einträge:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input eTradeType                                    Inp_element_12357534       = TRADETYPE_BUY;                        // First Trade Type
input double                                        Inp_element_3632865        = 0.01;                                 // Start Lot
input double                                        Inp_element_12844407       = 1.0;                                  // Lot Multiplier
input #ifdef __MQL4__ int #else long #endif          Inp_element_2542795        = 400;                                  // Grid Step, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3135636        = 100;                                  // Target, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3634918        = 7373;                                 // Magic
sinput string                                       Inp_element_3640359        = "Grid EA";                            // Comment
//+------------------------------------------------------------------+

Ich möchte, dass sich dieser Parameter ändert, während das Programm läuft: input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Schrittgitter, Punkte.

Bitte lassen Sie mich wissen, was ich tun kann, um diesen Parameter bei jeder Ausführung zu ändern.

Dateien:
Manage.mq5  859 kb
 
jaffer wilson :

@ Artyom Trishkin

Ich habe den Code mit diesem Thema beigefügt.

Ich habe den Code in der Codebasis gefunden. Bei der Änderung des Codes gab es ein Problem.

Der Eingabeteil enthält die folgenden Einträge:

Ich möchte, dass sich dieser Parameter ändert, während das Programm läuft: input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Schrittgitter, Punkte.

Bitte lassen Sie mich wissen, was ich tun kann, um diesen Parameter bei jeder Ausführung zu ändern.

Ehrlich gesagt, ist die Frage nicht klar.

Möchten Sie den Eingabeparameter Inp_element_2542795 jedes Mal ändern, wenn Sie den Berater starten?

Ändern Sie dies in den Einstellungen des Beraters, wenn er gestartet wird. Wenn der Berater bereits läuft und Sie diesen Parameter ändern möchten, drücken Sie F7 - das Fenster mit den Beratereinstellungen wird angezeigt, in dem Sie diesen Parameter ändern können.

 
Artyom Trishkin:

Ehrlich gesagt, ist die Frage nicht klar.

Möchten Sie den Eingabeparameter Inp_element_2542795 jedes Mal ändern, wenn Sie den Berater starten?

Ändern Sie dies in den Einstellungen des Beraters, wenn er gestartet wird. Wenn der Berater bereits läuft und Sie diesen Parameter ändern möchten, drücken Sie F7 - das Fenster mit den Beratereinstellungen wird angezeigt, in dem Sie diesen Parameter ändern können.

Lassen Sie mich das klarstellen. Ich denke, das Problem ist die Übersetzung. Eigentlich ist es ein Eingabewert, und ich verstehe nicht, wo dieser Wert für die Berechnung verwendet wird. Ich möchte nicht, dass jedes Mal 400 Punkte verwendet werden müssen. Ich möchte die Werte immer wieder ändern. Ich möchte die Werte in eine geeignete Berechnung ändern. Können Sie mir helfen, wo ich Änderungen vornehmen kann, damit der Wert dynamisch wird, während das Programm läuft?

 
jaffer wilson :

Lassen Sie mich das klarstellen. Ich glaube, das Problem liegt in der Übersetzung. Es handelt sich eigentlich um einen Eingabewert, und ich verstehe nicht, wo dieser Wert zur Berechnung verwendet wird. Ich möchte nicht, dass jedes Mal 400 Punkte verbraucht werden. Ich möchte die Werte immer wieder ändern. Ich möchte die Werte für eine geeignete Berechnung ändern. Können Sie mir helfen, wo ich Änderungen vornehmen kann, damit der Wert dynamisch wird, während das Programm läuft?

Erstellen Sie eine neue globale Variable. Setzen Sie den Wert des EingabeparametersInp_element_2542795 auf diesen:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
cRunner *Runner;
long g_element_2542795=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//===============
   g_element_2542795=Inp_element_2542795;
//===============
/* DEBUG MACROS' START */ TRACEERRORS_START
//===============
 
//===============
   Runner=new cRunner;
//===============
 

und ersetzen Sie den gesamten Eintrag der Zeichenfolge Inp_element_2542795 durch diese neue Variable g_element_2542795 mit Strg + H

 

Hallo!

Ich lerne gerade MQL5, also bitte ich um Hilfe.

Es gibt eine Klasse -https://www.mql5.com/ru/code/18721(Vlad Karputova). Dank an Vladimir.

Es berechnet den Gewinn (in Punkten, in der Währung der Einlage, des Swaps und der Provision), hat aber keinen Filter für Magik.

Ich habe einen Filter für Magik hinzugefügt (ich bin nicht sicher, ob er korrekt ist, daher möchte ich ihn nicht mit Fehlern posten).

Ich habe das Ergebnis.

Search deals with POSITION_IDENTIFIER 53821539
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11164, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11170, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53821617
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11159, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11172, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.39
Profit in points -13.0, commission -0.10, swap 0.00, profit -0.39

Search deals with POSITION_IDENTIFIER 53821750
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11163, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11169, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53847372
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10971, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11002, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.93
Profit in points -31.0, commission -0.10, swap 0.00, profit -0.93

Search deals with POSITION_IDENTIFIER 53848455
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10997, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10741, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit 7.68
Profit in points 256.0, commission -0.10, swap 0.00, profit 7.68

Search deals with POSITION_IDENTIFIER 53856130
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10735, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10769, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -1.02
Profit in points -34.0, commission -0.10, swap 0.00, profit -1.02
All_Profit in points 166.0, All_commission -0.60, All_swap 0.00, All_profit 4.98
All_Profit in points 0.0, All_commission 0.00, All_swap 0.00, All_profit 0.00

Die Ergebnisse für die Originalklasse und die Klasse mit Magik-Filter stimmen überein. Aber es gibt hier einen Punkt.

1. warum der OUT-Handel keine Magie besitzt.

Wenn ich die Klasse falsch korrigiert habe (Hinzufügen einer Magie), nehmen Sie bitte die erforderliche Änderung an der ursprünglichen Klasse vor und veröffentlichen Sie sie.

(Und es wäre gut, ein Symbol als Parameter an die Klasse zu übergeben).

Vielen Dank für die Hilfe.

HistoryPositionInfo version 2
HistoryPositionInfo version 2
  • www.mql5.com
Новое в версии 2: функция GetProfitInPoints осталась, но рекомендуется теперь использовать новую функцию GetProfit: Функция GetProfit возвращает для восстановленной позиции, кроме прибыли в пунктах: комиссию, своп и прибыль в деньгах. Класс CHistoryPositionInfo предназначен для получения прибыли позиции в пунктах, комиссии, свопа и прибыли в...
Grund der Beschwerde: