Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 740

 
evillive:
Ich spreche vom Spielfeld, nicht vom Mindestparkplatz, aber gut, vergessen Sie es.
Oh, ja, natürlich, wenn man nicht für sich selbst schreibt, muss man das berücksichtigen.
 
evillive:

Danke, das wurde mir schon erklärt :D

Es ist klar, dass für mich selbst schreibe ich mit allen Kontrollen, wie es sein sollte, gab es nur einen Umriss, wie die Partie zu balancieren/10, um das Verhältnis zu bringen, aber die Idee war erfolglos ...

Aber Sie haben eine Menge Text, es könnte einfacher sein:

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;

Es könnte noch einfacher sein. Nur, was passiert, wenn MarketInfo() für Lotstep 0 zurückgibt? Was werden die Folgen sein? Der Expert Advisor wird gestoppt und die Positionen werden aufgegeben?

Und wenn MINLOT vom Broker auf 0,03 und LOTSTEP auf 0,02 gesetzt ist, d.h. die ersten beiden zulässigen Lot-Werte sind 0,03 und 0,05, und der aktuelle Saldo ist 41 - was wird der Wert des berechneten Lots in Ihrem Code sein?

Warum nimmt Ihr Code in diesem Fall den Wert MINLOT an, der 0,03 betragen kann, d.h. 30 Mal mehr als der "rohe" Wert von "Kontostand()*0,001", der in diesem Fall 0,001 beträgt, wenn der Betrag kleiner als der Minimalwert ist - z.B. bei einem Kontostand von 1 wird er gleich 0 sein, nachdem der Ausdruck vollständig berechnet wurde?

Sie können nicht immer einen gültigen Wert für ein Los erhalten, da die Bedingungen so beschaffen sein können, dass KEINER der gültigen Werte für ein Los ihnen entspricht. Alle fehlerhaften Situationen müssen programmiert werden, und man darf nicht vergessen, dass dies mindestens 90 % der Arbeit ausmacht.

Das von MetaQuotes verwendete Modell lautet: Lot = MINLOT + N * LOTSTEP, wobei N = 0, 1, 2... M. Und M ist so, dass MINLOT + M * LOTSTEP <= MAXLOT und MINLOT + (M + 1) * LOTSTEP > MAXLOT. Dementsprechend sollten Sie auch im Rahmen des Mengenmodells rechnen, d.h. Lot = MINLOT + N * LOTSTEP. Dann werden alle möglichen ungeschickten Kombinationen von MINLOT und LOTSTEP unwichtig, weil die Formel allgemein funktioniert. Wenn man es richtig geschrieben hat, es richtig debuggt und sich auf etwas anderes Interessantes und Lustiges konzentriert. Und mit Vergnügen - denn Sie müssen nicht ständig zu schlecht geschriebenem Code zurückkehren, weil dieser wieder einmal nicht funktioniert, sondern nur Pannen aufweist...

 
simpleton:

Es könnte noch einfacher sein. Aber was passiert, wenn MarketInfo() für Lotstep 0 zurückgibt? Was werden die Folgen sein? Der Expert Advisor wird gestoppt und die Positionen werden aufgegeben?

Wenn der Wert von MINLOT von einem Broker auf 0,03 und LOTSTEP auf 0,02 gesetzt wird, d.h. die ersten beiden Lot-Werte sind 0,03 und 0,05, und der aktuelle Saldo ist 41, was ist der Wert des berechneten Lots in Ihrem Code?

Warum, wenn die Menge kleiner als der Minimalwert ist - z.B. bei einem Kontostand von 1 - wird sie nach der vollständigen Berechnung gleich 0 sein? Warum nimmt Ihr Code in diesem Fall die Menge gleich MINLOT, die z.B. 0,03 sein kann, was 30 Mal mehr ist als der "rohe" Wert "AccountBalance()*0,001", der in diesem Fall gleich 0,001 ist?

Sie können nicht immer einen gültigen Wert für ein Los erhalten, da die Bedingungen so beschaffen sein können, dass KEINER der gültigen Werte für ein Los ihnen entspricht. Alle fehlerhaften Situationen müssen programmiert werden, und man darf nicht vergessen, dass dies mindestens 90 % der Arbeit ausmacht.

Das von MetaQuotes verwendete Modell lautet: Lot = MINLOT + N * LOTSTEP, wobei N = 0, 1, 2... M. Und M ist so, dass MINLOT + M * LOTSTEP <= MAXLOT und MINLOT + (M + 1) * LOTSTEP > MAXLOT. Dementsprechend sollten Sie auch im Rahmen des Mengenmodells rechnen, d.h. Lot = MINLOT + N * LOTSTEP. Dann werden alle möglichen ungeschickten Kombinationen von MINLOT und LOTSTEP unwichtig, weil die Formel allgemein funktioniert. Wenn man es richtig geschrieben hat, es richtig debuggt und sich auf etwas anderes Interessantes und Lustiges konzentriert. Und mit Vergnügen - denn Sie müssen nicht ständig zu schlecht geschriebenem Code zurückkehren, weil dieser wieder einmal nicht funktioniert, sondern nur Pannen aufweist...

Bei solchen Schrecken wird auch geprüft, ob die Mittel ausreichen, um eine solche Partie zu eröffnen. Niemand, der bei Verstand ist, würde einem Roboter erlauben, 10 Pfund einzuzahlen, wenn er weiß, dass der Mindestbetrag 0,1 und der Schritt 0,1 beträgt.

Und wenn so ein schlaues Kerlchen gefunden würde, würde der Roboter ihm sagen: "Gib mir das Geld und leb wohl in der Zwischenzeit" :D.

Und ich habe nirgendwo gesehen oder gelesen, dass die Losgröße Null ist, das ist ein Hirngespinst...

 
evillive:

Bei solchen Schrecken wird auch geprüft, ob die Mittel ausreichen, um eine solche Partie zu eröffnen. Niemand, der bei klarem Verstand ist, würde einem Roboter erlauben, 10 Pfund einzuzahlen, wenn er weiß, dass das Mindestlos 0,1 und der Schritt beispielsweise 0,1 beträgt.

Und wenn so ein schlaues Kerlchen gefunden wird, sagt der Roboter zu ihm: "Gib mir das Geld, aber bis dahin sag auf Wiedersehen" :D

Um Nullen von MarketInfo im Tester zu vermeiden, mache ich dies:

  double AFM = AccountFreeMargin(); 
  double StopLevel,FreezeLevel,spr,prot;
  if(IsOptimization() || IsTesting() || IsVisualMode())
  {
    MinLot = 0.1;
    LotStep = 0.01;
    spr = Point*10;
    StopLevel = spr*2;
    FreezeLevel = spr*2;
  }
  else
  {
    MinLot = MarketInfo(Symbol(),MODE_MINLOT);
    LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
    spr = MarketInfo(Symbol(),MODE_SPREAD)*Point;
    StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
    FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point;
  }
  if(MM == 1) 
  lot = MinLot+MathMax(LotStep*MathFloor((AFM-initdepo)*risk/100),0); 
  else if(MM == 0) lot = MinLot;
 
evillive:

Bei solchen Schrecken wird auch geprüft, ob die Mittel ausreichen, um eine solche Partie zu eröffnen. Niemand, der bei klarem Verstand ist, würde einem Roboter erlauben, 10 Pfund einzuzahlen, wenn er weiß, dass das Mindestlos 0,1 und die Erhöhung 0,1 beträgt.

Und wenn so ein schlaues Kerlchen gefunden würde, würde der Roboter ihm sagen: "Gib mir das Geld und auf Wiedersehen" :D

Und ich habe nirgendwo gesehen oder gelesen, dass die Losgröße Null ist, das ist eine Vorstellung...

Warum ist es schrecklich? Weil es nicht in das vereinfachte Modell passt?

Ich meinte, dass bei MINLOT = 0,03 und LOTSTEP = 0,02 die ersten beiden zulässigen Lot-Werte 0,03 und 0,05 sind. Wenn der Saldo z.B. 41 ist, dann ist Ihr Code:

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Ergibt einen Lotwert von 0,04, was nicht zulässig ist. Der Roboter sagt dann etwas wie "Der Server sagt, dass meine Losgröße falsch ist".

Und eine Losgröße von Null kann erreicht werden, wenn bei der Abfrage des Wertes durch MarketInfo() ein Fehler auftritt. Ich habe Ihnen den Code gegeben, mit dem Sie diesen Fehler künstlich herbeiführen können:

Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));

Das Ergebnis ist 0. Was für eine Art von Fantasie ist das?

 
simpleton:

Warum das Grauen? Weil es nicht in das vereinfachte Modell passt?

Ich meinte, dass bei MINLOT = 0,03 und LOTSTEP = 0,02 die ersten beiden zulässigen Loswerte 0,03 und 0,05 sind. Wenn der Saldo also beispielsweise 41 beträgt, dann ist Ihr Code:

Ergibt einen Lotwert von 0,04, was nicht zulässig ist. Der Roboter sagt dann etwas wie "Der Server sagt, dass meine Losgröße falsch ist".

Und eine Losgröße von Null kann erreicht werden, wenn bei der Abfrage des Wertes durch MarketInfo() ein Fehler auftritt. Ich habe Ihnen den obigen Code gegeben, mit dem Sie diesen Fehler künstlich herbeiführen können:

Es wird 0 zurückgegeben. Was ist also die Fantasie?

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);

Diese Formel kann leicht korrigiert werden, um die Anforderungen zu erfüllen. Sie müssen nur die Mindestmenge beachten

Es wird ein wenig anders aussehen

lot=Min_Lot+lotstep*MathRound((AccountBalance()-X)*0.001/lotstep);

Wobei X - Saldo für die Eröffnung der minimalen Partie,

Der Scheck für die Mindestmenge wird jedoch weiterhin benötigt.

 

Guten Tag!

Hilfe für einen Unwissenden ) Im Tester keine Aufträge öffnen Fehler 10013 Falsche Anfrage, schauen Sie sich den Code, wo der Fehler ist.

Alle Nummern im Journal werden auf dem Auftrag angezeigt und der Auftrag lässt sich nicht öffnen.

2014.10.19 12:14:34.984 2014.02.03 00:06:00 failed request buy 0.10 at 102.31100 sl: 102.27200 tp: 102.33600 [Ungültige Anfrage]

2014.10.19 12:22:17.928 2014.02.03 00:06:00 ticket =0 retcode =10013

MqlTradeRequest Req;
MqlTradeResult  Res;
   string TradeSmb;
   if(TradeSmb=="") TradeSmb=_Symbol;
   Req.action=TRADE_ACTION_DEAL;
   Req.symbol=TradeSmb;
   Req.volume=0.1;
   Req.type=ORDER_TYPE_BUY;
   Req.type_filling=ORDER_FILLING_IOC;
   Req.price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   Req.sl= NormalizeDouble(sym_bid - (StopLoss*sym_point),sym_digits);
   Req.tp= NormalizeDouble(sym_ask + (TakeProfit*sym_point),sym_digits);
   Req.deviation=3;
   Req.comment="777";
if(OrderSend(Req,Res))
{
      Print("Sent...");
}
      Print("ticket =",Res.order,"   retcode =",Res.retcode);
      if(Res.order!=0)
     {
      datetime tm=TimeCurrent();
      //--- request all history
      HistorySelect(0,tm);
      string comment;
      bool result=HistoryOrderGetString(Res.order,ORDER_COMMENT,comment);
      if(result)
        {
         Print("ticket:",Res.order,"    Comment:",comment);
        }
Drummer hat Ihre Nachricht korrigiert
 

Wo sehen Sie das?!

if(OrderSend(Req,Res))

Siehe die Dokumentation! Und verwenden Sie die SRC-Schaltfläche, um den Code einzufügen!

Wenn Sie zu faul sind, sehen Sie sich das 1. und letzte Mal an:

int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

Es ist nie schlecht, etwas zu lernen!

 

Sehr geehrte Damen und Herren!

Bitte beraten.....

Hier ist eine Funktion

AuftragGewinn( )

Diese Funktion gibt den Nettogewinnwert für den ausgewählten Auftrag zurück.

QUESTION

Diese Funktion gibt, ähnlich wie die oben genannte Funktion, den Verlustwert für den ausgewählten Auftrag anstelle des Gewinnwertes zurück.

D.h. wenn eine Order auf SL mit einem Verlust von $150 geschlossen wird, muss die Funktioneinen Verlust von $150 zurückgeben.

Ich danke Ihnen.

 
solnce600:

Sehr geehrte Damen und Herren!

Bitte beraten.....

Hier ist eine Funktion

AuftragGewinn( )

Diese Funktion gibt den Nettogewinnwert für den ausgewählten Auftrag zurück.

QUESTION

Diese Funktion liefert wie die obige Funktion einen Verlustwert für den ausgewählten Auftrag anstelle eines Gewinns.

D.h. wenn eine Order auf SL mit einem Verlust von $150 geschlossen wird, muss die Funktioneinen Verlust von $150 zurückgeben.

Ich danke Ihnen.

Es ist dasselbe! Nur der Betrag wird mit einem Minus ausgewiesen.
Grund der Beschwerde: