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

 

Hmm, seltsame Situation, wie die Aktivität in dem Thema, das ich angesprochen habe, hatte ich eine Frage, aus meiner Sicht spezifisch, aber statt einer Antwort bekam ich bisher "warum brauchen Sie es?

Ich möchte es mit SB CTrade machen, hier ein Beispiel (zusammengestellt aus 2 meiner Beispiele): Wir eröffnen jedenneuen Bar um 9 TF mit einer Order, wir merken uns das Ticket und bestimmen die Richtung einer geschlossenen Order durch die Ticketnummer.

In MQL4 würde der Code für den Tester wie folgt aussehen

//+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
input int TP = 100;
input int SL = 100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };

ENUM_TIMEFRAMES  TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
CNewbar *BAR[9];
int ticket[9];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0;i<9;i++) BAR[i]=new CNewbar(TF[i]);
   ArrayInitialize(ticket,-1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i=0;i<9;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<9;i++)
      if(BAR[i].NewBar())
        {
         if(ticket[i]<0) ticket[i]=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-SL*_Point,Ask+TP*_Point);
         if(OrderSelect(ticket[i],SELECT_BY_TICKET) && OrderCloseTime()>0)
           {
            int cmd=1-OrderType();
            double open=cmd ? Bid : Ask;
            double tp = open - (cmd ? 1 : -1) * TP * _Point;
            double sl = open + (cmd ? 1 : -1) * SL * _Point;
            ticket[i]=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
           }
        }
  }

wir brauchen einen Code für den Prüfer, d.h. die geringstmögliche Anzahl von Prüfungen und die schnellstmögliche Arbeit im Optimierer.

Wie schreibt man diesen Code in MQL5 mit SB CTrade?

 
Igor Makanu:

Hmm, seltsame Situation, wie die Aktivität in dem Thema, das ich angesprochen habe, hatte ich eine Frage, aus meiner Sicht spezifisch, aber statt einer Antwort bekam ich bisher "warum brauchen Sie es?

Ich möchte es mit SB CTrade machen, hier ein Beispiel (zusammengestellt aus 2 meiner Beispiele): Wir eröffnen jeden neuen Bar um 9 TF mit einer Order, wir merken uns das Ticket und bestimmen die Richtung einer geschlossenen Order durch die Ticketnummer.

In MQL4 würde der Code für den Tester wie folgt aussehen

Wie schreibt man diesen Code in MQL5 mit SB CTrade?

Forum für Handel, automatisierte Handelssysteme und Strategietests

FAQ von Anfängern MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.07.21 12:56

Die Grundlage ist also derPOSITION_IDENTIFIER, aber nicht das Positionsticket. Das ist allein schon wegen des Netzes wichtig:

POSITIONSNUMMER

Die Positionskennung ist eine eindeutige Nummer, die jeder neu eröffneten Position zugewiesen wird und sich während ihrer gesamten Lebensdauer nicht ändert. Sie entspricht dem Ticket des Auftrags, mit dem die Position eröffnet wurde.

Die Positionskennung wird in jedem Auftrag (ORDER_POSITION_ID) und jedem Geschäft (DEAL_POSITION_ID) angegeben, mit dem er eröffnet, geändert oder geschlossen wurde. Verwenden Sie diese Eigenschaft, um nach Aufträgen und Geschäften zu suchen, die sich auf die Position beziehen.

Wenn eine Position im Netting-Modus storniert wird (ein einzelnes In/Out-Geschäft), wird die POSITION_IDENTIFIER-Kennung der Position nicht geändert. POSITION_TICKET wird jedoch in das Auftragsticket geändert, das zum Storno geführt hat. Im Absicherungsmodus gibt es keine Positionsumkehr.

lang


Wir müssen also den Positionsbezeichner (POSITION_IDENTIFIER) im Auge behalten.


Nun eine genauere Aufgabe: Beim ersten Durchlauf eröffnen wir eine KAUFPOSITION und speichern sie (ACHTUNG: wir sollten uns die Positions-ID merken, nicht das Ticket). Wenn die Position geschlossen wurde, eröffnen wir eine entgegengesetzte Position: z. B. gab es einmal eine KAUF-Position, dann wurde sie geschlossen, was bedeutet, dass wir sofort eine VERKAUF-Position eröffnen.


Jetzt wird es viel einfacher sein, das Problem zu lösen.


 
Vladimir Karputov:

d.h. CTrade weiß nicht, wie es selbständig feststellen kann, ob eine Order offen oder geschlossen ist, was der Typ der letzten geschlossenen Order war?

Welche Bibliothek sollte ich für diesen Zweck verwenden?

 
Igor Makanu:

D.h. weiß CTrade nicht, wie es selbständig feststellen kann, ob eine Order offen oder geschlossen ist? was war der Typ der letzten geschlossenen Order?

Welche Bibliothek sollten wir für diesen Zweck verwenden?

Ich habe es Ihnen schon hundertmal gesagt, also streichen Sie bitte das Wort "Ordnung" aus Ihrem Wortschatz. Solange Sie das nicht tun, können Sie nicht weitermachen. Wie auch immer, ich werde Ihnen wahrscheinlich nicht helfen können. Das ist sehr schade.

 
Vladimir Karputov:

Ich habe Ihnen schon hundertmal gesagt, dass Sie das Wort "Haftbefehl" aus Ihrem Wortschatz streichen sollten. Solange Sie das nicht tun, können Sie nicht weitermachen. Wie auch immer, ich kann Ihnen wahrscheinlich nicht helfen. Das ist sehr schade.

Nun, sagen Sie mir, was Sie damit meinen:

GN      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Ticket = 20
JF      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Identifier = 0
FQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======closePosition======
HG      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD, close #20 (0.73633 / 0.73637 / 0.73633)
PH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #21  buy 0.10 AUDUSD at 0.73637 done (based on order #21)
 KJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#21  buy 0.10 AUDUSD at 0.73637]
IL      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#21  buy 0.10 AUDUSD at 0.73637]
RN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 position #20  AUDUSD [done at 0.73637]
HN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Позиция с магиком 2544113114312914, тикетом 20 и лотом 0.1 успешно закрыта.
LO      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======checkMargin======
OF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD (0.73633 / 0.73637 / 0.73633)
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #22  buy 0.10 AUDUSD at 0.73637 done (based on order #22)
 RM      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#22  buy 0.10 AUDUSD at 0.73637]
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#22  buy 0.10 AUDUSD at 0.73637]
FF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 AUDUSD [done at 0.73637]
MJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.06.19 16:00:00   balance = 11308.94
JK      0       16:24:14.030    Core 1  2018.06.19 16:00:00   lot = 0.10
HQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Ticket = 22
CJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Identifier = 20
HR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======closePosition======
FI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD, close #22 (0.74021 / 0.74025 / 0.74021)
RF      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #23  sell 0.10 AUDUSD at 0.74021 done (based on order #23)
 ID      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#23  sell 0.10 AUDUSD at 0.74021]
GM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#23  sell 0.10 AUDUSD at 0.74021]
NQ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 position #22  AUDUSD [done at 0.74021]
PO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Позиция с магиком 2544113114312914, тикетом 22 и лотом 0.1 успешно закрыта.
FO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======checkMargin======
OI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD (0.74021 / 0.74025 / 0.74021)
JO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #24  sell 0.10 AUDUSD at 0.74021 done (based on order #24)
 LM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#24  sell 0.10 AUDUSD at 0.74021]
ND      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#24  sell 0.10 AUDUSD at 0.74021]
LI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.74021]
OJ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   balance = 11335.85
DK      0       16:24:14.030    Core 1  2018.07.04 08:00:00   lot = 0.10
PN      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Ticket = 24
QE      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Identifier = 22
NR      0       16:24:14.030    Core 1  2018.07.19 00:00:00   ======closePosition======
NF      0       16:24:14.030    Core 1  2018.07.19 00:00:00   market buy 0.10 AUDUSD, close #24 (0.73968 / 0.73989 / 0.73968)
JI      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal #25  buy 0.10 AUDUSD at 0.73989 done (based on order #25)
 QK      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal performed [#25  buy 0.10 AUDUSD at 0.73989]
MM      0       16:24:14.030    Core 1  2018.07.19 00:00:00   order performed buy 0.10 at 0.73989 [#25  buy 0.10 AUDUSD at 0.73989]
PN      0       16:24:14.030    Core 1  2018.07.19 00:00:00   CTrade::OrderSend: market buy 0.10 position #24  AUDUSD [done at 0.73989]
DO      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Позиция с магиком 2544113114312914, тикетом 24 и лотом 0.1 успешно закрыта.
LP      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Очистка данных произведена.
KK      0       16:24:14.030    Core 1  2018.08.08 16:00:00   ======checkMargin======
RI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   market sell 0.10 AUDUSD (0.73933 / 0.73937 / 0.73933)
GO      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal #26  sell 0.10 AUDUSD at 0.73933 done (based on order #26)
 OM      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal performed [#26  sell 0.10 AUDUSD at 0.73933]
JD      0       16:24:14.030    Core 1  2018.08.08 16:00:00   order performed sell 0.10 at 0.73933 [#26  sell 0.10 AUDUSD at 0.73933]
QI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.73933]
HN      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Ticket = 26
CF      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Identifier = 0
 
Vladimir Karputov:

Ich habe Ihnen schon hundertmal gesagt, dass Sie das Wort "Haftbefehl" aus Ihrem Wortschatz streichen sollten. Solange Sie das nicht tun, können Sie nicht weitermachen. Wie auch immer, ich kann Ihnen wahrscheinlich nicht helfen. Das ist sehr schade.

OK? Lassen Sie mich die Frage anders formulieren:

Wie verwendet man ein erinnertes Ticket mit CTrade::ResultOrder()

um es herauszufinden:

1. ob die Position geschlossen ist?

2. Welche Art von Geschäft hatte die geschlossene Position?

3. wir müssen gleichzeitig 9 Positionen, Aufträge oder Tickets bearbeiten, oder ... OnAnyTerminology für ein Hedge-Konto


Ist meine Frage in dieser Formulierung eindeutig? (reproduzierbares Beispiel unter MQl4, siehe oben)

ZS: Ich kann die Wortfolge nicht vergessen, leider wird dieses Wort in der Hilfe zusammen mit anderen Begriffen verwendet:https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder

 
Igor Makanu:

Hm, es ist eine seltsame Situation, ich schien das Thema angesprochen zu haben, meine Frage war aus meiner Sicht spezifisch, aber statt einer Antwort bekam ich "Wozu brauchen Sie das?

Der Grund dafür ist die Inkompetenz der Rettungskräfte. Ich habe fünf Minuten gebraucht, um ihn zu schreiben, und einen Versuch, ihn zu überprüfen.


MT4

Forum zum Thema Handel, automatische Handelssysteme und Strategietester

Fragen von Anfängern MQL5 MT5 MetaTrader 5

fxsaber, 2019.07.21 12:54

void OnTick()
  {
   static int ticket1 = -1;
   
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-100*_Point,Ask+100*_Point);

   if(OrderSelect(ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd=1-OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : -1) * 100 * _Point;
     double sl = open + (cmd ? 1 : -1) * 100 * _Point;
     ticket1=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
    }
  }


MT5

#include <Trade\Trade.mqh>

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static CTrade Trade; // Не стал возиться с Deviation.
  static ulong ticket1 = 0;
 
  if (!ticket1)
    ticket1 = Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.1, Ask, Ask - 100 * _Point, Ask + 100 * _Point) ? Trade.ResultOrder() : 0;
  else if (!PositionSelectByTicket(ticket1) && HistorySelectByPosition(ticket1))
  {
    ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);
    double open = cmd ? Bid : Ask;
    double tp = open - (cmd ? 1 : -1) * 100 * _Point;
    double sl = open + (cmd ? 1 : -1) * 100 * _Point;
    ticket1 = Trade.PositionOpen(_Symbol, cmd, 0.1, open, sl, tp) ? Trade.ResultOrder() : 0;
  }
}


Sie müssen kein großer Experte sein, um dies zu schreiben, Sie müssen nur die Grundlagen von MT5 kennen.


ZS Beim Netting gibt es eine kleine Nuance bei der Bestimmung der Art der geschlossenen Position. Aber das spielt hier keine Rolle.

 
fxsaber:

Sie müssen nicht stark sein, um dies zu schreiben, Sie müssen nur die Grundlagen von MT5 kennen.

Ich danke Ihnen!

Ja, ich habe nach einer Lösung gesucht, wenn ich es nicht in fünf Zeilen mit SB schreiben kann

Aber wie sehr habe ich verstanden, dass ein SB CTrade nicht in der Lage sein wird, mein Problem zu lösen, und dass ich auch CPositionInfo verwenden muss? - Wenn ich 9 Positionen von mehreren TFs gleichzeitig begleiten möchte?

ZS: Ich sitze in der MQL5-Hilfe mit Smart-TV - recht gut beschriebene Handelsfunktionen, die Verwendung von SatB ist unter einer Frage .... ich denke, es macht Sinn, SB für primitive Strategien zu verwenden, ein bisschen komplizierter - die Funktionalität ist unzureichend oder nicht offensichtlich zu verwenden, vielleicht brauche ich mehr Übung - ich werde versuchen, die SB zu "verdrehen"


Nochmals vielen Dank!

 
fxsaber:

Der Grund ist Inkompetenz, so die Antwort. Ich habe fünf Minuten zum Schreiben und einen Versuch zur Überprüfung gebraucht.


MT4


MT5


Sie müssen kein großer Experte sein, um dies zu schreiben, Sie müssen nur die Grundlagen von MT5 kennen.


Sie müssen die Grundlagen nicht kennen, Sie müssen nur die grundlegenden MT5-Grundlagen kennen. Aber das spielt hier keine Rolle.

Dies ist der Ort, an dem

ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);

ein möglicher Fehler vorliegt.

In der historischen Liste sind die Optionsscheine nicht in der Reihenfolge angeordnet, in der sie in dieser Liste erscheinen. Ich bin bei der Entwicklung der Bibliothek über diese Seite gestolpert. Ich habe mich auf sie verlassen. Aber es stellte sich heraus, dass es nicht so einfach war. Versuchen Sie, Limit- und Stop-Aufträge der Reihe nach in folgender Reihenfolge zu setzen: Limit -> Stop -> Limit -> Stop -> Limit -> Stop und löschen Sie jeden Auftrag in beliebiger Reihenfolge und sehen Sie, welcher Auftrag der letzte ist, der in der Historienliste aufgezeichnet wird. Sie werden überrascht sein.

 
Artyom Trishkin:

Dies ist der Ort, an dem

liegt ein möglicher Fehler vor.

In der Verlaufsliste sind die Aufträge nicht in der Reihenfolge angeordnet, in der sie in der Liste erscheinen. Dies ist mir bei der Entwicklung der Bibliothek aufgefallen. Ich habe mich auf sie verlassen. Aber es stellte sich heraus, dass es nicht so einfach war. Versuchen Sie, Limit- und Stop-Aufträge der Reihe nach in folgender Reihenfolge zu setzen: Limit -> Stop -> Limit -> Stop -> Limit -> Stop und löschen Sie jeden Auftrag in beliebiger Reihenfolge und sehen Sie, welcher Auftrag der letzte ist, der in der Historienliste aufgezeichnet wird. Sie werden überrascht sein.

Hier liegt kein Fehler vor, da die Liste durch HistorySelectByPosition erzeugt wird.