Nützliche Funktionen von KimIV - Seite 89

 
Ist es möglich, in Ihrem Expert Advisor e-CloseByPercentProfit.mq4 hinzufügen, um TP und SL auf das Paar in der Tabelle, die es installiert ist?
 

Guten Tag zusammen.

Frage zur Funktion


//+------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                        |
//|  Описание : Возвращает количество позиций.      |
//+------------------------------------------------------------------+

int NumberOfPositions(string sy="", int op=-1, int mn=-1){
  int i, k=OrdersTotal(), kp=0;  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}  return( kp);}  
          

Ich habe ein Gegenstück in mehreren Währungen. Die Paare werden in externen Parametern festgelegt. Mit eigenem Zauberer (für jedes Paar).

Unter den Einstiegsbedingungen für jedes Instrument gibt es diese:
if ( NumberOfPositions(Symbol_1, -1,Magic_1)<1){//если нет открытых
//позиций по 1-му инструменту, 
ODER (für das zweite Paar)
if ( NumberOfPositions(Symbol_2, -1,Magic_2)<1){//если нет открытых
//позиций по 2-му инструменту, проверяем ОСТАЛЬНЫЕ условия

Was passiert ist, ist, dass ich beide Symbole gestern geladen - EURUSD, und heute Morgen fand ich, dass nur ein Handel geöffnet, obwohl es schien, um Signale in beiden Fällen.

Und dann fiel es mir ein. Dass die Funktion

NumberOfPositions(string sy="", int op=-1, int mn=-1)
Zunächst wird geprüft, ob für ein Symbol eine offene Position besteht. Und dann alles andere.

Mit anderen Worten, wenn ich eine offene Position mit dem EA für das Instrument EIRUSD habe, wird die zweite Position auch mit einem anderen Magier nach einem anderen Algorithmus nicht geöffnet.

Bitte sagen Sie mir, ob es wahr ist oder nicht?

Oder liege ich mit meinen Überlegungen falsch? Oder wertet die Funktion alle Kriteriennacheinander aus ...


 

Ich verwende diese Funktion oft, sie gibt alles entsprechend den Eingabeparametern zurück. Die Elemente, die die Funktion durchläuft, werden der Reihe nach nach den Parametern sortiert. Überzeugen Sie sich selbst.

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()== sy || sy=="") { //далее внутри символа
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) { //далее внутри типа ордера
            if ( mn<0 || OrderMagicNumber()== mn) kp++; //внутри магика, и только здесь позиция учтена 
          }
        }
      }
    }
  }
  return( kp);
}
 

Es bedeutet also, dass mein EA nicht in der Lage sein wird, eine zweite EURUSD-Position zu eröffnen, auch nicht mit einem anderen Magier, solange die erste Position offen ist?

Offensichtlich ja. Denn selbst im Testgerät scheint es keine überlappenden Positionen zu geben.

//--------------------------------------------------------

 
Rita >> :

Es bedeutet also, dass mein EA nicht in der Lage sein wird, die zweite EURUSD-Position zu öffnen, auch wenn er einen anderen Magier hat, während die erste Position offen ist?

Genau das Gegenteil :)) Das bedeutet, dass die Funktion Ihre Symbole und magischen Zahlen separat zählt. Das heißt, wenn es eine offene Position auf EURUSD c Magic_1 gibt, dann ist NumberOfPositions("EURUSD", -1, Magic_2)==0; es sei denn, es gibt eine andere Position auf EURUSD mit Magic_2, natürlich.

Im Allgemeinen zählt die Funktion offene Positionen gemäß (sy && op && mn), d.h. Positionen werden genau mit diesen Parametern gezählt. Wenn mindestens ein Parameter nicht übereinstimmt, wird der Auftrag von dieser Funktion nicht berücksichtigt und ist nicht sichtbar.

Drucken Sie die Werte der Funktion in Kommentar aus und Sie können in Echtzeit die Anzahl der Aufträge sehen und ob die Funktion korrekt funktioniert. Höchstwahrscheinlich liegt der Grund für die Fehlfunktion des Algorithmus im EA-Code.

 
Ja. Ich werde den Code jetzt überprüfen.
 
hope писал(а) >>

Das Hinzufügen einer Bindung an das Symbol im Funktionsaufruf ist nicht hilfreich. Warum wird der Gewinn für jede Position einzeln gezählt (Bild oben)?

Nein, ich würde dir lieber meine Zeichnung anbieten...

...und ein Drehbuch...

 
KimIV писал(а) >>

Nein, ich würde dir lieber meine Zeichnung anbieten...

...und ein Drehbuch...

Ich habe gemerkt, dass ich ein Narr bin... Durch die Zugabe von Rindfleisch und Milch kann man keine Euter bekommen.

 
KimIV писал(а) >>
Angela, der Compiler hat nicht erwartet, meine Funktionsdefinition genau an dieser Stelle zu finden. Das bedeutet, dass irgendwo oberhalb des Codes etwas fehlt. Es kann ein Semikolon oder eine schließende geschweifte Klammer sein. Prüfen Sie den Code auf jeden Fall sorgfältig.

Ich habe es herausgefunden, ich habe nur Ihre Funktion innerhalb von int start() eingefügt, wenn ich sie außerhalb von int start() einfüge, wird alles kompiliert. Das Problem ist anders, im Indikator im Visualisierungsmodus im Tester bekommt diese Funktion keine Daten vom EA zum Indikator.

 
e-News-Lucky$.mq4

Lucky$ & KimIV

http://www.kimiv.ru

Hallo Igor!

Ich benutze Ihre Expert Advisor, es ist sehr gut, ich habe versucht, Indikator, um es durch iCustom gestern anhängen, aber es sah es nicht, wie man es durch iCustom verschreiben? Ich frage mich, welche eingebauten Funktionen wie iHigh, iLow es ohne Probleme sehen, aber es weigert sich, schwebende Aufträge über den Indikator zu platzieren.

Ich habe es so für iHigh und iLow des Tagesbalkens gesetzt . Diese Funktion funktioniert wie erwartet, platziert Pending Orders, will aber keine Pending Orders mit Indikator(((.... Ich möchte das Code-Fragment zeigen, wie man schwebende Aufträge durch den Indikator in diesem EA platzieren? Der Indikator kann alles andere als ein Aufruf der iCustom-Funktion sein .

Wenn Sie etwas Zeit haben, danke.

//глобальные переменные

double Hi_Bar;
double Lou_Bar;

//+------------------------------------------------------------------+
//| Установка ордеров                                                |
//+------------------------------------------------------------------+
void SetOrders() {
  Hi_Bar  = iHigh(Symbol(), PERIOD_D1, 0);
  Lou_Bar =  iLow(Symbol(), PERIOD_D1, 0);
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk= Hi_Bar+( DistanceSet+ spr)*Point;
  double pBid= Lou_Bar- DistanceSet*Point;