Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 722
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ja, nun... Wo kann ich einen solchen Makler finden... Können Sie mir einen Link geben?
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.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
Вы же сами и ответили на свой вопрос.
Есть такой параметр 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).
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 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);
}
//+------------------------------------------------------------------+}
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
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;
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)
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!
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.