Fehler, Irrtümer, Fragen - Seite 2020

 
Kirill Belousov:

Die Funktion OrderCalcMargin berücksichtigt bei der Berechnung der Marge nicht den Eröffnungskurs

Ist dies ein Fehler oder sollte es einer sein?

Natürlich ist sie das. Schreiben Sie auf die SD-Karte.

Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));

Diese Zeile funktioniert so, wie sie sollte, aber ich musste sie überprüfen, da ich die Reihenfolge der Ausführung erraten muss. Diskussion zu diesem Punkt hier.

 
fxsaber:

Natürlich ein Fehler. Schreiben Sie auf die SD-Karte.

Diese Zeile funktioniert so, wie sie sollte, aber ich musste das überprüfen, da ich die Reihenfolge der Ausführung erraten muss. Diskussion zu diesem Punkt hier.

Die Reihenfolge der Berechnungsausdrücke in Print() ist von rechts nach links. Irgendwie... Bis jetzt... Ich habe es auch vorher überprüft :)


Es ist schwer, sicher zu sein, wenn es einendirekten Widerspruch in der MQL4/5-Referenz gibt:

MQL5 ReferenzGrundlagen der SpracheFunktionenParameterübergabe

Hinweis

Denken Sie daran, dass die Parameter in umgekehrter Reihenfolge an die Funktion übergeben werden, d. h. der letzte Parameter wird zuerst berechnet und übergeben, dann der vorletzte und so weiter. Der Parameter, der der erste nach der öffnenden Klammer ist, wird berechnet und als letzter an die Funktion übergeben.


MQL5 ReferenzGrundlagen der SpracheOperationen und AusdrückeAndere Operationen

Funktionsaufruf mit Argumenten x1, x2,..., xn

Jedes Argument kann eine Konstante, eine Variable oder ein Ausdruck des entsprechenden Typs sein. Übergebene Argumente werden durch Kommata getrennt und müssen in Klammern eingeschlossen werden, wobei die öffnende Klammer auf den Funktionsnamen folgen muss.

Der Wert des Ausdrucks ist der Wert, der von der Funktion zurückgegeben wird. Wenn der Rückgabetyp einer Funktion ungültig ist, kann der Funktionsaufruf nicht rechts von der Zuweisungsoperation platziert werden. Beachten Sie, dass die Reihenfolge der Ausdrücke x1,..., xn garantiert ist.


Bislang konzentriere ich mich auf die Übergabe von Parametern in umgekehrter Reihenfolge.

 
Kirill Belousov:

In einem benachbarten Threadhttps://www.mql5.com/ru/forum/216697/page3 wurde eine Frage zu OrderCalcMargin aufgeworfen.


Test: Prüfen wir 2 verschiedene Möglichkeiten zur Berechnung der Einlage, indem wir verschiedene Eröffnungspreise einsetzen.

Hier ist das LOG

Die Funktion OrderCalcMargin berücksichtigt bei der Berechnung der Marge nicht den Eröffnungskurs

Dies scheint mit dem Wechselkurs der angegebenen Währung zusammenzuhängen, der für den Zeitpunkt und den Eröffnungskurs neu berechnet werden muss.

Wenn die notierte Währung USD ist (und die Kontowährung ebenfalls USD ist), dann ändert sich die berechnete Marge entsprechend dem Eröffnungskurs.

Protokoll für GBPUSD

Ist es ein Fehler oder sollte es einer sein?

Wahrscheinlich sollte es so sein, denn insbesondere AUDUSD und USDJPY sind an der Berechnung beteiligt, und ihre Kurse sind zum Zeitpunkt der Berechnung konstant.

Nun, dieser Gedanke bringt mich dazu, zu überprüfen... Im MetaQuotes-Demokonto ist in der Marktübersicht GBPUSD vorhanden, aber nicht im Robokonto...

 
Alexey Viktorov:

Dies muss der Fall sein, da insbesondere AUDUSD und USDJPY in die Berechnung einbezogen werden und ihre Notierungen zum Zeitpunkt der Berechnung unverändert sind.

Nun, dieser Gedanke bringt mich dazu, zu überprüfen... GBPUSD ist im MetaQuotes-Demo-Konto vorhanden, aber nicht im Robo-Konto...

Ich wollte Ihnen nur sagen, dass es einen Fehler gibt.

Ich habe Ihre Situation bereits mit Margin=0 in der OrderCalcMargin-Berechnung reproduziert.

Ich habe es nur noch nicht veröffentlicht.

 
Alexey Viktorov:

Im MetaQuotes-Demokonto ist GBPUSD in Market Watch vorhanden, aber nicht im Robo-Konto...

Höchstwahrscheinlich in Market Watch vorhanden (nicht zu verwechseln mit der allgemeinen Liste der Symbole), aber nicht angezeigt.

 
Alexey Viktorov:

Dies muss der Fall sein, da vor allem AUDUSD und USDJPY in die Berechnung einbezogen werden und ihre Kurse zum Zeitpunkt der Berechnung unverändert sind.

Nun, dieser Gedanke bringt mich dazu, zu überprüfen... Im MetaQuotes-Demokonto ist in der Marktübersicht GBPUSD vorhanden, aber nicht im Robokonto...

Hier ist der Test:

#define  TOSTRING(A) #A+" = "+(string)(A)
void OnStart()
  {
   double margin_1=999,price_1;

   Print(TOSTRING(price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print(TOSTRING(price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print(TOSTRING(price_1=10.0));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print(TOSTRING(price_1=1.0));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
   Print("price_1= ",price_1," margin_1= ",NormalizeDouble(margin_1,8)," ",TOSTRING(MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1)));
//выведем признак выбранности мажоров
   Print(TOSTRING(SymbolInfoInteger("GBPUSD",SYMBOL_SELECT)));
   Print(TOSTRING(SymbolInfoInteger("USDJPY",SYMBOL_SELECT)));
   Print(TOSTRING(SymbolInfoInteger("USDCAD",SYMBOL_SELECT)));
   Print(TOSTRING(SymbolInfoInteger("AUDUSD",SYMBOL_SELECT)));
   Print(TOSTRING(SymbolInfoInteger("NZDUSD",SYMBOL_SELECT)));
   Print(TOSTRING(SymbolInfoInteger("USDCHF",SYMBOL_SELECT)));
   Print(TOSTRING(SymbolInfoInteger("EURUSD",SYMBOL_SELECT)));
   for(int i=SymbolsTotal(false)-1;i>=0;i--)
     {
       //проверим для каждого символа брокера ситуацию, когда OrderCalcMargin()==true, а маржа=0
       if(OrderCalcMargin(ORDER_TYPE_BUY,SymbolName(i,false),0.1,SymbolInfoDouble(SymbolName(i,false),SYMBOL_ASK),margin_1)==true && margin_1==0)
        {
         Print(TOSTRING(SymbolName(i,false))," ",TOSTRING(margin_1)," ");
        }
     }
  }

// Альтернатива OrderCalcMargin
bool MyOrderCalcMargin(const ENUM_ORDER_TYPE action,const string symbol,const double volume,const double price,double &margin)
  {
   double MarginInit,MarginMain;

   const bool Res=SymbolInfoMarginRate(symbol,action,MarginInit,MarginMain);

   margin=Res ? MarginInit*price*volume*SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_VALUE)/
          (SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE)*AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0;

   return(Res);
  }

1. Kreuze in MarketWatch auswählen, alles mit USD ausblenden

2) Fügen Sie das Symbol DSHBTC hinzu und öffnen Sie dessen Chart.

3. Terminal schließen

4) Öffnen Sie das Terminal

5. Starten wir den Test für DSHBTC

Hier ist das LOG:

JM      0       09:26:05.485    test (DSHBTC,H1)        price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK) = 0.07183
QK      0       09:26:05.487    test (DSHBTC,H1)        price_1= 0.07183 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
KO      0       09:26:05.487    test (DSHBTC,H1)        price_1= 0.07183 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
QN      0       09:26:05.487    test (DSHBTC,H1)        price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID) = 0.07079000000000001
NJ      0       09:26:05.487    test (DSHBTC,H1)        price_1= 0.07079000000000001 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
HO      0       09:26:05.487    test (DSHBTC,H1)        price_1= 0.07079000000000001 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
LL      0       09:26:05.487    test (DSHBTC,H1)        price_1=10.0 = 10.0
EE      0       09:26:05.487    test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
QF      0       09:26:05.487    test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
HD      0       09:26:05.487    test (DSHBTC,H1)        price_1=1.0 = 1.0
EN      0       09:26:05.487    test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
OM      0       09:26:05.487    test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
EN      0       09:26:05.487    test (DSHBTC,H1)        SymbolInfoInteger(GBPUSD,SYMBOL_SELECT) = 0
GI      0       09:26:05.487    test (DSHBTC,H1)        SymbolInfoInteger(USDJPY,SYMBOL_SELECT) = 0
DS      0       09:26:05.487    test (DSHBTC,H1)        SymbolInfoInteger(USDCAD,SYMBOL_SELECT) = 0
JL      0       09:26:05.487    test (DSHBTC,H1)        SymbolInfoInteger(AUDUSD,SYMBOL_SELECT) = 0
JF      0       09:26:05.487    test (DSHBTC,H1)        SymbolInfoInteger(NZDUSD,SYMBOL_SELECT) = 0
MQ      0       09:26:05.487    test (DSHBTC,H1)        SymbolInfoInteger(USDCHF,SYMBOL_SELECT) = 0
HK      0       09:26:05.487    test (DSHBTC,H1)        SymbolInfoInteger(EURUSD,SYMBOL_SELECT) = 0
LH      0       09:26:05.488    test (DSHBTC,H1)        SymbolName(i,false) = DSHBTC margin_1 = 0.0 
RS      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = NZDJPY margin_1 = 0.0 
FE      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = NZDCHF margin_1 = 0.0 
QO      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = NZDCAD margin_1 = 0.0 
RP      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = GBPNZD margin_1 = 0.0 
JD      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = GBPCAD margin_1 = 0.0 
CN      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = GBPJPY margin_1 = 0.0 
KP      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = GBPCHF margin_1 = 0.0 
JK      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = GBPAUD margin_1 = 0.0 
QL      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = EURNZD margin_1 = 0.0 
RG      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = EURJPY margin_1 = 0.0 
RH      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = EURGBP margin_1 = 0.0 
HS      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = EURCHF margin_1 = 0.0 
CD      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = EURCAD margin_1 = 0.0 
GO      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = EURAUD margin_1 = 0.0 
QP      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = CHFJPY margin_1 = 0.0 
JJ      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = CADJPY margin_1 = 0.0 
JL      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = CADCHF margin_1 = 0.0 
QF      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = AUDNZD margin_1 = 0.0 
NI      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = AUDJPY margin_1 = 0.0 
JS      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = AUDCHF margin_1 = 0.0 
EF      0       09:26:05.489    test (DSHBTC,H1)        SymbolName(i,false) = AUDCAD margin_1 = 0.0 

Alle Kreuze zeigen Marge=0 und es wurden KEINE GROSSEN KREUZE ausgewählt.

Führen Sie das Skript erneut auf DSHBTC aus

LOG

HF      0       09:29:07.268    test (DSHBTC,H1)        price_1=SymbolInfoDouble(Symbol(),SYMBOL_ASK) = 0.07185999999999999
IQ      0       09:29:07.268    test (DSHBTC,H1)        price_1= 0.07185999999999999 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
KP      0       09:29:07.268    test (DSHBTC,H1)        price_1= 0.07185999999999999 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
DE      0       09:29:07.269    test (DSHBTC,H1)        price_1=SymbolInfoDouble(Symbol(),SYMBOL_BID) = 0.07087
OQ      0       09:29:07.269    test (DSHBTC,H1)        price_1= 0.07087 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
MQ      0       09:29:07.269    test (DSHBTC,H1)        price_1= 0.07087 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
QP      0       09:29:07.269    test (DSHBTC,H1)        price_1=10.0 = 10.0
HI      0       09:29:07.269    test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
LK      0       09:29:07.269    test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
MH      0       09:29:07.269    test (DSHBTC,H1)        price_1=1.0 = 1.0
HR      0       09:29:07.269    test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
NP      0       09:29:07.269    test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 MyOrderCalcMargin(ORDER_TYPE_BUY,_Symbol,0.1,price_1,margin_1) = true
GR      0       09:29:07.269    test (DSHBTC,H1)        SymbolInfoInteger(GBPUSD,SYMBOL_SELECT) = 1
FM      0       09:29:07.269    test (DSHBTC,H1)        SymbolInfoInteger(USDJPY,SYMBOL_SELECT) = 0
JG      0       09:29:07.269    test (DSHBTC,H1)        SymbolInfoInteger(USDCAD,SYMBOL_SELECT) = 1
DP      0       09:29:07.269    test (DSHBTC,H1)        SymbolInfoInteger(AUDUSD,SYMBOL_SELECT) = 1
DJ      0       09:29:07.269    test (DSHBTC,H1)        SymbolInfoInteger(NZDUSD,SYMBOL_SELECT) = 1
OE      0       09:29:07.269    test (DSHBTC,H1)        SymbolInfoInteger(USDCHF,SYMBOL_SELECT) = 1
FO      0       09:29:07.269    test (DSHBTC,H1)        SymbolInfoInteger(EURUSD,SYMBOL_SELECT) = 1
DD      0       09:29:07.269    test (DSHBTC,H1)        SymbolName(i,false) = DSHBTC margin_1 = 0.0 

Es gibt keine Hauptkomponenten, nur USDJPY ist die einzige.

Alle Tests wurden mit MetaQuotes durchgeführt


 
fxsaber:

Höchstwahrscheinlich im Market Watch vorhanden (nicht zu verwechseln mit der allgemeinen Symbolliste), aber nicht angezeigt.

Wir sprechen auf unterschiedliche Art und Weise über dieselbe Sache


 
Alexey Viktorov:

Wir sprechen auf unterschiedliche Art und Weise über dieselbe Sache

Ganz genau. Der Market Watch zeigt es nicht an, aber es ist da.

 
Kirill Belousov:
for(int i=SymbolsTotal(false)-1;i>=0;i--)
Einstellen.
 
fxsaber:
Reparieren Sie es.

Erledigt!

P.S. Ich habe vergessen, die Reserve zu entfernen :)