Nützliche Funktionen von KimIV - Seite 26

 
aceventura:

Die Funktion "Anzahl der Aufträge" wird nicht funktionieren, da der EA für jedes Paar anders eingestellt ist. Und es werden gleichzeitig Aufträge für verschiedene Paare erteilt. Wenn dann vier Aufträge für zwei Paare erteilt werden und einer ausgelöst wird, werden drei davon gelöscht und der gegenüberliegende Auftrag sollte für alle Paare gelöscht werden.

Alle Funktionen von KimIV "filtern" Bestellungen nach Typ+Paar+Magie. D.h. (für mich! :) nicht zu laufen und zu suchen - von dieser Seite "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) durch Aufruf von "Count there some" Sicherlich werden Sie die echten geöffneten Aufträge für dieses Währungspaar oder sogar mit diesem EA erhalten.

ZS Ich meinte die Funktion

int NumberOfOrders(string sy="", int op=-1, int mn=-1)

ab Seite 12.

 
SergNF:

Alle Funktionen von KimIV 'filtern' Aufträge nach Typ+Paar+Magie. D.h. (für mich! :) nicht zu laufen und zu suchen - von dieser Seite "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) durch Aufruf von "Count there some" Mit Sicherheit werden Sie die tatsächliche Anzahl der offenen Aufträge für dieses Paar oder sogar für diesen EA erhalten.

Ich meinte die Funktion

ab Seite 12.

Ich danke Ihnen! Sehr hilfreich! Ich werde es mir ansehen.

 
Entschuldigung für die Störung Hilfe für Dummies Wie kann man schnell und bequem parallele Linien in MT4 zeichnen?
 
extern double Lots = 0.1;
extern double TrailingStop = 10;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Bitte um Hilfe. Ich habe einen einfachen EA zusammengestellt, der einen Trailing-Stop verwendet.

Wie man Trailing-Stop zu machen, wurde einmal +5 Pips und nicht weiter übertragen, Schließen wurde von getan

Wie verwende ich den Trailing-Stop, wenn er bereits durch die Indikatoren gesetzt ist? Wenn Sie ein Beispiel nennen können!!!
 
KimIV писал (а) >>

Wahrscheinlich nicht... Ich habe nur zwei: Zeigefinger und Griff... >> hee

Igor, ich bin in dich verknallt, auch wenn ich nicht schwul bin. Schließlich können Sie auch als Zadornov arbeiten.

 

SecondsAfterOpenLastPos() Funktion.

Diese Funktion gibt die Anzahl der Sekunden seit dem letzten Öffnen der Position zurück. Die Auswahl der zu berücksichtigenden Positionen wird durch externe Parameter festgelegt:

  • sy - Bezeichnung des Marktinstruments. Wenn dieser Parameter gesetzt ist, berücksichtigt die Funktion nur Positionen des angegebenen Instruments. Der Standardwert - "" - bedeutet ein beliebiges Marktinstrument. NULL-Wert bedeutet das aktuelle Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Positionsbezeichner, MagicNumber. Der Standardwert -1 bedeutet einen beliebigen Bezeichner.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.S. Im Anhang finden Sie ein Skript zum Testen der Funktion SecondsAfterOpenLastPos().
 

Es tut mir natürlich wahnsinnig leid, was Sie tun, ist sicherlich eine gute Sache.

Aber WIE man es macht, gefällt mir überhaupt nicht.

1. die Tatsache, dass Sie die Namen der Variablen beschreiben, ist großartig, aber jedes Mal, wenn man in der Kopfzeile nachsehen muss, was die nächste wilde Abkürzung bedeutet, ist es schwer zu verstehen, wofür die Variable steht, man vergisst, was man im Code herausfinden wollte. Kannst du nicht einen QUALITÄTSVOLLEN, selbstdokumentierten Code schreiben, der auch ohne Kommentare für jemanden, der Englisch kann, verständlich ist, zumal du es für andere machst und andere mit dieser Qualität niemals einen Fehler im Code finden werden, wenn es einen gibt.



2. Überladene Funktionen. Vielseitigkeit ist eine SCHLECHTE Sache, 6 Parameter für eine Funktion sind zu viel.



3. Code Einfachheit

Beispiel.

datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

Dies ist Ihr Code. Mal sehen, was man damit machen kann:

datetime SecondsAfterOpenLastPos(string symbol = "", int type = -1, int magic = -1) 
{
  datetime nearestTime = 0; // Инициализировать не надо? Самые сложно находимые ошибки.
  int count = OrdersTotal();
 
  if (symbol == "0") 
     symbol = Symbol();
 
  for (int i = 0; i < count; i++) 
  {
     // invalid select    
     if (!OrderSelect(i, SELECT_BY_POS)) continue;
     
     // not needed symbol     
     if (OrderSymbol() != symbol && symbol != "") continue;
 
     int currentType = OrderType();
 
     // only active orders are checked     
     if (currentType != OP_BUY && currentType != OP_SELL) continue;
     
     // type doesn't pass     
     if (type > 0 && currentType != type) continue;
 
     // magic number doesn't pass     
     if (magic > 0 && OrderMagicNumber() != magic) continue;
 
     if (nearestTime < OrderOpenTime()) nearestTime = OrderOpenTime();
  }
 
  return (TimeCurrent() - nearestTime);
}

Sollen wir den Code vergleichen? Es tut dasselbe.

1. Ja, mein Code ist größer, aber wir leben ja nicht mehr im Zeitalter der Disketten, ist da nicht genug Platz?

2. Mein Code ist darin viel klarer. Auch ohne die Kommentare, die an Ort und Stelle eingefügt werden.

3. Ihre Funktion hat 7 Verschachtelungen, meine hat 2, gibt es da einen Unterschied?

4 Es ist eine der wenigen Funktionen, die nicht überladen ist, aber das Öffnen, Ändern usw. ist ein Alptraum.



SZZH: Respektiere die Leute, für die du schreibst.

 

Но КАК вы это делаете, мне абсолютно не нравится.

-1. Sie stimmen nicht zu. Ich bin mit allem absolut einverstanden, sowohl mit der Form als auch mit dem Inhalt. Bitte fahren Sie in genau demselben Format fort.

Ja, mein Code ist größer.

Ganz genau. Und je kleiner der Code ist, desto leichter ist er zu lesen. Ich hasse "verschmierte" Schriftarten auf 2-3 Bildschirmen. Eine Funktion sollte auf einem einzigen Bildschirm zu sehen sein, ohne dass man sie durchblättern muss. Deshalb bin ich für Kompaktheit.

Ihre Funktion hat 7 Verschachtelungen, ich habe 2, gibt es da einen Unterschied?

Ist es in Ordnung, dass Sie viele optionale Fortsetzungen haben, die übrigens die Aufmerksamkeit des Lesers wieder ablenken?

 
Andrei(TheXpert), vielen Dank für Ihre Kommentare und Vorschläge! Sie sind alle absolut fair und Sie haben mit Ihren Aussagen absolut Recht!
 

DeleteOppositeOrders() Funktion.

Diese Funktion löscht eine oder mehrere Orders, die der Position entgegengesetzt sind, deren Typ im Parameter op angegeben ist. Bei einer Kaufposition wären die entgegengesetzten Orders zum Beispiel SellLimit und SellStop. Die Löschung des gegensätzlichen Auftrags wird notwendig, wenn z.B. zwei gegensätzliche Aufträge eingestellt sind und einer davon auslöst.

  • sy - Bezeichnung des Marktinstruments. Wenn Sie diesen Parameter setzen, wird die Funktion nur Positionen des angegebenen Symbols berücksichtigen. Der Standardwert "" bedeutet ein beliebiges Marktinstrument. NULL-Wert bedeutet das aktuelle Instrument.
  • op - Handelsoperation, Positionsart. Gültige Werte: OP_BUY, OP_SELL oder -1. Der Standardwert -1 bedeutet eine beliebige Position.
  • mn - Positionsbezeichner, MagicNumber. Der Standardwert -1 bedeutet einen beliebigen Bezeichner.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
SZZ: Im Anhang finden Sie ein Skript zum Testen der Funktion DeleteOppositeOrders().
Grund der Beschwerde: