Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 151

 
Maxim Kuznetsov:

etwa so:

string level="Level"+IntegerToString(iTime(_Symbol,iBarShift(OrderCloseTime())); // ид.уровня - по времени бара (!! не по тикету)

if (ObjectFind(level)‌==-1) {

  // гор.вектора нет - видимо первый ордер из закрытых на баре

  // сделать горизонтальную линию‌

  ObjectCreate(0,level,OBJ_TREND,0,OrderCloseTime(),OrderClosePrice(),OrderCloseTime()+PeriodSeconds(_Period)*3,OrderClosePrice);

 // указывающую только вправо‌

  ObjectSetInteger(level,‌OBJPROP_RAY,1);

  ObjectSetInteger(level,OBJPROP_RAYLEFT,0);

‌ // украсить её как-то :-)

 ObjectSetInteger(level,OBJPROP_‌COLOR,....)

 ....‌

} else {

  // гор.уровень есть - значит были ордера закрытые на этом баре

  // по фантазии - обновить метки/корректировать уровень/etc‌

}‌

int TotalPos=-1;

void start()
 
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

  
     }
  }}} TotalPos=OrdersTotal(); // запомним количество
//--
}
 
 
 
 void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
     
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
     
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
 
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}

Die Verwendung eines Vektors als Pegelmesser ist falsch.... nicht gut ....((

Was, wenn wir ein Pferd in Bewegung setzen?)

Bei der Niveausuche verwenden Sie das Prinzip der Gewinnsummierung auf dem Preisniveau, dessen Datensatz bereits existiert...

Ein Beispiel: Hier haben wir einen Versuch gemacht und die Gewinne mit einer Verzögerung von 60 Sekunden addiert

 for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;

Als Nächstes müssen wir uns einen Datensatz ausdenken:

Wenn die Anzahl der akkumulierten Gewinne auf der Ebene > 1 ist, dann ist dies unser Auftrag - unsere Ebene, von dieser Ebene ziehen wir einen Strahl

 

Grüße.

Ich plane einen EA mit Funktionen, die bei jedem Tick eine Schleife durch die verfügbaren, von ihm erstellten Aufträge bilden und je nach Situation handeln.

Können Sie mir sagen, wie ich für jede neue Bestellung separate Variablen erstellen kann und wie weitere Schleifen mit ihnen arbeiten können? (Ich nehme an, das ist so etwas wie Peremennaja+Ticket=12345;)

 
Andrey Sokolov:

Grüße.

Ich plane einen EA mit Funktionen, die bei jedem Tick eine Schleife durch die verfügbaren, von ihm erstellten Aufträge bilden und je nach Situation handeln.

Können Sie mir sagen, wie ich für jede neue Bestellung separate Variablen erstellen kann und wie weitere Schleifen mit ihnen arbeiten können? (Ich nehme an, das ist so etwas wie Peremennaja+Ticket=12345;)

Vorzugsweise ein Array oder sogar ein Array von Strukturen.
 
Alexey Viktorov:
Besser ein Array oder sogar ein Array von Strukturen.

Verzeihung, können Sie das näher erläutern?
 
Andrey Sokolov:

Entschuldigen Sie, könnten Sie etwas ausführlicher werden?


Hier und hier.

Es wird eine Struktur und ein Array vom Typ Struktur erstellt. Außerhalb des gesamten Codes.

struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar  slippage;     // значение допустимого проскальзывания
  };
//--- создали массив типа trade_settings
trade_settings my_set[];
// присвоить значение нулевому индексу массива в основном коде
my_set[0].take = что_то;
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
 

Hallo.

Bitte helfen Sie mir, den Schnittpunkt der horizontalen Linie"ResisL" und derTrendlinie durch den Winkel"TrndL" zu finden.

TRA
 
Nikolay Fedyay:

Hallo.

Bitte helfen Sie mir, den Schnittpunkt der horizontalen Linie"ResisL" und derTrendlinie durch den Winkel"TrndL" zu finden.

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(double left_bar, double left_price, double right_bar, double right_price, double bar_to_search) {
  return((right_bar==left_bar)?left_price:(right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
}
//+------------------------------------------------------------------+
Wenn Sie zwei Koordinatenpunkte der Steigungslinie kennen und diese als Parameter dieser Funktion einfügen, wird die Ausgabe den Preis des Punktes auf der bar_to_search anzeigen. Es bleibt nur noch, diese Funktion in der Balkenschleife aufzurufen und den von ihr zurückgegebenen Wert mit dem Preis der horizontalen Linie zu vergleichen. Wenn der von der Funktion zurückgegebene Wert beim letzten Balken des Zyklus kleiner oder gleich dem Preis der horizontalen Linie war und beim aktuellen Balken des Zyklus der von der Funktion zurückgegebene Wert größer als der Linienpreis ist, dann sind die X-Koordinaten des Schnittpunkts die dem Zyklusindex entsprechende Zeit und die Y-Koordinaten der von der Funktion zurückgegebene Preis.
 
Artyom Trishkin:

Ich danke Ihnen.

Wie wäre es, wenn Sie den Kreuzungspunkt wissen wollen, wenn es noch keine Balken gibt, d.h. ein Datum in der Zukunft.

 
Nikolay Fedyay:

Ich danke Ihnen.

Wie wäre es, wenn Sie den Kreuzungspunkt wissen wollen, wenn es noch keine Balken gibt, d.h. ein Datum in der Zukunft.

Ich habe diese Funktion noch nicht ausprobiert - ich muss noch experimentieren.

 
Artyom Trishkin:

Ich habe diese Funktion noch nicht ausprobiert - ich muss noch experimentieren.

Bitte teilen Sie das Ergebnis mit, wenn Sie Zeit zum Experimentieren finden.

Denn ich habe keine Ahnung, womit ich experimentieren soll.
.