Nützliche Funktionen von KimIV - Seite 12

 

Die Funktion IndexByTicket().

Gibt den Index (Ordnungszahl in der allgemeinen Liste der eingestellten Aufträge oder offenen Positionen) des Auftrags oder der Position auf dem Ticket zurück. Wenn IndexByTicket() keinen Auftrag oder keine Position mit dem gewünschten Ticket findet, wird -1 zurückgegeben. Mit Hilfe der Funktionsparameter kann die Liste der zu prüfenden Aufträge oder Positionen eingeschränkt werden:

  • sy - Name des Instruments. Wenn Sie diesen Parameter angeben, prüft die Funktion nur Aufträge und Positionen für das angegebene Instrument. NULL bedeutet das aktuelle Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Geschäftsvorgang, Art des schwebenden Auftrags oder der Position. Gültige Werte: OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP oder -1. Der Standardwert -1 steht für eine beliebige Reihenfolge oder Position.
  • mn - Kennung eines Auftrags oder einer Position (MagicNumber). Der Standardwert -1 bedeutet eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket(int ti, string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(i);
      }
    }
  }
  return(-1);
}
 

Ich habe die Funktion IndexByTicket() in einem benutzerdefinierten EA geschrieben. Ich erinnere mich, dass ich darauf nicht verzichten konnte, warum hätte ich es sonst geschrieben? Aber ich kann mich nicht erinnern, wie es dort verwendet wurde oder warum ich es praktisch geschrieben habe :-) Die Suche nach dem Quellcode des Beraters ist langweilig. Es gibt Hunderte von ihnen.

Jedenfalls sehe ich keinen Sinn darin, Beispiele wie die von mir bereits genannten anzuführen. Wenn wir klug sind, können wir herausfinden, wohin wir die Parameter "stecken". Und wenn jemand eine gute Idee für die Verwendung der Funktion IndexByTicket() hat, kann er sie hier posten. Ich werde versuchen, sie zu verwirklichen.


Eine kurze Ankündigung.

Die Funktionen SelectByTicket() und SelectByTicketFromHistory() I wurden abgeschafft. Ich werde sie selbst nicht verwenden, also sehe ich keinen Grund, sie zu veröffentlichen. Diejenigen, die über dieses Thema diskutieren möchten, sind jederzeit willkommen. Ich werde alle meine Wahnvorstellungen so zeigen, wie sie sind.

 

Die Funktion NumberOfOrders().

Diese Funktion gibt die Anzahl der Aufträge zurück und übersteuert ExistOrders() funktional vollständig. Um die Funktion ExistOrders() durch die Funktion NumberOfOrders() zu ersetzen, ist es notwendig und ausreichend, den Rückgabewert daraufhin zu überprüfen, ob er größer als Null ist. Sie können die Liste der zu prüfenden Aufträge mit Hilfe der Funktionsparameter einschränken:

  • sy - Name des Instruments. Wenn dieser Parameter angegeben wird, prüft die Funktion nur die Aufträge des angegebenen Instruments. NULL bedeutet aktuelles Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Art des schwebenden Auftrags. Gültige Werte: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP oder -1. Der Standardwert von -1 bedeutet eine beliebige Reihenfolge.
  • mn - Kennung der Bestellung (MagicNumber). Der Standardwert -1 bedeutet eine beliebige MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
 

Beispiele für die Verwendung der Funktion NumberOfOrders().

  1. Gesamtbetrag aller Bestellungen abrufen
    NumberOfOrders();
  2. Anzahl der für das aktuelle Symbol erteilten Aufträge abfragen
    NumberOfOrders(NULL);
  3. Anzahl der BuyLimit-Aufträge für ein beliebiges Symbol abrufen
    NumberOfOrders("", OP_BUYLIMIT);
  4. Ermitteln Sie die Anzahl der SellStop-Aufträge mit der magischen Zahl 123456 für EURUSD
    NumberOfOrders("EURUSD", OP_SELLSTOP, 123456);
  5. Ermittelt die Anzahl der Aufträge mit der magischen Zahl 2345 für das aktuelle Symbol
    NumberOfOrders(NULL, -1, 2345);

Im Anhang finden Sie wieder ein funktionierendes Skript mit den oben genannten Beispielen.

Dateien:
 
KimIV:

Die Funktion NumberOfOrders().

Diese Funktion gibt die Anzahl der Aufträge zurück und übersteuert ExistOrders() funktional vollständig. Um die Funktion ExistOrders() durch die Funktion NumberOfOrders() zu ersetzen, ist es notwendig und ausreichend, den Rückgabewert daraufhin zu überprüfen, ob er größer als Null ist. Sie können die Liste der zu prüfenden Aufträge mit Hilfe der Funktionsparameter einschränken:

  • sy - Name des Instruments. Wenn dieser Parameter angegeben wird, prüft die Funktion nur die Aufträge des angegebenen Instruments. NULL bedeutet aktuelles Instrument, und "" (standardmäßig) bedeutet ein beliebiges Instrument.
  • op - Art des schwebenden Auftrags. Gültige Werte: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP oder -1. Der Standardwert von -1 bedeutet eine beliebige Reihenfolge.
  • mn - Kennung der Bestellung (MagicNumber). Der Standardwert von -1 bedeutet eine beliebige MagicNumber.

Ich bin ein wenig verwirrt. Aus irgendeinem Grund sehe ich einen Widerspruch. Genau hier:

"...ist es notwendig und ausreichend zu prüfen, ob der Rückgabewert größer als Null ist."

Wenn Sie "dies und nur dies" ankreuzen, ist die Funktion zur Anzahl der Aufträge bedeutungslos!

Deshalb habe ich angefangen, mich damit zu befassen. Ich habe diese Funktion in meinen Expert Advisor eingefügt. Ich habe m=1 in den Parametern und der Bedingung für offene Positionen eingestellt.

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

Aber es ist, als ob der Expert Advisor diese Einschränkung nicht sieht! Und es eröffnet Aufträge bei jedem Signal.

Was kann hier das Problem sein?

 
rid писал (а):
Ich bin ein wenig verwirrt. Aus irgendeinem Grund sehe ich einen gewissen Widerspruch. Genau hier:
"...ist es notwendig und ausreichend zu prüfen, ob der Rückgabewert größer als Null ist".
Wenn wir "dies und nur dies" ankreuzen, dann ist die Funktion für die Anzahl der Aufträge bedeutungslos!

Hmm ... Sie scheinen nicht auf die Menge der Informationen zu achten, die von den Funktionen ExistOrders() und NumberOfOrders() zurückgegeben werden. Die Funktion ExistOrders() gibt nur Informationen über das Vorhandensein von Aufträgen zurück, und die Funktion NumberOfOrders() gibt Informationen über die Anzahl der Aufträge zurück. Die Information über die Anzahl der Aufträge enthält die Information über das Vorhandensein von Aufträgen. Wenn wir die Frage beantworten müssen, ob ein Auftrag existiert oder nicht, ist die Information über die Anzahl der Aufträge überflüssig. Deshalb habe ich gesagt, dass wir, wenn wir die Funktion ExistOrders() durch die Funktion NumberOfOrders() ersetzen wollen, den von der Funktion NumberOfOrders() zurückgegebenen Wert überprüfen müssen, um sicherzustellen, dass er größer als Null ist. Denn es ist klar, dass, wenn dieser Wert gleich Null ist, keine Aufträge vorhanden sind, und wenn dieser Wert größer als Null ist, die Aufträge vorhanden sind. Die Funktion ExistOrders() kann verwendet werden, wenn wir keine Informationen über die Bestellmenge benötigen, während die Funktion NumberOfOrders() verwendet werden kann, wenn wir keine Informationen über die Bestellmenge benötigen und wenn wir sie benötigen. In diesem Sinne ersetzt die Funktion NumberOfOrders() die Funktion ExistOrders() vollständig.

los:

Deshalb habe ich begonnen, mich damit zu befassen. Ich habe diese Funktion in meinen Expert Advisor eingefügt. Ich habe m=1 in den Parametern und der Bedingung für offene Positionen eingestellt.

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

Aber es ist, als ob der Expert Advisor diese Einschränkung nicht sieht! Und es eröffnet Aufträge bei jedem Signal.

Was könnte hier das Problem sein?

Also... und hier scheinen Sie Positionen mit Haftbefehlen zu verwechseln. Für mich sind das verschiedene Dinge. Was sind Positionen? Es handelt sich dabei um OP_BUY und OP_SELL Trades, während Orders nach meinem Verständnis OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT und OP_SELLSTOP Trades sind. Ich eröffne Positionen und erteile Aufträge. Und was öffnen Sie? Die Funktion NumberOfOrders() ist für die Arbeit mit Aufträgen konzipiert.
 

Ich danke Ihnen. Ich habe alles. Sowohl bei der ersten als auch bei der zweiten Frage.

Mit anderen Worten, die "erweiterte" Funktion NumberOfOrders() enthält im Wesentlichen bereits die Funktion IndexByTicket()

Ja, in der Tat. Ich habe OP_BUY und OP_SELLgeöffnet !

Bleibt noch, ein Beispiel für Ihre nächste Funktion zu geben, die genau mit Positionen arbeitet. (nicht bei Bestellungen).

Ich erinnere mich, dass Sie es bereits irgendwo in diesem Forum gepostet haben. Ich kann es nicht finden.

 
rid писал (а):
Bleibt noch, ein Beispiel für Ihre nächste Funktion zu geben, die genau mit Positionen arbeitet. (nicht bei Bestellungen)

Ich bin fertig mit den Funktionen für Bestellungen. Es folgen die Funktionen für Planstellen. Es gibt etwa 30 davon.


rid schrieb (a):
Ich erinnere mich, dass du es bereits irgendwo im Forum gepostet hast. Ich kann sie nicht finden.

Suche

 

Lieber Igor, ich bitte dich um deine Hilfe! Ich muss einen EA hinzufügen, damit er Positionen auf mehreren Instrumenten einnehmen kann. Es gibt 2 EAs arbeiten, Standard-MACD und Ema, jeder mit 6 Positionen, aber nur eine Position öffnet... Ich habe Ihre Kommentare dazu gelesen, aber da ich der Sprache nicht mächtig bin, kann ich nicht verstehen, wo ich was hinzufügen soll... Wenn es Ihnen nichts ausmacht, helfen Sie bitte... Ema-Beraterin kopiert... Ich danke Ihnen!



//+------------------------------------------------------------------+
//| Parabolic.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+------------------------------------------------------------------+
extern double Lots=0.1;
extern double Pip=5;
extern double MoveBack=3;
extern int chk=0;
extern double SL=20;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double hi=High[1];
double lo=Low[1];
double EMA, EMA1, EMA2, EMA3;
int cnt=0, ticket, total;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1);
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
total=OrdersTotal();
if(total<1)
{
if(AccountFreeMargin()<(1000*Lots)))
{
Print("Sie haben kein Geld. Freie Mittel = ", AccountFreeMargin());
return(0);
}
if(((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3))
{
chk=1;
Print("Position ist möglich!");
}
if(chk==1)
{
if(EMA3-EMA2>2*Point && Bid>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,
"EMA position:",16385,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order open : ",OrderOpenPrice());
chk=0;
}
else
{
Print("Error opening SELL order : ",GetLastError());
return(0);
}
}
if(EMA2-EMA3>2*Point && Ask<=(hi-MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,
"EMA Position:",16385,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order open : ",OrderOpenPrice());
chk=0;
}
else
{
Print("Order BUY open error : ",GetLastError());
return(0);
}
}
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // ist dies eine offene Position? OP_BUY oder OP_SELL
OrderSymbol()==Symbol()) // Werkzeugübereinstimmung?
{
if(OrderType()==OP_BUY) // Long-Position eröffnet
{
// Prüfen wir, ob es bereits Zeit zum Schließen ist?
if(Bid>=(OrderOpenPrice()+Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // Position schließen
return(0); // exit
}
if(Bid<=(OrderOpenPrice()-SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // Position schließen
return(0); // exit
}
}
else // andernfalls handelt es sich um eine Short-Position
{
// prüfen, ob es bereits Zeit zum Schließen ist?
if(Ask<=(OrderOpenPrice()-Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // Position schließen
return(0); // exit
}
if(Ask>=(OrderOpenPrice()+SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // Position schließen
return(0); // exit
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
 

Igor, ich habe dir eine Frage in der 'Bibliothek der Funktionen für die Arbeit mit INI-Dateien' gestellt, aber es gab keine Antwort :(