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

 
PolarSeaman:

Sie ersetzten in dem Code

zu

aber es hat nicht geholfen.)

Es tut mir leid, dass das alles ist, was Sie bemerkt haben.)

 
Alekseu Fedotov:

FileSeek() mit dem Flag SEEK_END wird Ihnen helfen.

<

Danke! Ich werde es versuchen!

 
YanSay:

Guten Abend!

Ich rätsele, wie ich einen universellen Code (für verschiedene Instrumente) hinzufügen kann, um das Lot für ein Geschäft auf der Grundlage des Prozentsatzes der Einlage zu berechnen.

Ich habe es so gemacht:

Preis (Eröffnungskurs) und SL (Stop Loss) werden separat berechnet.

Für Paare, bei denen Zitat Währung ist in Dollar (zB EURUSD), für den Index SPX500 und für Gold - alle korrekt berechnet, aber für Paare, bei denen der Dollar ist die erste in einem Zitat (zB USDJPY) funktioniert nicht.

Bitte teilen Sie mir mit, was ich übersehen habe?

Achten Sie auf die Normalisierung

Die Variable _Digits speichert die Anzahl der Dezimalstellen hinter dem Komma, die die Preisgenauigkeit des aktuellen Diagrammsymbols bestimmt.

 
Alekseu Fedotov:

Beachten Sie die Normalisierung

Die Variable _Digits speichert die Anzahl der Dezimalstellen nach dem Komma, die die Genauigkeit des aktuellen Preises des Diagrammsymbols bestimmt.

Ich danke Ihnen! So habe ich es neu gemacht:

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

//2ой вариант
{Lots = NormalizeDouble((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_TICKVALUE))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

In der 1. Variante: EURUSD und XAUUSD - alles korrekt; USDJPY - statt 2% der Einlage riskiert er 0,2% der Einlage; bei SPX500 und BRN erzeugt er den OrderSend-Fehler 131 (Fehler in der Lot-Berechnung).

In der 2. Variante: EURUSD, XAUUSD und USDJPY - alles ist korrekt; SPX500 riskiert 20% der Einlage statt 2%; für BRN generiert es OrderSend-Fehler 131 (ein Fehler bei der Lot-Berechnung).

Es gibt einen Fehler irgendwo anders, ich kann nicht verstehen, an welcher Stelle, bitte beraten.

 
YanSay:

Ich danke Ihnen! So wird es neu gemacht:

Die erste Version: EURUSD und XAUUSD - alles ist korrekt; USDJPY - es riskiert 0,2% der Einlage anstelle von 2% der Einlage; der Fall mit SPX500 und BRN zeigt sogar OrderSend Fehler 131 (Fehler in der Lot-Berechnung).

In der 2. Variante: EURUSD, XAUUSD und USDJPY - alles ist korrekt; SPX500 riskiert 20% der Einlage statt 2%; für BRN generiert es OrderSend-Fehler 131 (ein Fehler bei der Lot-Berechnung).

Irgendwo anders gibt es einen Fehler, ich kann nicht verstehen, an welcher Stelle, bitte beraten.

Ersetzen SiePunkt, durchMarketInfo(Symbol(),MODE_POINT)

 
Vitaly Muzichenko:

Ersetzen SiePunkt, durchMarketInfo(Symbol(),MODE_POINT)

Was ist der Grund? Wenn alles nach Diagrammsymbolen berechnet wird. Es ist sinnvoll, wenn eine Multivariable und ein anderes Symbol als das aktuelle Diagramm berechnet wird.

 
Vitaly Muzichenko:

Ersetzen SiePunkt, durchMarketInfo(Symbol(),MODE_POINT)

Leider hat es nicht geholfen(

Die MODE_POINT-Information besagt "Punktgröße in der Kurswährung. Er wird in der vordefinierten Variable Punkt für das aktuelle Symbol" gespeichert.

Nach der Beschreibung zu urteilen, spielt es keine Rolle, welche Variante Sie verwenden. Aber ich habe es versucht und es hat nicht geholfen.


 

Können Sie mir sagen, ob es möglich ist, eine "Auswahl" eines grafischen Werkzeugs auf die Schaltfläche im Expert Advisor zu legen, so dass beim Klicken auf die Schaltfläche das Werkzeugsymbol unter dem Cursor erscheint und es möglich wäre, es zu strecken?

Und der Kanal sollte bereits bestimmte Eigenschaften haben

 
Roman Sharanov:

Können Sie mir sagen, ob es möglich ist, eine "Auswahl" eines grafischen Werkzeugs auf die Schaltfläche im Expert Advisor zu legen, so dass beim Klicken auf die Schaltfläche das Werkzeugsymbol unter dem Cursor erscheint und es möglich wäre, es zu strecken?

Außerdem kann der Kanal bereits bestimmte Eigenschaften haben.

Vielleicht

 
YanSay:

Leider hat es nicht geholfen(

Und in den MODE_POINT-Informationen heißt es "Punktgröße in Kurswährung. Denn das aktuelle Symbol wird in der vordefinierten Variablen Point" gespeichert.

Nach der Beschreibung zu urteilen, spielt es keine Rolle, welche Variante Sie verwenden. Aber ich habe es versucht und es hat nicht geholfen.

Probieren Sie die Funktion aus:

//===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot(double Percent=1, double Stloss=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 double TickValue   =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE),
        TickSize    =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE),
        ContractSize=SymbolInfoDouble(symb,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MIN),
        Max_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX),
        Step        =SymbolInfoDouble(symb,SYMBOL_VOLUME_STEP),
        Free        =AccountInfoDouble(ACCOUNT_FREEMARGIN),
        Lots_New    =0.0;
 int CalcMode=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_CALC_MODE);

  if(Percent > 100) Percent = 100;
  if(Stloss <=0) return(0);
  if(Percent == 0) Lots_New = Min_Lot;
   else {
    if(CalcMode==0 || CalcMode==4)
      Lots_New = MathFloor((((Free*Percent/100)/Stloss)/TickValue)/Step)*Step;
    if(CalcMode==1||CalcMode==2||CalcMode==3)
      Lots_New = MathFloor(((((Free*Percent)/100)/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if(Lots_New > Max_Lot) Lots_New = Max_Lot;
   if(Lots_New < Min_Lot) return(0);
  return(NormalizeDouble(Lots_New,/*LotDigit()*/ 2));
 }