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

 
Fox_RM:
Guten Tag!
Ich bin auf ein Problem beim Öffnen einer bestimmten (benutzerdefinierten) Anzahl von Aufträgen gestoßen.
Ich habe einen kleinen Code geschrieben, um dieses Problem zu lösen.
Es gibt jedoch Zeiten, in denen eine beliebige Anzahl von Aufträgen geöffnet wird, meist gegen Ende des Tests.

Nachstehend finden Sie den Code selbst.

Wenn Sie eine einfachere Lösung haben, würde ich mich über einen Kommentar freuen.


Dies ist wahrscheinlich besser.

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;
//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

  if(OrdS<=OrederSell)
    { //----- start 
    if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
       {
      ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if(OrdB<=OrederBuy)
     { //-----start
     if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
        {
        ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians:
Danke, aber es ist ein bisschen kompliziert für mich, und Ihre Funktion gibt 4 Nachrichten auf einmal aus, während ich eine brauche. Es werden nicht mehr als 64 Zeichen in einer Zeile angezeigt?

Nein. Sie nehmen Ihre lange Nachricht und unterteilen sie in so viele Teile, wie Sie auf dem Bildschirm lesen können, aber nicht mehr als vier. Die Hauptsache ist, dass jeder Teil nicht länger als 64 Zeichen ist. Wenn Ihre Nachricht kurz ist, können Sie sie in einem Teil an eine Funktion übergeben.

Schauen Sie, ich habe im Trailer einen Tippgeber beigefügt, um diese Funktion zu testen. Führen Sie es im Tester im visuellen Modus aus und setzen Sie den Win_Inform-Indikator auf das Visualisierungsdiagramm (er befindet sich in meiner vorherigen Nachricht im Trailer). Sie werden sofort sehen, wie diese Funktion funktioniert.

Dateien:
 
r772ra:


Das ist wahrscheinlich besser.

Dies ist in etwa der Code, den ich für die Aufrüstung meines Systems verwendet habe. In Ihrer Version gibt es 3 Probleme:

- Sobald OP_BUY- und OP_SELL-Aufträge geöffnet werden, erhöhen sich die OrdB- und OrdS-Parameter automatisch bei jedem Tick, daher habe ich die Neuberechnungsbedingung nur bei der Änderung des entsprechenden Ticks (Verkauf oder Kauf) hinzugefügt;

- die Neuberechnung aller Aufträge zu dem Fehler OrdB und Ord führt, brauchen wir nur die letzte Änderung der Aufträge zu berücksichtigen;

- in Ihrer Version gibt es keine Verringerung der Parameter OrdB und Ord für die weitere Eröffnung von Aufträgen if (OrdB<=OrederBuy),if(OrdS<=OrederSell).

Das scheint der Fall zu sein.

 
Fox_RM:

Dies ist in etwa der Code, den ich für die Aufrüstung meines Systems verwendet habe. In Ihrer Version gibt es 3 Probleme:

- Sobald OP_BUY- und OP_SELL-Aufträge geöffnet werden, erhöhen sich die OrdB- und OrdS-Parameter automatisch bei jedem Tick, daher habe ich die Neuberechnungsbedingung nur bei der Änderung des entsprechenden Ticks (Verkauf oder Kauf) hinzugefügt;

- die Neuberechnung aller Aufträge zu dem Fehler OrdB und Ord führt, brauchen wir nur die letzte Änderung der Aufträge zu berücksichtigen;

- in Ihrer Version gibt es keine Verringerung der Parameter OrdB und Ord für die weitere Eröffnung von Aufträgen if (OrdB<=OrederBuy),if(OrdS<=OrederSell).

Es scheint dasselbe zu sein.

Richtig, wir müssen die Zähler der Aufträge vor der for-Schleife auf Null setzen

//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS=0;
     OrdB=0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   


 

Guten Tag, bitte helfen Sie mir, die Funktion von Kim zu verstehen:

 
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
 if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

Ich verstehe den Satz nicht

if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

Warum gibt es keine Zeichen nach dem ersten if, was passiert, wenn ein Ausdruck auf diese Weise geschrieben wird. Was macht StringFind, und warum wird die Zeichenkette von JPY gesucht? Wie kann d = 0 sein, und in welchem Fall wird 2 zugeordnet und in welchem 4? Ich werde sehr dankbar für die Antwort sein, danke im Voraus)))

 
r772ra:

Richtig, vor der for-Schleife müssen Sie die Auftragszähler auf Null zurücksetzen

)) Aus irgendeinem Grund habe ich selbst nicht daran gedacht und fing an zu fummeln.
 
Fox_RM:
)) Aus irgendeinem Grund habe ich selbst nicht daran gedacht, ich wurde langsam müde.

Gut, dass wir ihn los sind.
 
Lisi4ka330: Warum gibt es keine Zeichen nach dem ersten if, was passiert, wenn der Ausdruck so geschrieben wird... Wie kann d = 0 sein, und in welchem Fall wird 2 zugeordnet und in welchem 4? Ich wäre für eine Antwort sehr dankbar, vielen Dank im Voraus)))

Ich denke, dass dies mehr Sinn macht

if (d==0)
{ 
  if (StringFind(sy, "JPY")<0)
  {
    d=4;
  } 
  else
  {
    d=2;
  }
}

d - Zitiergenauigkeit (Nachkommastellen)

wenn es ein JPY-Paar gibt, dann ist der Kurs für die Majors xxx.xx

Wenn es keinen JPY im Paar gibt, dann ist der Kurs für die Majors x.xxxx (daher der Name "vier Ziffern")

 
r772ra:

Ja, richtig, vor der for-Schleife müssen wir die Auftragszähler auf Null zurücksetzen


Ich habe einen weiteren Punkt übersehen:

- in Ihrer Version gibt es keine Verringerung der Parameter OrdB und OrdS für die weitere Eröffnung von Aufträgenif (OrdB<=OrederBuy),if (OrdS<=OrederSell).

In der neuen Version haben wir z.B. 5 Aufträge eröffnet, neu berechnet, aber die if-Bedingung lässt uns keine weiteren Aufträge eröffnen. In meiner alten Variante, OrdB-- und OrdS--

verwendet wurden.

 
GaryKa:

Ich denke, dass dies mehr Sinn macht

d - Zitiergenauigkeit (Nachkommastellen)

wenn es ein JPY-Paar gibt, dann ist der Kurs für die Majors xxx.xx

Wenn es keinen JPY in dem Paar gibt, dann sind die Kurse für die Majors ungefähr x.xxxx (daher der Name "vier Ziffern")

GaryKa, danke für die Antwort, es ist ein wenig unklar, wie d 0 sein kann, denn die Funktion
 d=MarketInfo(sy, MODE_DIGITS)
gibt die Anzahl der Dezimalstellen zurück, d ist also immer größer als 0 und die Bedingung ist immer falsch