[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 37

 
skyjet:

Herzlichen Dank für Ihre Antwort! Aber wie kann man den zukünftigen Bar nach Ask[0],Bid[0] beschreiben?

Sobald dieser zukünftige Balken erscheint, wird er zu Null. Und der Balken, der jetzt [0] ist, wird zu [1].


Ask und Bid sind KEINE Arrays, es gibt nur einen aktuellen Wert, alle früheren sind vergessen.

 

Bitte helfen Sie mir, die Berechnung der Kaution
zu verstehen, denn meine geschätzte Kaution stimmt nur dann genau mit dem Terminal
überein, wenn alle Aufträge vollständig abgeschlossen sind
. Wenn ich dem Auftragssystem einen weiteren Auftrag hinzufüge - weicht das Ergebnis des Terminals
immer nur geringfügig von meiner geschätzten Kaution
ab, aber ich kann nie eine Kugel in einer Kugel sein!
Hier ist ein sehr kurzes Beispiel:

Das Konto hat 4 Aufträge zu je 10,00 Lots, zwei davon
Fahrräder und zwei Verkäufe. Es ist klar, dass das Konto ausgeglichen ist und alle Aufträge gesperrt sind
Wir berechnen die Standardeinlage für jeden Auftrag, teilen sie durch 4 und alles ist tiptoe
Das Terminal klopft genau.

Wir setzen einen weiteren Byke zu 1,00 Lot bei 1,4059
Wir berechnen die Einlage. Es ist klar, dass wir dafür das Standardpfand
bezahlen müssen, da alle bestehenden Bestellungen im Kasten sind.
Bei einer Hebelwirkung von 1:100 haben wir das Pfand für das neue Fahrrad

ZALBuy = 140,59*1,00 = 140,59

Daher sollte die frühere Kaution um diesen Betrag erhöht werden,
Addieren Sie die frühere Kaution und die Kaution für unser 1,00 Byte

ZAL=ZALold + ZALBuy = 1407,23 + 140,59 = 1547,82

Nach dem Setzen des Byes im Terminal betrug die Einlage 1547,91
Dies wäre akzeptabel, wenn ich das Bye 9 Punkte höher gesetzt hätte als
zum Kurs von 1,4068. Denn wenn wir den realen Anstieg der Einlage
als Differenz der Einlage vor und nach berechnen, erhalten wir genau die Standardeinlage
für 1,00 Lot zum Kurs von 1,4068

1547.91 - 1407.23 = 140.6801

Geänderte Terminalversion hat leider nicht geholfen!

-----------------------------------------------

Bitte verzeihen Sie mir, dass ich Ihre Zeit in Anspruch nehme, aber diese
ständigen kleinen Diskrepanzen stören mich wirklich
weil meine Maschine verschiedene Optionen zählt,
und die Einzahlung als Saldo und Gewinn verwendet wird, um
alle Kontoparameter nach bestimmten Aktionen zu berechnen, bevor sie ausgeführt werden
. Genauigkeit ist hier also sehr wünschenswert.
Vielleicht verstehe ich etwas nicht, aber ich habe die Dokumentation
durchsucht und konnte den Grund für diese Diskrepanz nicht finden.
Für Ihre Hilfe wäre ich Ihnen sehr dankbar!


Mit freundlichen Grüßen MADZX
 
keep87:


Diese Einstellung können Sie vergessen. Wenn das Café Ihr Geld nehmen will, ist es ihnen egal, wie groß die Lücke ist, sie werden es trotzdem tun.) Dies ist die Realität der algotrading die meisten der Betrug Unternehmen, die sich als "der beste Broker XXXXX" (XXXXXX - einfügen Namen eines Kontinents oder Galaxie, was auch immer)

Ändern Sie die Einstellung oder nicht, es bleibt alles beim Alten.


Vollkommen richtig! Ich habe es auch gesehen!
 
skyjet:
Hallo! Können Sie mir eine Beschreibung einer echten Bar +1 geben. Ich brauche zum Beispiel den Preis des nächsten Balkens, nicht des aktuellen.

Soweit ich weiß, versuchen Sie, Informationen von der Maschine aus der Zukunft zu erhalten.
Wenn Sie einen Weg finden - teilen Sie ihn, ich wäre Ihnen dankbar :)
 
Kobalerro:
Ich grüße alle. Ich bin selbst neu im Programmieren, also lösen Sie bitte das Problem.

Es ist notwendig, dass mehrere EAs auf demselben Konto eine begrenzte Anzahl von Aufträgen eröffnen.

Beispiel: 10 EAs, die aber nur 5 Aufträge eröffnen können, aber nicht mehr als einen pro Währungspaar.

Dies wurde wie folgt umgesetzt, aber so funktioniert es nicht.

extern int МаксКолОрдеров   = 5;

//+------------------------------------------------------------------+

int ПодсчетОткрОрдеров() {
  int k=OrdersTotal();
   if (Символ=="0") Символ=Symbol();
    for (int i=МаксКолОрдеров; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Символ || Символ=="") {
       if (МагикНомер<0 || OrderMagicNumber()==МагикНомер) {
      if (OrderMagicNumber()<1) return(True);
     }
    }
   }
  }
 return;

}

//+------------------------------------------------------------------+
int start()
  {
   if(ПодсчетОткрОрдеров()==0)ПровТоргУсловий();
   }


Ich würde eine solche Show wie folgt umsetzen:
Alle 10 Ihrer Pferde arbeiten jedes nach seinem eigenen Zeitplan, wie in benachbarten Räumen
und daher weiß keines von ihnen, was der Nachbar hinter der Wand macht - das ist das Hauptproblem
für Ihre Idee!
Daher würde ich jeden EA anweisen, seine Aktionen in die Disketten-Datei
zu schreiben, die allen Pferden zur Verfügung steht, da sie sich im Verzeichnis des Terminals befindet.
Wenn jemand von ihnen den brennenden Wunsch hat, etwas in seinem Fenster
zu tun, sollte er zuerst diese Datei analysieren und die Möglichkeit der Umsetzung
Wunsches prüfen!
in Bezug auf Ihr Szenario müssen Sie in der Datei die Anzahl der Aufträge
und die Währungspaare hinzufügen, für die sie offen sind
. Zum Beispiel:
EURUSD 1
GBPUSD 1
EURGBP 0

Hier sehen wir, dass wir keinen Handel mitEURUSD undGBPUSD eröffnen können, da das Skript
nur eine Order pro Paar zulässt.
Es ist klar, dass es so viele Zeilen geben wird, wie Paare am Werk sind.
Mit dieser Lösung wissen alle Ihre Pferde immer, was gerade passiert
, und können berechnen, ob eine Aktion im Moment erlaubt ist oder nicht.
Wenn Sie eine Order für ein beliebiges Paar aufgeben, müssen Sie in der rechten Zeile eine 1 eingeben
Wenn Sie die Order schließen, ersetzen Sie sie durch eine Null
Das wird auf jeden Fall funktionieren, auch wenn es für einen Neuling etwas kompliziert ist
. Aber machen Sie weiter, denn jeder war dabei - wie ein Neuling, bis die Zeit kommt!

Viel Spaß bei der Jagd!
MADZX

 

Ich schreibe gerade eine Pullback-Strategie. Ich muss eine Stop-Order über (unter) dem Extremum der entsprechenden Kerze platzieren. Hier ist ein Beispiel:

Wenn der Schlusskurs unter dem Eröffnungskurs liegt, handelt es sich eindeutig um eine bärische Kerze, und umgekehrt um eine bullische Kerze. Ich möchte wissen, wie ich eine Bedingung erstellen kann, die besagt, dass die vorherige Kerze bullisch ist... ... so-und-so.

Logischerweise erstelle ich eine Funktion, die den Typ der Kerze bestimmt.

int CandleType()
{
  if(Open[1] > Close[1])
    return(BullCandle);
    
  if{Open[1] < Close[1]}
    return(BearCandle);
    
  return(dodji);
}

Dann sollte man irgendwie fragen, ob der Balken mit Index 1 bullisch oder bearisch ist... ...und etwas tun...

Wie kann ich das tun?

 
madzx:


Ich würde eine solche Show so umsetzen:
Alle 10 Ihrer Pferde arbeiten jeder nach seinem eigenen Zeitplan, wie in benachbarten Räumen
und deshalb weiß keiner von ihnen, was der Nachbar hinter der Wand macht - das ist das Hauptproblem
für Ihre Idee!
Daher würde ich jeden EA anweisen, seine Aktionen in die Disketten-Datei
zu schreiben, die allen Pferden zur Verfügung steht, da sie sich im Verzeichnis des Terminals befindet.
Wenn jemand von ihnen den brennenden Wunsch hat, etwas in seinem Fenster
zu machen, sollte er zuerst diese Datei analysieren und die Möglichkeit der Umsetzung
Wunsches prüfen!
in Bezug auf Ihr Szenario müssen Sie in der Datei die Anzahl der Aufträge
und die Währungspaare, für die sie offen sind
hinzufügen. Zum Beispiel:
EURUSD 1
GBPUSD 1
EURGBP 0

Hier sehen wir, dass wir keinen Handel mitEURUSD undGBPUSD eröffnen können, da das Skript
nicht mehr als eine Order pro Paar zulässt.
Es ist klar, dass es so viele Zeilen geben wird, wie Paare im Einsatz sind.
Mit dieser Lösung wissen alle Ihre Pferde immer, was gerade passiert
, und können berechnen, ob eine Aktion im Moment erlaubt ist oder nicht.
Wenn Sie eine Order für ein beliebiges Paar aufgeben, müssen Sie in der richtigen Zeile eine 1 eingeben
Wenn Sie die Order schließen, ersetzen Sie sie durch eine Null
Das wird auf jeden Fall funktionieren, auch wenn es für einen Neuling etwas kompliziert ist
. Aber machen Sie weiter, denn jeder war dabei - wie ein Neuling, bis die Zeit kommt!

Viel Spaß bei der Jagd!
MADZX

Danke für den Tipp, aber es ist ein bisschen zu kompliziert. Und dann in Ihrer Version stellt sich heraus, alle Arbeit, und es dauert 10, um die Bedingung für die Eingabe zu überprüfen,

Aber sie öffnen nur die ersten fünf, die es rechtzeitig geschafft haben, und dann, wenn einer von ihnen schließt, öffnet der erste, der die Bedingungen erfüllt, wieder,

nicht beschränkt auf EURUSD 1 , GBPUSD 1 , EURGBP 0.

Ich denke, es sollte eine einfachere Lösung geben. Es sollte ähnlich sein wie das Zählen der Gesamtzahl der Aufträge mit einer Einschränkungsbedingung durch einen bestimmten Parameter.

Und die Begrenzung kann entweder durch ein Symbol oder durch eine magische Zahl, die nicht größer als eins sein darf, festgelegt werden.

Obwohl Ihre Version wahrscheinlich auch funktionieren würde, aber ich kann mich nicht entscheiden, wie ich es in den Code implementieren soll.

 
hoz:

Ich habe hier eine merkwürdige Sache laufen. Hier ist die Funktion der Eröffnungsaufträge:

Hier ist der Fehler:

if(SL < g_stopLevel)
    SL = g_stopLevel*pt;

Wenn Stop Level = 5, dann versuchen Sie, einen Stop Loss bei 0,00005 zu setzen.

Der zweite Fehler besteht darin, dass Sie nicht überprüfen, wo Sie die Order platzieren. Wenn die Kerze am oder in der Nähe ihres Hoch-Tiefs geschlossen hat, erhalten Sie den Fehler 130. Wie Sie in der Abbildung sehen können, hat der Server eine Verkaufsorder anstelle eines Verkaufsstopps geöffnet, weil Sie versucht haben, eine Verkaufsstopp-Order zu einem Preis zu öffnen, der höher oder gleich dem aktuellen Preis ist.

Lernen Sie, den Druck zu benutzen. Fügen Sie einfach Print(); an der richtigen Stelle ein, setzen Sie die erforderlichen Variablen in Klammern und trennen Sie sie mit diesem: ," ", wie folgt: Print(Price," ",SL); und während des Testens, wenn Sie einen Auftrag in der Registerkarte "Experten" öffnen, werden Sie sehen, was diese Variablen sind gleich, und Sie werden in der Lage zu verstehen, was falsch ist.

Das Protokoll zeigt auch, was der EA zu tun versucht und wo ein Stop-Loss und Take-Profit zu setzen sind. Sie werden dort alles finden, was Sie brauchen.

Logischerweise mache ich eine Funktion, die die Art der Kerze erkennt.

Lassen Sie uns innerhalb der Funktion start arbeiten.

Zunächst erstellen wir eine Variable, in die wir die Richtung der vorherigen Kerze schreiben.

int Candle=-1;

Wir werden es mit einigen Werten füllen, von denen einer eine Hausse, ein anderer eine Baisse bezeichnet. Wenn -1, ist es nichts (es wurde nicht bestimmt oder es hat keine Richtung close=open).

Ich schlage vor, den Wert in Analogie zu einem Handelsauftrag zu verwenden: 0 - kaufen, 1 - verkaufen;

dann müssen wir schreiben:

if(Close[1]>Open[1]) Candle=0; else
if(Close[1]<Open[1] Candle=1;

Jetzt haben wir eine Richtung definiert und können sie direkt in der Funktion OrderSend( string symbol, int cmd, ...other stuff...) verwenden;

if(Kerze!=-1) OrderSend( Symbol(),Kerze, ...andere Sachen...);

oder nach Ihrer Analogie:

if(Kerze==0) OpenBuy();
if(Kerze==1) OpenSell();

 
Kobalerro:

Danke für den Tipp, aber das ist ein bisschen zu kompliziert. Und dann stellt sich heraus, dass alle von ihnen in Ihrer Version funktionieren und es 10 dauert, um die Eingangsbedingungen zu prüfen,

und sie öffnen zuerst nur fünf, die es rechtzeitig geschafft haben, und wenn dann eine von ihnen schließt, öffnet die erste, die die Bedingungen erfüllt, wieder,

nicht beschränkt auf EURUSD 1 , GBPUSD 1 , EURGBP 0.

Ich denke, es sollte eine einfachere Lösung geben. Es sollte wie das Zählen der Gesamtzahl der Aufträge mit einer Einschränkungsbedingung durch einen bestimmten Parameter sein.

Und wir müssen diese Zahl entweder durch ein Symbol oder durch eine magische Zahl oder durch nicht mehr als eins begrenzen.

Obwohl, vielleicht, Ihre Variante wird auch funktionieren, aber wie man es in den Code zu implementieren, kann ich nicht denken.


Oder vielleicht so:

if(NumberOfPositions("EURUSD")==0 && NumberOfPositions()<10)
Hier ist eine Funktion
 
keep87:

Hier liegt ein Fehler vor:

Wenn der Stopp-Level = 5 ist, versuchen Sie, einen Stopp-Loss bei 0,00005 zu setzen.

Der zweite Fehler besteht darin, dass Sie nicht überprüfen, wo Sie die Order platzieren. Wenn die Kerze am oder in der Nähe ihres Hoch-Tiefs geschlossen hat, erhalten Sie den Fehler 130. Wie Sie in der Abbildung sehen können, hat der Server eine Verkaufsorder statt eines Verkaufsstopps geöffnet, weil Sie versucht haben, einen Verkaufsstopp zu einem Preis zu öffnen, der höher oder gleich dem aktuellen Preis ist.

Lernen Sie, den Druck zu benutzen. Fügen Sie einfach Print(); an der richtigen Stelle ein, setzen Sie die erforderlichen Variablen in Klammern und trennen Sie sie mit diesem: ," ", wie folgt: Print(Price," ",SL); und während des Testens, wenn Sie einen Auftrag in der Registerkarte "Experten" öffnen, werden Sie sehen, was diese Variablen sind gleich, und Sie werden in der Lage zu verstehen, was falsch ist.

Das Protokoll zeigt auch, was der EA zu tun versucht und wo ein Stop-Loss und Take-Profit zu setzen sind. Es wird alles angezeigt, was benötigt wird.

Ich verwende es von Zeit zu Zeit auf diese Weise. Jetzt sehen die Funktionen wie folgt aus:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  int ticket = -1;
  string myNote = "Сов баянул";
  
  double price = High[1] + i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = Low[1] - i_thresholdFromBasedSL*pt ;
  Print("SL = ", SL);

  if(price > Ask)
  {
    ticket = OrderSend(Symbol(),OP_BUYSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Navy);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(High[1] + i_tp*pt,Digits),0,Navy))
    return(false);
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int ticket = -1;
  string myNote = "Сов шортанул";
  
  double price = Low[1] - i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = High[1] + i_thresholdFromBasedSL*pt;
  Print("SL = ", SL);
  
  if(price < Bid)
  {
    ticket = OrderSend(Symbol(),OP_SELLSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Red);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(Low[1] - i_tp*pt,Digits),0,Red))
    return(false);
    
  return(true);
}

Ich habe in der Zeitschrift gelesen:

2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: modify #1 buy stop 0.10 EURUSD at 1.32103 sl: 1.32007 tp: 1.32243 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: open #1 buy stop 0.10 EURUSD at 1.32103 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3201
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.321
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: OrderSend error 130
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3194
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.3204
2012.12.25 18:20:14     5_minites_TS_by_Philippe Nell inputs: i_fastMaPeriod=10; i_slowMaPeriod=21; i_filtrMaPeriod=50; i_trading_TF=5; i_thresholdFromInput=1; i_thresholdFromBasedSL=1; i_slippage=3; i_tp=15; i_myMagic=33330215; 
2012.12.25 18:20:12     5_minites_TS_by_Philippe Nell EURUSD,M5: loaded successfully

Vom Kaufkurs bis zum Stopp war also zunächst die Differenz 1,3204 - 1,3194 = 0,001 Punkte

Weitere 1,3210 - 1,3201 = 0,009 Punkte

Und aus irgendeinem Grund war im zweiten Fall der Stopp näher am Einstiegskurs, aber es gab keinen Fehler! Ich habe darüber nachgedacht und habe es nicht verstanden.

Ich habe den Fehler später auf eine andere Weise korrigiert. Es gibt bereits Bedingungen im Kodex:

if(Preis > Ask) && if(Preis < Bid) jeweils für Kauf und Verkauf. Oder gab es eine andere Variante? Jetzt haben wir keine Fehler mehr. Aber trotzdem würde ich gerne die Meinung eines erfahreneren Programmierers hören.

Grund der Beschwerde: