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

 
Alexey Viktorov:
Ja, nun... Wo kann ich einen solchen Makler finden... Können Sie mir einen Link geben?
Das ist richtig. Kauf schließt zum Gebot
 
Ich entschuldige mich für meine Unaufmerksamkeit. Ich lese "öffnet"...
 

Guten Tag,

Frage:

Können Sie mir bitte sagen, warum ich keinen Kauf anhängig machen kann?

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

Wenn Offset=1 , dannwird Fehler erscheinen:

fehlgeschlagener Kaufstopp 0,10 AUDNZD.m bei 1,03748 [Ungültiger Preis], d.h.kleines Niveau Preis (in mein Fall)

Wenn derselbe "Ausführungsbefehl" direkt danach erteilt wird

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

alles funktioniert einwandfrei (d. h. die Bestellung wird aufgegeben):

Auftrag Kauf 0,10 zu 1,03747 [#2 Kauf 0,10 AUDNZD.m zu 1,03747]

Warum wird der Antrag auf einen schwebenden Auftrag(1,03748) nicht angenommen, d.h.bei 1,03747 wird er erteilt, aber bei 1,03748 nicht? (weilSYMBOL_ASK den Spread und den Offset berücksichtigt - der Offset vom aktuellen Preis für die Platzierung der Order in Punkten wird um 1 erhöht)

Aber bei offset=100: pending BUY_STOP price = 1.03847 - es funktioniert bereits


Ich danke Ihnen.
 
Konstantin_78:

Guten Tag,

Frage:

Können Sie mir bitte sagen, warum ich keinen Kauf anhängig machen kann?

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

Wenn Offset=1 , dannwird Fehler erscheinen:

fehlgeschlagener Kaufstopp 0,10 AUDNZD.m bei 1,03748 [Ungültiger Kurs], d.h.kleines Kursniveau (in meinem Fall)

Wenn ich einen "Ausführungsauftrag" unmittelbar nach

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

alles funktioniert einwandfrei (d. h. die Bestellung wird aufgegeben):

Auftrag Kauf 0,10 zu 1,03747 [#2 Kauf 0,10 AUDNZD.m zu 1,03747]

Warum wird der Antrag auf einen schwebenden Auftrag(1,03748) nicht angenommen, d.h.bei 1,03747 wird der Auftrag erteilt, aber bei 1,03748 ist der Auftrag klein?

Aber wenn offset=100: pending BUY_STOP price = 1.03847, funktioniert es schon.


Ich danke Ihnen.

Sie haben bereits Ihre eigene Frage beantwortet.

Es gibt einen Parameter "stoplevel" -- minimal notwendiger Abstand vom aktuellen Preis zum Preis der Platzierung einer Pending Order -- für jedes Symbol hat seinen eigenen Wert und wird in den Handelsbedingungen festgelegt

 
Andrey F. Zelinsky:

Вы же сами и ответили на свой вопрос.

Есть такой параметр stoplevel -- минимально необходимое расстояние от текущей цены до цены установки отложенного ордера -- для каждого инструмента своё значение и задаётся в торговых условиях 

Dann wäre es wahrscheinlich angemessen, zu schreiben

Preis =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)*Punkt

Obwohl, wenn Sie geschrieben haben "...vom aktuellen Preis", was hat das mit dem Spread zu tun? Dieser ist in SYMBOL_ASK enthalten (da SYMBOL_ASK = offener Preis + Spread).

 
Vladimir Karputov:

Ich habe ein Beispiel beigefügt, um Ihnen zu helfen...

Ich verstehe, das Beispiel hat geholfen. Ich danke Ihnen.


Ich habe eine Frage.

Wenn ich die Menge erhöhe, gibt es irgendwann nicht mehr genug freie Mittel, und ich muss mit einer erhöhten Menge eröffnen.

Das heißt, die maximale Menge einzugeben, so viel wie FreeMargin erlaubt.

Wie diese Bedingung zu schreiben ist: Wenn nicht genügend Mittel vorhanden sind, um die Position mit dem berechneten Lot zu eröffnen, sollte die Funktion das maximal mögliche Lot zur Eröffnung der Position zurückgeben.

double LotA()
{
   double Lot=FirstLot;

   if(DoublingCount<=0) return Lot;
   double MaxLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double MainLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(Lot<MainLot)Lot=MainLot;
     if(Lot>MaxLot)Lot=MaxLot;
   double lt1=Lot;
   HistorySelect(0,TimeCurrent());
   if(HistoryOrdersTotal()==0)return(Lot);
   double cl=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-1),ORDER_PRICE_OPEN);
   double op=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_PRICE_OPEN);

   long typeor=HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_TYPE);
   if(typeor==ORDER_TYPE_BUY)
     {
      if(op>cl)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(typeor==ORDER_TYPE_SELL)
     {
      if(cl>op)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(lt1>MaxLot)lt1=MaxLot;
   lt1=LotCheck(lt1);
   return(lt1);
  }
//+------------------------------------------------------------------+}
 
Marina Korotkih:

Ich verstehe, das Beispiel hat geholfen. Ich danke Ihnen.


Nun diese Frage.

Wenn ich die Menge erhöhe, gibt es irgendwann nicht mehr genug freie Mittel, und ich muss mit einer größeren Menge eröffnen.

Das heißt, die maximale Menge einzugeben, so viel wie FreeMargin erlaubt.

Wie diese Bedingung zu schreiben ist: Wenn nicht genügend Mittel vorhanden sind, um die Position mit dem berechneten Lot zu eröffnen, sollte die Funktion das maximal mögliche Lot zur Eröffnung der Position zurückgeben.

               

double Mgn,Lot=0,BID,ASK;

    BID=SymbolInfoDouble(_Symbol,SYMBOL_BID);
    ASK=SymbolInfoDouble(_Symbol,SYMBOL_ASK);

   if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

   if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Marina, wie wäre es damit?

Sie wenden zwei Berechnungsoptionen an - eine zur Eröffnung von SELL und eine zur Eröffnung von BUY

 
Renat Akhtyamov:

                  if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

                  if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Marina, könnte es so sein?

Nein, das ist es nicht.

Sie müssen nicht nur das maximal mögliche Lot berechnen, sondern das Ganze auch auf das zulässige Minimum hin überprüfen, denn es kann vorkommen, dass das Minimum Lot 0,01 beträgt und die Marge es Ihnen erlaubt, nur 0,009 zu öffnen, dann quälen Sie den Server mit Anfragen, die niemals akzeptiert werden, aber er kann Maßnahmen gegen Sie ergreifen)

 
Vitaly Muzichenko:

Nein, das ist es nicht.

Sie müssen nicht nur die maximal mögliche Menge berechnen, sondern auch das Ganze auf die minimal zulässige überprüfen, denn es kann vorkommen, dass die minimale Menge 0,01, und die Marge erlaubt es Ihnen, nur 0,009 zu öffnen, dann quälen die Server-Anforderungen, die nie akzeptieren, aber die Aktion auf Sie und nehmen kann)

Schreiben Sie vollständigen Code, wie es sein sollte, und ich werde zur gleichen Zeit sehen....?

Ich werde immer von Ihnen lernen und Sie im Auge behalten, um sicherzustellen, dass die Antworten vollständig sind.

Ich habe früher als technischer Betreuer gearbeitet, keine Sorge, alles wird gut!

Gemeinsam sind wir ein Team!

 
Marina Korotkih:

Ich verstehe, das Beispiel hat geholfen. Ich danke Ihnen.


Nun diese Frage.

Wenn ich die Menge erhöhe, gibt es irgendwann nicht mehr genug freie Mittel, und ich muss mit einer größeren Menge eröffnen.

Das heißt, die maximale Menge einzugeben, so viel wie FreeMargin erlaubt.

Wie diese Bedingung zu schreiben ist: Wenn nicht genügend Mittel vorhanden sind, um die Position mit dem berechneten Lot zu eröffnen, sollte die Funktion das maximal mögliche Lot zur Eröffnung der Position zurückgeben.


Sie befinden sich auf einem schmalen Grat.)
Grund der Beschwerde: