Nützliche Funktionen von KimIV - Seite 51

 
Lieber Igor, ich entschuldige mich, wenn ich jemanden beleidigt habe... Ich habe nicht wirklich Kritik geübt, es ist schade, dass es so aussieht. Wie auch immer, der veröffentlichte Prototyp wird mehr als einmal korrigiert und verfeinert werden. Damit es keine Rätsel gibt (ich habe nie behauptet, der Autor zu sein), werde ich Ihnen in Zukunft die Arbeit zur Überarbeitung durch den Autor schicken. Ich sehe mich selbst als den ersten Schritt auf bisher 25 Seiten. Sobald ich sie fertiggestellt habe, werde ich sie an die auf Ihrer Website genannte Adresse schicken. Vielen Dank für Ihre unschätzbare Arbeit und selbstlose Weitergabe von Erfahrungen!!!
 
rid писал (а) >>

Ich denke, das ist möglich. Offensichtlich ist es notwendig, auf jeder Ebene (bei der Kreuzung) zu prüfen, wie groß die aktuelle Losgröße der offenen Position ist. Und genau nach diesem Kriterium sollten wir einen Schließmechanismus einführen!

Solche Funktionen (die die Losgröße zurückgeben) sind in diesem Zweig verfügbar. Siehe Seiten. 17 и 27

Herzlichen Dank! Hurra! Jetzt kann ich weitermachen. Vielen Dank!

 

Um festzustellen, ob zusätzliche Prüfungen der Losgröße in der Funktion OpenPosition() erforderlich sind, müssen Sie sehen, wie Sie die Losgröße berechnen und wie und wo sie aufgerufen wird; ich habe diese Funktion in der Verzweigung nicht gesehen

double ll=GetSizeLot();

Vielleicht habe ich übersehen.

Wenn es so berechnet wird https://championship.mql5.com/2012/ru/news, kann es sein, dass du einen 134-Fehler bekommst und die Meisterschaft verpasst :-)

 

Hallo KimIV.schickte eine Sache wird es zurück zu schreiben haben. Ich bin nicht sehr gut im Programmieren und ich lerne seit 3 Wochen, um Händler zu werden.

hier. Meine Frage ist folgende. Ist es möglich, einen EA mit dem CCi-Indikator zu erstellen?

Stufen CCi 250, 50, -50, -250. Die Idee ist, dass ich bei Erreichen (Überschreiten) von -50 bzw. 50 verkaufen oder kaufen würde. Überlegen Sie, wann das Geschäft beendet werden soll:

1Dann (nehmen wir an, es findet ein Verkauf statt) kreuzt die Kurve -250, dann kreuzt sie in die entgegengesetzte Richtung -250 (Sie können es auf dem Bild sehen).

2 Das Diagramm hat 250 nicht erreicht und kreuzt zurück auf 50.

Beim Kauf ist es dasselbe, aber umgekehrt.

Kurs Euro/Dollar, beliebiger Zeitrahmen.

Wie viel würde ein Plüsch-EA wie dieser kosten????

Wenn es derselbe Preis ist, können Sie etwas Besseres anbieten?

Vielen Dank im Voraus. Ich hoffe es. Nun, ich habe einen FOREX-Kurs besucht.

Übrigens, Forex ist eine echte Möglichkeit, Brot und Butter zu verdienen????

 

Ich grüße alle.

Ich habe diesen Indikator gefunden und ihn ein wenig verändert - er bildet gute Trendlinien.

Es wäre interessant, eine Funktion auszuhecken... (es handelt sich um eine Art KimIV-Anfrage).

Dateien:
tlbs.mq4  8 kb
 
Prival писал(а) >>

Re.

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Vielleicht wäre es besser, OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44) aufzurufen;

Dieser Vorschlag, Sergei, erhöht die Bequemlichkeit der Verwendung von Stopps und nimmt in Pips gesetzt. Was ist mit Fällen, in denen Stopps und Takes durch Preisniveaus festgelegt sind? Zum Beispiel ein Stopp beim Tiefst- oder Höchststand des vorherigen Balkens. Oder durch eine Art von Linie. Wird sie vor dem Aufruf der Funktion in Punkte umgerechnet und innerhalb der Funktion wieder in Preise umgewandelt? Dies ist ein redundanter Vorgang. Ich werde es also so lassen, wie es ist.

Auf die Funktion GetSizeLot() werden wir später eingehen (sie heißt jetzt übrigens GetLots()). Zunächst müssen wir die Verwendung der Bibliotheken b-ForTest.mqh und b-Positions.mqh beenden.

 

Die Funktion CountOrders() für das Prüfgerät.

In meinen Testversionen der Expert Advisors (nur für den Gebrauch im MT4-Tester bestimmt) ersetzt die Funktion CountOrders() die folgenden Funktionen: ExistOrders(), ExistPositions(), NumberOfOrders() und NumberOfPositions(). Das heißt, sie kann Informationen über das Vorhandensein einer Position oder eines Auftrags jeder Art sowie Informationen über die Anzahl der Geschäfte jeder Art liefern. Ein solcher Austausch hat seine eigenen Vorteile, die sich darin äußern, dass man einmalig für einen Tick auf die Auftragsbasis zugreifen kann und alle notwendigen Informationen auf einmal erhält. Und die oben genannten Funktionen, insbesondere wenn sie zusammen verwendet werden, arbeiten alle unabhängig voneinander mit ein und derselben Auftragsbasis, so dass sie immer wieder dieselben Aufrufe tätigen. Infolgedessen kann die Funktion CountOrders() die Zeit eines Durchlaufs um mehrere Sekunden verkürzen, wodurch Stunden der Optimierung eingespart werden können.

Die Funktion CountOrders() hat die folgenden Parameter:

  • mo - Array mit der Anzahl der Bestellungen nach Typ. Nach der Ausführung der Funktion besteht das Array aus 6 (sechs) Elementen. Null-Element - Anzahl der Kaufgeschäfte, erstes Element - Anzahl der Verkaufsaufträge, zweites Element - BuyLimit, drittes Element - SellLimit, viertes Element - BuyStop, fünftes Element - SellStop.
  • mn - Kennung einer Position oder von Aufträgen (MagicNumber). Der Standardwert ist -1 - eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 03.08.2008                                                     |
//|  Описание : Рассчитывает количество ордеров по типам.                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mo - массив количества ордеров по типам                                 |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//+----------------------------------------------------------------------------+
void CountOrders(int& mo[], int mn=-1) {
  int i, k=OrdersTotal();

  if (ArraySize( mo)!=6) ArrayResize( mo, 6);
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ( mn<0 || OrderMagicNumber()== mn) mo[OrderType()]++;
    }
  }
}

P.S. Im Anhang finden Sie ein Skript, mit dem Sie die Funktion CountOrders() online testen können.

Dateien:
 

Guten Tag, Igor und alle anderen auch. Ich habe ein Problem mit der Funktion GetFractalBar(NULL,0, 0). - Sie gibt die Nummer des fraktalen Balkens durch seine Nummer zurück. Um genau zu sein, liegt das Problem nicht bei der Funktion. Aber irgendwo in der Nähe davon.

Wenn der Kommentar mit dieser Einstellung angezeigt wird, ist alles in Ordnung. Ich HABE die Nummer des Balkens in der Ecke des Diagramms.

int a;
... ...

int start()
  {
//----
if(Time[0] == prevtime)   return(0);//ждём нового бара
   prevtime = Time[0];//если появился новый бар , включаемся

if ( isFractalUp() > isFractalDn() )  {//если это Down-фрактал

   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   
Comment( GetFractalBar(NULL,0, 0));            }

Und alles ist in Ordnung, wenn ich in der Ecke des Diagramms Kommentarzahlen anzeige. Ich sehe die Mindestpreiswerte des Balkens mit dem Fraktal in der linken Ecke.

if ( isFractalUp() > isFractalDn() ) {//если это Down-фрактал
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));

Comment(iLow(NULL,0, GetFractalBar(NULL,0, 0)));          }

Aber weiter ist es im Allgemeinen nicht klar! Sobald ich die Variable "a" in den Kommentar statt in die Funktion selbst einfüge, gibt der Kommentar in der Ecke 1 statt des Preises zurück! Hier :

if ( isFractalUp() < isFractalDn() ) {
   a = iLow(NULL,0, GetFractalBar(NULL,0, 0));
   Comment( a);                        }
Ich sitze schon seit drei Stunden, ich verstehe nicht, was los ist! Bitte sagen Sie mir, ob Sie....
 
Rita писал(а) >>
Sobald ich die Variable "a" anstelle der Funktion selbst in den Kommentar einfüge, gibt der Kommentar anstelle des Preiswertes eine Eins in der Ecke zurück!

Sie haben die Variable "a" als Ganzzahlvariable deklariert, d. h:

int a;

Sie sollten sie als reale Variable deklarieren, d. h:

Doppel-A;

 

ModifyOrder()-Funktion für den Prüfer.

Dies ist eine vereinfachte Version der Funktion ModifyOrder(), die auf Seite 7 veröffentlicht wurde, und dient dazu, die absoluten Preisniveaus einer vorausgewählten Order oder Position zu ändern.

Die Funktion ModifyOrder() akzeptiert die folgenden Parameter:

  • pp - Preis für die Bestellung. Wenn Sie einen Wert kleiner oder gleich Null angeben, wird die Änderung dieses Preisniveaus nicht durchgeführt. Der Standardwert ist -1.
  • sl - Stoppkursniveau. Wenn Sie einen Wert kleiner als Null angeben, wird die Änderung des Preisniveaus nicht durchgeführt. Der Standardwert ist 0.
  • tp - Preisniveau nehmen. Wenn Sie einen Wert kleiner als Null angeben, wird die Änderung des Preisniveaus nicht durchgeführt. Der Standardwert ist 0.
  • ex - Verfallsdatum des schwebenden Auftrags. Der Standardwert ist 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);

  if ( pp!= op || sl!= os || tp!= ot) {
    if (MathMod(OrderType(), 2)==0) cl= clModifyBuy; else cl= clModifySell;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(", er,") modifying order: ", ErrorDescription( er));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+ GetNameOP(OrderType())," pp=", pp," sl=", sl," tp=", tp);
    }
  }
}
Grund der Beschwerde: