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

 
ilnur17021992:

Bitte helfen Sie mir, eine Funktion zu schreiben, die die Anzahl der Aufträge und deren Gesamtgewinn berechnet, die in den letzten 60 Sekunden für das aktuelle Paar geschlossen wurden. Ich kann es nicht richtig formulieren.

   int CountClosedSellOrders=0, CountClosedBuyOrders;
   double ClosingSellProfit=0, ClosingBuyProfit;
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
      {
    
         
      }
   }

Ich denke, Sie werden es verstehen:

//----------------- Возвращает суммарный профит последних закрытых позиций ---------------------+
double GetProfitOldClosePos(string symb="", int type=-1, int mg=-1) {
if(symb=="0") symb=Symbol();
datetime gt=0,ct=0;
double pr=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
    if(OrderSymbol()==symb &&(type<0||OrderType()==type)&& OrderMagicNumber()==mg) {
     ct=OrderCloseTime();
     // 120 секунд разницы между закрытием первой и последней в сетке
      if((gt<=ct && ct<=gt+120) || gt==0) {
       gt=ct;
       pr+=OrderProfit()+OrderCommission()+OrderSwap();
  }}}}
  return(pr);
}
 
ilnur17021992:

Bitte helfen Sie mir, eine Funktion zu schreiben, die die Anzahl der Aufträge und deren Gesamtgewinn berechnet, die in den letzten 60 Sekunden für das aktuelle Paar geschlossen wurden. Ich kann es nicht auf der Zunge haben, ich kann es nicht richtig formulieren.

   int CountClosedSellOrders=0, CountClosedBuyOrders;
   double ClosingSellProfit=0, ClosingBuyProfit;
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
      {
         if(OrderType()==OP_SELL)
         {
            if(. . .)                    
            {
               CountClosedSellOrders++;
               ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
            }
         if(OrderType()==OP_BUY)
         {
            if(. . .)                    
            {
               CountClosedBuyOrders++;
               ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
            }
         }
      }
   }


   int CountClosedSellOrders=0,CountClosedBuyOrders;
   double ClosingSellProfit=0,ClosingBuyProfit;
//for(int i=0; i<OrdersHistoryTotal(); i++)
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
        {
         if(OrderCloseTime()>=TimeCurrent()-60)
           {
            if(OrderType()==OP_SELL)
              {
               CountClosedSellOrders++;
               ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
              }
            if(OrderType()==OP_BUY)
              {
               CountClosedBuyOrders++;
               ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
...
 
Wie kann ich bei der Eröffnung eines Auftrags einen Trailing-Stop festlegen?
 
DenZell:
Wie kann ich bei der Eröffnung eines Auftrags einen Trailing-Stop festlegen?
Das können Sie nicht. Der Anschlag wird nach der Öffnung nachgezogen.
 
trader781:

Ist der Preis gleich Null oder nicht festgelegt , wird die Zeilenkoordinate auf den Preis der letzten Bestellung gesetzt. Das ist in Ordnung.

Das Protokoll ist auch normal, es entleert das Konto, wie es sein sollte. Ich beobachte keine Fehler über unzureichende Einzahlungen.

Aber die Linie ist immer noch rot. D.h. wir rufen die Kaufzeile auf, es ist so, wir übergeben die Parameter, aber andere werden übergeben.

Diese Bedingung sollte auf keinen Fall wie in Ihrem Code geschrieben werden. Sie schaffen sich Ihre eigenen Schwierigkeiten, um sie "heldenhaft" zu überwinden ))))

Alles, was die rote Linie im Code erzeugt, ist auskommentiert, wird also von jemand anderem erstellt. Oder es hängt an der Grafik, seit dieser Teil des Codes in Arbeit ist.

Ich empfehle das Gleiche, was ich schon oft empfohlen habe - drucken Sie alle Aktionen und Rückgabecodes (Fehler) in das Protokoll, das wird viele Fragen beantworten.

 
Andrey Koldorkin:
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Sie haben keine vollständige Vorlage - wahrscheinlich haben Sie die Indikatorpuffer im Assistenten nicht gesetzt, in die die berechneten Daten geschrieben werden.

Das Grundprinzip der meisten Indikatoren ist jedoch folgendes:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<1) return(0);              // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то проверять нужно это количество, а не 1
  
   //--- Действия для полного перерасчёта индикатора
   int limit=rates_total-prev_calculated;    // количество посчитанных уже баров
   if(limit>1) {                             // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
      limit=rates_total-1;                   // задаём количество требуемых для расчёта баров равным количеству баров в истории,
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
                                             // так же тут нужно при необходимости произвести инициализацию буферов индикатора
      }
  
   //--- Основной цикл индикатора
   for(int i=limit; i>=0; i--) {
      // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
      ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0;   // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
      }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Vitalie Postolache:

Diese Bedingung sollte auf keinen Fall in Ihren Code geschrieben werden. Sie schaffen sich Ihre eigenen Schwierigkeiten, um sie "heldenhaft" zu überwinden ))))

Alles, was die rote Linie im Code erzeugt, ist auskommentiert, wird also von jemand anderem erstellt. Oder er hängt in der Tabelle, seit dieser Teil des Codes in Arbeit war.

Ich empfehle dasselbe, was ich schon oft empfohlen habe: Drucken Sie alle Aktionen und Rückgabewerte (Fehler) in das Protokoll, das wird viele Fragen beantworten.

200 Zeilen Mystik

:)

 
Artyom Trishkin:
Sie haben keine vollständige Vorlage - wahrscheinlich haben Sie die Indikatorpuffer im Assistenten nicht gesetzt, in die die berechneten Daten geschrieben werden.

Das Grundprinzip der meisten Indikatoren ist jedoch folgendes:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<1) return(0);              // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то проверять нужно это количество, а не 1
  
   //--- Действия для полного перерасчёта индикатора
   int limit=rates_total-prev_calculated;    // количество посчитанных уже баров
   if(limit>1) {                             // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
      limit=rates_total-1;                   // задаём количество требуемых для расчёта баров равным количеству баров в истории,
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
                                             // так же тут нужно при необходимости произвести инициализацию буферов индикатора
      }
  
   //--- Основной цикл индикатора
   for(int i=limit; i>=0; i--) {
      // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
      ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0;   // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
      }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
GUT. Ich danke Ihnen! Ich habe es auf mich übertragen. Ich werde mich damit befassen.
 

Bitte um Hilfe!

Es gibt eine Zeichenfolge ABCDEF, die in 3 Zeichenfolgen aufgeteilt werden soll (Speicherung in einer variablen Zeichenfolge):

AB

CD

EF

 
-Aleks-:

Bitte um Hilfe!

Es gibt eine Zeichenfolge ABCDEF, die in 3 Zeichenfolgen aufgeteilt werden soll (Speicherung in einer variablen Zeichenfolge):

AB

CD

EF

string  StringSubstr(
   string  string_value,     // строка
   int     start_pos,        // с какой позиции начать
   int     length=0          // длина извлекаемой строки
   );
...
Grund der Beschwerde: