[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 567

 
Catrock писал(а) >>

Eine weitere Frage eines Anfängers.

Ich verwende mehrere benutzerdefinierte Funktionen in meinem Expert Advisor. Wie kann ich diese Funktionen in einer Bibliothek zusammenfassen und im Hauptteil des Expert Advisors einfach von dort aus aufrufen?

Ich bin mit der Sprachsyntax in dieser Hinsicht nicht vertraut.

Bitte lesen Sie die Dokumentation oder den Abschnitt über Anleitungen. Ich habe es dort nicht gefunden.


https://book.mql4.com/ru/build/structure

https://www.mql5.com/ru/articles/1462

+ Und um das Ganze abzurunden... https://book.mql4.com/ru/appendix/examples

 

Wie schreibe ich eine Funktion, die prüft , ob eine Position am Null-Bar eröffnet ist oder wurde (vorzugsweise eine Auswahl an Zeitrahmen. OpenPosLastBar(string sym="", int tf=0, int op=-1, int mn=-1), oder diese Funktion macht das. So wie ich es verstanden habe, werden nur Positionen im Moment geöffnet, aber wenn sie offen waren und bereits geschlossen wurden, wird -1 zurückgegeben.

//+----------------------------------------------------------------------------+
//| Gibt die Taktnummer der zuletzt geöffneten Position oder -1 zurück. |
//| Parameter: |
//| sym - Instrumentenname ("" - aktuelles Symbol) |
//| tf - Zeitrahmen ( 0 - aktueller Zeitrahmen) |
//| op - Operation (-1 - beliebige Position) |
//| mn - MagicNumber (-1 - beliebige Magie) |
//+----------------------------------------------------------------------------+
int NumberOfBarLastPos(string sym="", int tf=0, int op=-1, int mn=-1)
{
datetime oot;
int i, k=OrdersTotal();

if(sym=="")
sym=Symbol();
for(i=0; ik; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==sym)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op0 || OrderType()==op)
{
if(mn0 || OrderMagicNumber()==mn)
{
if(ootOrderOpenTime()) oot=OrderOpenTime();
}
}
}
}
}
}
return(iBarShift(sym, tf, oot, True));
}
//+----------------------------------------------------------------------------+

 
Wir brauchen zwei Zyklen. In der ersten gehen wir durch die Auftragshistorie, in der zweiten durch die aktuellen Aufträge. In beiden Fällen gilt: Wenn der Zeitpunkt der Ordereröffnung größer oder gleich Time[0] ist, wurde die Order an der aktuellen Kerze eröffnet. Dies gilt für alle Zeiträume.
 
drknn >>:
Нужно два цикла. В первом проходим по истории ордеров, во втором - по текущим ордерам. В обоих случаях если время открытия ордера больше или равно Time[0], то ордер был открыт на текущей свече. Это справедливо для всех таймфреймов.

Vielen Dank für Ihren Klick. Könnten Sie dies im Code verlangen
 
gince >>:

Спадибо, что аткликнулся. А можно попросить это в коде

Hier ist ein Beispiel für eine Geschichtspassage

//=========== SchSellHist()  ===============================
//  Функция возвращает количество Sell-ордеров, лежащих в истории сегодняшних торгов
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSellHist(int MAGIC){
  string SMB=Symbol();
  int SchSell=0;
  int i;
  for (i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { WriteError(i);}
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=Time_D0){// сегодняшний ордер
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}    
             
//==================================================================================================

Versuchen Sie, einen eigenen Code zu entwickeln, zumal Sie den Algorithmus und ein fertiges Beispiel vor sich haben.
 
Hallo Leute, helft mir, den Code zu verstehen, nachdem es funktioniert eine Menge Müll ist auf dem Diagramm links Pfeile Kreise der Linie, wie sie zu entfernen oder so entfernt es sich hier ist Teil des Codes
 
void seta(string a_name_0, int a_window_8, double a_datetime_12, double a_price_20, int ai_28, color a_color_32, int a_width_36) {
ObjectDelete(a_name_0);
ObjectCreate(a_name_0, OBJ_ARROW, a_window_8, a_datetime_12, a_price_20);
ObjectSet(a_name_0, OBJPROP_ARROWCODE, ai_28);
ObjectSet(a_name_0, OBJPROP_COLOR, a_color_32);
ObjectSet(a_name_0, OBJPROP_WIDTH, a_width_36);
}

void _setabuy(string as_0) {
g_str_concat_356 = StringConcatenate(as_0, gi_120);
seta(g_str_concat_356, 0, TimeCurrent(), Bid + 15.0 * Point, SYMBOL_ARROWUP, Blue, 2);
gi_120++;
}

void _setasell(string as_0) {
g_str_concat_356 = StringConcatenate(as_0, gi_120);
seta(g_str_concat_356, 0, TimeCurrent(), Bid - 15.0 * Point, SYMBOL_ARROWDOWN, Red, 2);
gi_120++;
}
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

Ich danke Ihnen. Ich werde es ausprobieren.
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

Oder hier ist eine Funktion, die prüft, ob eine Position auf dem aktuellen Balken eröffnet wurde (mit einer Prüfung auf OrdersTotal() und OrdersHistoryTotal() ). Gibt true zurück, wenn ein Auftrag vom Typ "geöffnet" wurde.

bool CheckExists(int Type)                                  
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0]
        && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
      Result = False;
    }

  return(Result);
  }
 

Bitte sagen Sie mir, wie ich die Bedingung umsetzen kann.

Wenn (es gibt schwebende Aufträge), dann tun Sie dies und das;

Grund der Beschwerde: