[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 10

 
tol64:
Können Sie uns mitteilen, ob es möglich ist, die Möglichkeit des Setzens eines Stop-Loss/Stake-Profits sofort bei der Eröffnung einer Position/eines schwebenden Auftrags oder danach programmatisch zu bestimmen?


Überprüfen Sie die Stopp- und Gewinnniveaus im Voraus.

Die in der Funktion MarketInfo() verwendeten Antragskennungen. Kann einer der folgenden Werte sein:

Konstant. Wert Beschreibung
MODUS_LOW 1 Täglicher Mindestpreis
MODUS_HIGH 2 Maximaler Tagespreis
MODUS_ZEIT 5 Zeitpunkt des letzten Angebots
MODE_BID 9 Letzter erhaltener Gebotspreis. Für das aktuelle Instrument wird sie in der vordefinierten Variable Bid
MODE_ASK 10 Letzter erhaltener Briefkurs. Gespeichert in der vordefinierten Variablen Ask for the current symbol
MODE_POINT 11 Punktgröße in der Kurswährung. Gespeichert in der vordefinierten Variablen Punkt für das aktuelle Symbol
MODE_ZIFFERN 12 Anzahl der Stellen nach dem Dezimalpunkt im Preis des Instruments. Wird in der vordefinierten Variablen Digits für das aktuelle Symbol gespeichert
MODE_SPREAD 13 Spanne in Pips
MODE_STOPLEVEL 14 Minimal zulässiges Niveau von Stop Loss/Stake Profit in Pips
MODE_LOTSIZE 15 Kontraktgröße in der Basiswährung des Instruments
MODE_TICKVALUE 16 Minimale Änderung des Instrumentenpreises in der Einzahlungswährung
MODE_TICKSIZE 17 Mindestschritt der Preisänderung des Instruments in der Notierungswährung
MODE_SWAPLONG 18 Swap-Größe für Long-Positionen
MODE_SWAPSHORT 19 Swap-Größe für Short-Positionen
MODE_STARTING 20 Kalenderstartdatum (normalerweise für Futures verwendet)
MODUS_ABLAUF 21 Verfallsdatum (normalerweise für Futures verwendet)
MODE_TRADEALLOWED 22 Erlaubnis zum Handel mit dem angegebenen Instrument
MODE_MINLOT 23 Mindestlosgröße
MODE_LOTSTEP 24 Schritt der Losgrößenänderung
MODE_MAXLOT 25 Maximale Losgröße
MODE_SWAPTYPE 26 Berechnungsmethode für Swaps. 0 - in Punkten; 1 - in der Basiswährung des Instruments; 2 - in Prozenten; 3 - in der Randwährung.
MODUS_PROFITCALCMODE 27 Art der Gewinnberechnung. 0 - Devisen; 1 - CFD; 2 - Termingeschäfte
MODE_MARGINCALCMODE 28 Modus der Margenberechnung. 0 - Devisen; 1 - CFD; 2 - Termingeschäfte; 3 - Indizes CFD
MODE_MARGININIT 29 Erforderlicher Ersteinschuss für 1 Lot
MODE_MARGINMAINTENANCE 30 Höhe der Einschussforderung zur Deckung offener Positionen pro 1 Lot
MODE_MARGINHEDGED 31 Marge für überlappende Positionen pro 1 Lot
MODE_MARGINREQUIRED 32 Höhe der freien Mittel, die erforderlich sind, um 1 Los zum Kauf zu eröffnen
MODE_FREEZELEVEL 33 Höhe des Einfrierens von Aufträgen in Punkten. Liegt der Ausführungspreis innerhalb der durch den Freeze-Level definierten Grenzen, kann der Auftrag nicht geändert, storniert oder geschlossen werden.

 
SeALALex:

Ich bin gerade lernen, wie man einen EA zu schreiben, wie viele meiner ersten EAs auf Standard-Indikatoren, habe ich gerade einen neuen geschrieben, aber jetzt habe ich meine Aufgabe kompliziert. Im Allgemeinen, wie zu machen, dass in der Entstehung der Bedingungen eröffnet eine Position und bei ihrer Schließung, sagen wir, für die gleichen Bedingungen zu nehmen, eine neue nicht geöffnet, und öffnete nur, wenn die entgegengesetzten Bedingungen, usw. Danke!!!


In der Hilfe gibt es ein vorgefertigtes Beispiel

int i,accTotal=OrdersHistoryTotal(); for(i=0;i<accTotal;i++) { //---- Auswahlergebnis prüfen if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Fehler beim Zugriff auf historische Datenbank (",GetLastError(),")); break;
       } Wir müssen uns den Zeitpunkt des Auftragsschlusses merken, den Zeitpunkt des Auftragsschlusses mit dem Zeitpunkt des Abschlusses in der vorherigen Iteration vergleichen, und wenn (der Zeitpunkt des Abschlusses höher ist und die Art des Handelsvorgangs Kauf oder Verkauf ist), dann sollten wir uns den Zeitpunkt des aktuellen Auftrags und die Art des Handelsvorgangs merken // als Ergebnis wissen wir am Ende des Zyklus, welche Art von Auftrag zuletzt geschlossen wurde } Etwa so .

 
ivandurak:


Prüfen Sie vorab die Höhe der Stopp- und Gewinnsätze.


Für bestimmte Kontotypen gibt es in dieser Liste kein Häkchen. Hier ist ein Absatz aus den Vorschriften für Handelsgeschäfte für NDD-Konten:

3.3 Wenn eine Position über das Kundenterminal unter Verwendung eines Expert Advisors eröffnet wird, kann der Kunde keine Stop-Loss- und/oder Take-Profit-Aufträge erteilen. Wenn der Kunde diese Aufträge erteilen möchte, kann er dies durch Änderung einer bestehenden Position gemäß den Ziffern 5.16 - 5.22 und 9.13 - 9.16 tun.

Ich frage mich, ob es möglich ist, dies programmatisch zu überprüfen. So wie ich es verstehe, nein. Sie müssen zunächst eine Funktion zur Eröffnung von Positionen/zum Setzen von Pending Orders in das Programm schreiben, die die vom Broker festgelegten Bedingungen berücksichtigt.
 
tol64:


Für bestimmte Kontotypen gibt es in dieser Liste kein Häkchen. Hier ist ein Absatz aus den Vorschriften für Handelsgeschäfte für NDD-Konten:

Ich bin daran interessiert, ob dies programmatisch überprüft werden kann. So wie ich es verstehe, nein. Ursprünglich müssen Sie in ein Programm eine Funktion zum Eröffnen von Positionen / Setzen von Pending Orders schreiben, die die vom Broker festgelegten Bedingungen berücksichtigt.

Ich verstehe die Regeln für die Einstellung von Aufträgen nicht wirklich, versuchen Sie, mit der Demo zu spielen und zu sehen, was Sie tun können und was nicht. Soweit ich weiß, hindert Sie nichts daran, einen Auftrag programmgesteuert festzulegen und ihn dann zu ändern. Richtig, es ist seltsam, es sei denn, Sie unterbrechen die Verbindung, nachdem Sie eine Position eröffnet haben, und lassen keinen Stopp stehen.
 
tol64:


Für bestimmte Kontotypen gibt es in dieser Liste kein Häkchen. Hier ist ein Absatz aus den Vorschriften für Handelsgeschäfte für NDD-Konten:

Ich bin daran interessiert, ob dies programmatisch überprüft werden kann. Soweit ich weiß, nein. Sie müssen zunächst eine Funktion in das Programm schreiben, um Positionen zu eröffnen/ausstehende Aufträge zu setzen, wobei die vom Broker festgelegten Bedingungen berücksichtigt werden.

Es gibt überhaupt kein Problem. Selbst (wenn nicht für den persönlichen Gebrauch, weil Sie wissen, auf welchen Konten (Handelsbedingungen und mit wem), um es zu benutzen), aber wenn Sie den EA, um zu senden und der Kunde hat noch nicht entschieden, auf welche Konten und wo es verwendet werden, auch auf Konto-Typen mit der Möglichkeit, ein Take und Stop sofort, dann standardmäßig produzieren die EA mit Null-Werte dieser Ebenen bei der Einstellung aller Arten von Aufträgen, dann mit ihrer Änderung (wird dort und dort zu arbeiten), während, natürlich, niemand hat die Kontrolle Anforderungen und Einschränkungen bei p abgebrochen .
 
ivandurak:

Ich verstehe nicht ganz die Regeln für die Einstellung von Aufträgen, versuchen Sie, mit der Demo zu spielen, was Sie können und was nicht. Soweit ich weiß, hindert Sie nichts daran, einen Auftrag programmgesteuert festzulegen und ihn dann zu ändern. Richtig, es ist seltsam, es sei denn, Sie unterbrechen die Verbindung, nachdem Sie eine Position eröffnet haben, und lassen keinen Stopp stehen.

))) Nein. Sie missverstehen mich völlig. Ich habe nicht von "programmatisch festlegen" geschrieben, sondern von "programmatisch definieren". Bei einigen Kontotypen kann man nicht sofort eine Position eröffnen und Stops setzen, was für mich wünschenswert/ sicher wäre. Bei mql5 scheint es, wenn ich mich nicht irre, möglich zu sein, dies zu bestimmen. Ich möchte dies bestimmen können und je nach Definition wählen, welche Funktion ich verwenden möchte.
 
Roman.:

Es gibt überhaupt kein Problem. Selbst (wenn nicht für den persönlichen Gebrauch, weil Sie wissen, auf welchen Konten (Handelsbedingungen und mit wem), um es zu benutzen), aber wenn Sie einen EA, um und der Kunde hat noch nicht entschieden, auf welche Konten und wo er es verwenden, auch auf Konto-Typen mit der Möglichkeit, ein Take-und Stop sofort, dann machen Sie immer noch ein EA mit Null-Werte dieser Ebenen standardmäßig bei der Einstellung aller Arten von Aufträgen, dann mit ihrer Änderung (wird dort arbeiten und dort), während, natürlich, niemand storniert die Kontrolle Anforderungen und Einschränkungen bei p

Ja, es gibt kein Problem, wenn es eine Lösung gibt. Man muss nur nutzen, was man hat, und es richtig einsetzen).
 

Roman. und ivandurak vielen Dank für Ihre Antworten, aber für mich ist es immer noch schwer herauszufinden. Ich fand einen Vorschlag auf einem anderen Forum, wie dies zu tun, aber bisher kann ich es nicht auf meine üblichen Code anwenden

int BuyTrue, SellTrue;// Definieren Sie Variablen, die als diese Flaggen dienen werden
....
//--- Bedingung für den Kauf
if (BuyTrue==0 && ... plus Ihre anderen Bedingungen) //Position öffnen Bedingung
{
....
OrderSend(....); //Funktion zur Eröffnung einer Bestellung
BuyTrue=1; // Wenn BuyTrue=1, wird die Bedingung für die Positionseröffnung nicht vollständig erfüllt
// folglich wird bei einem wiederholten Kaufsignal kein Handel eröffnet
SellTrue=0; // Bei SellTrue=0 wird die Bedingung der Positionseröffnung vollständig erfüllt
// daher wird der nächste Handel nur Verkaufen sein
....
}

//--- Bedingung für den Verkauf
if (SellTrue==0 && ... plus Ihre anderen Bedingungen) //Position öffnen Bedingung
{
....
OrderSend(....); //Funktion zur Eröffnung einer Bestellung
SellTrue=1; // Wenn SellTrue=1 ist, wird die Bedingung für die Auftragseröffnung nicht vollständig erfüllt
// daher wird bei einem zweiten Verkaufssignal keine Position eröffnet
BuyTrue=0; // Bei BuyTrue=0 ist die Bedingung der Positionseröffnung vollständig erfüllt
// Folglich wird der nächste Handel nur Kaufen sein
....
}

Mein Code für die Eröffnung einer Position

total=AuftragsSumme();
if(gesamt<1)
{
// keine offenen Aufträge identifiziert
if(KontoFreieMarge()<(1000*Lose))
{
Print("Wir haben kein Geld. Freie Marge = ", AccountFreeMargin();
zurück(0);
}
// Prüfung auf Long-Position (BUY)
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green);
if(Ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Fehler beim Öffnen der BUY-Bestellung: ",GetLastError());
zurück(0);
}
// Prüfung auf Short-Position (SELL)
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red);
if(Ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice())
}
else Print("Fehler bei der Eröffnung einer SELL-Order: ",GetLastError());
zurück(0);
}
zurück(0);
}

 
SeALALex:

Roman. und ivandurak vielen Dank für Ihre Antworten, aber dies ist immer noch schwer für mich herauszufinden. Ich fand einen Vorschlag auf einem anderen Forum, wie dies zu tun, aber bisher kann ich es nicht auf meine üblichen Code anwenden

int BuyTrue, SellTrue;// Definieren Sie Variablen, die als oben beschriebene Flaggen dienen
....
//--- Bedingung für den Kauf
if (BuyTrue==0 && ... plus Ihre anderen Bedingungen) //Position öffnen Bedingung
{
....
OrderSend(....); //Funktion zur Eröffnung einer Bestellung
BuyTrue=1; // Wenn BuyTrue=1, wird die Bedingung für die Positionseröffnung nicht vollständig erfüllt
// folglich wird bei einem wiederholten Kaufsignal kein Handel eröffnet
SellTrue=0; // Bei SellTrue=0 wird die Bedingung der Positionseröffnung vollständig erfüllt
// daher wird der nächste Handel nur Verkaufen sein
....
}

//--- Bedingung für den Verkauf
if (SellTrue==0 && ... plus Ihre anderen Bedingungen) //Position öffnen Bedingung
{
....
OrderSend(....); //Funktion zur Eröffnung einer Bestellung
SellTrue=1; // Wenn SellTrue=1 ist, wird die Bedingung für die Auftragseröffnung nicht vollständig erfüllt
// daher wird bei einem zweiten Verkaufssignal keine Position eröffnet
BuyTrue=0; // Bei BuyTrue=0 ist die Bedingung der Positionseröffnung vollständig erfüllt
// Folglich wird der nächste Handel nur Kaufen sein
....
}

Mein Code für die Eröffnung eines Geschäfts.

total=AuftragsSumme();
if(gesamt<1)
{
// keine offenen Aufträge identifiziert
if(KontoFreieMarge()<(1000*Lose))
{
Print("Wir haben kein Geld. Freie Marge = ", AccountFreeMargin();
zurück(0);
}
// Prüfung auf Long-Position (BUY)
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green);
if(Ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Fehler beim Öffnen der BUY-Bestellung: ",GetLastError());
zurück(0);
}
// Prüfung auf Short-Position (SELL)
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red);
if(Ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice())
}
else Print("Fehler bei der Eröffnung einer SELL-Order: ",GetLastError());
zurück(0);
}
zurück(0);
}


Erstens, fügen Sie Ihren Code in den Editor über Strg+Alt+M (oder drücken Sie SRC am oberen Rand des Menüs), sonst ist es schlecht, was klar ist - alles verschmilzt unter einem...:-))

Zweitens, lesen Sie das Tutorial, insbesondere die Informationen auf den Link, den ich empfohlen, unter dem Code ist seine Beschreibung und ganz am Ende der Beschreibung ist genau beschrieben - wie man einmal Bericht einen Preis über / unter dem MA (Sie haben eine Analogie mit einem einzigen Eintrag bei einer bestimmten Handelsbedingungen - die Verwendung von Flaggen und alle), bevor Sie WORK Ihre Wizard ... :-)))

P.S. oder Google-Suche: Wie man den Code richtig einfügt site:mql4.com

 






if (SellTrue==0 && A1<A2 && S1<30 && ADX1<ADX2) // Условие открытия позы
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"AO sample",16384,0,Red);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES ||SellTrue==1)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
        
        if (ticket > 0 && SellTrue==1)   
     {
      SellTrue=1;
      BuyTrue=0;                 
      Alert("По данным условиям сделка уже открывалась"); // Сообщение 
     }
        }
      return(0);
Roman. Es funktioniert nicht, was ist los?