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

 
Andrey Sokolov das Terminal geschlossen oder der Indikator neu gestartet wird.
2 Screenshots außer dem ersten werden nicht verschoben, Fehler 5019 (Datei existiert nicht), obwohl sie im Ordner angezeigt werden (außer dem ersten, der vom Timer erstellt wurde).


Der Markt ist geschlossen und die Zeitschaltuhr funktioniert im Tester nicht.
 
Andrey Sokolov das Terminal geschlossen oder der Indikator neu gestartet wird.
2 Screenshots, außer dem ersten, werden nicht verschoben, Fehler 5019 (Datei existiert nicht), obwohl sie in einem Ordner angezeigt werden (außer dem ersten, der von Timer erstellt wurde).


Überprüft auf cripta alle Screenshots tun, aber es gibt einen Fehler bewegen

2021.10.03 15:23:56.384 Scrin BTCUSD,M5: screen name_file 2021.10.03 15-23-56.png
2021.10.03 15:23:56.367 Scrin BTCUSD,M5: FileMove ERR: 4051
2021.10.03 15:23:56.367 Scrin BTCUSD,M5: OnTimer() 
2021.10.03 15:23:51.391 Scrin BTCUSD,M5: screen name_file 2021.10.03 15-23-51.png
2021.10.03 15:23:51.374 Scrin BTCUSD,M5: FileMove ERR: 4051
2021.10.03 15:23:51.374 Scrin BTCUSD,M5: OnTimer() 
2021.10.03 15:23:46.378 Scrin BTCUSD,M5: screen name_file 2021.10.03 15-23-46.png
2021.10.03 15:23:46.360 Scrin BTCUSD,M5: FileMove ERR: 4051
2021.10.03 15:23:46.360 Scrin BTCUSD,M5: OnTimer() 
 
MakarFX #:

Ich habe alle Screenshots in der Krypta überprüft, aber es gibt einen Verschiebungsfehler

So funktioniert es.

//+------------------------------------------------------------------+
bool Move(){
   string src_path=name_file; 
   string dst_path=name_folder+"//"+name_file; 
   ResetLastError();
   if(FileMove(src_path,0,dst_path,0)){
      Print("FileMove OK ");
      return true;
   }   
   else{
      string err_text="FileMove ERR: "+(string)GetLastError();
      if(GetLastError()==5019) err_text+=("  5019 name_file "+name_file);
      Print(err_text);
   }  
   return false;
}
Warum sollte man überhaupt umziehen?
 
MakarFX #:

Trennen Sie die Funktionen, um Ihnen die Navigation zu erleichtern.

Hier ist ein Beispiel für OnTick()

Wie Sie sehen können, gibt es nur Aufrufe von Funktionen

Guten Tag, Makar, ich habe den Code neu gemacht und die Funktion zur Berechnung des Durchschnittspreises im Journal implementiert, keine Fehler, aber kein Schleppnetz vom Durchschnittspreis

//+----------------------------------------------------------------------------+
//| Расчет среденй цены                                                        |
//+----------------------------------------------------------------------------+
double GetAveragePrice()
{
   order_lots = 0;
   price = 0;
   {
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL)
           {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots();
            avg_price = NormalizeDouble(price / order_lots, Digits);
             {
               ObjectDelete(0, "AveragePriceLine");
               ObjectCreate(0,"AveragePriceLine" ,OBJ_HLINE, 0, 0, avg_price);
               ObjectSet("AveragePriceLine",OBJPROP_COLOR, Magenta);
             }
           }
         }
       }
    }
   }
return(avg_price);
}
//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
          {
          if (otype == OP_BUY) tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder*Point, Digits);
          if (otype == OP_SELL) tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder*Point, Digits);
          if ((otype == OP_BUY || otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero)) 
           tp = NormalizeDouble (GetAveragePrice(), Digits);
          }
       }
    }
    for(int i = OrdersTotal()-1; i>=0; i--) 
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
           if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                  Print("Ордера успешно модифицированы!");
                else Print("Ошибка модификации ордеров!");
                TrailingGroupOrder();
           }
       }
    }
}
//+----------------------------------------------------------------------------+
//| Трейлинг стоп групповых ордеров                                            |
//+----------------------------------------------------------------------------+
void TrailingGroupOrder()
{
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
       if(OrderType() == OP_BUY && Bid - GetAveragePrice() > TrailingStopGroupOrder*Point)
        {
        if(Bid - GetAveragePrice() > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
         {
         if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder )*Point || OrderStopLoss() == 0)
          {
          if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopGroupOrder*Point, Digits), tp, 0))
                    Print("Ошибка модификации групповых ордеров на покупку!");
          }
         }
        }
        if(OrderType() == OP_SELL && GetAveragePrice() - Ask > TrailingStopGroupOrder*Point)
         {
         if(GetAveragePrice() - Ask > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
           {
            if(OrderStopLoss() > Ask + (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
              {
              if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopGroupOrder*Point, Digits), tp, 0))
                    Print("Ошибка модификации групповых ордеров на продажу!");
              }
           }
         }
      } 
    }
}

Ich habe das Prinzip der Einstellung eines Schleppnetzes aus dieser Funktion für einzelne Aufträge, die ohne Fehler funktioniert

//+----------------------------------------------------------------------------+
//| Трейлинг стоп одиночных ордеров                                            |
//+----------------------------------------------------------------------------+
void Trailing()
{
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
           if(OrderType() == OP_BUY && Bid - OrderOpenPrice() > TrailingStopFirstOrder*Point)
           {
             if(Bid - OrderOpenPrice() > TrailingStopFirstOrder*Point || OrderStopLoss() == 0)
             {
                if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopFirstOrder)*Point || OrderStopLoss() == 0)
                {
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopFirstOrder*Point, Digits), tp, 0))
                    Print("Ошибка модификации ордера на покупку!");
                }
             }
           }
           if(OrderType() == OP_SELL && OrderOpenPrice() - Ask > TrailingStopFirstOrder*Point)
           {
             if(OrderOpenPrice() - Ask > TrailingStopFirstOrder*Point || OrderStopLoss() == 0)
             {
                if(OrderStopLoss() > Ask + (TrailingStep + TrailingStopFirstOrder)*Point || OrderStopLoss() == 0)
               {
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopFirstOrder*Point, Digits), tp, 0))
                    Print("Ошибка модификации ордера на продажу!");
               }
             }
           }
         }
      }
   }
}
 
EVGENII SHELIPOV #:

Guten Tag, Makar, ich habe den Code umgestaltet, um den Durchschnittspreis zu berechnen, aber der Durchschnittspreis erscheint nicht im Protokoll.

Das Prinzip der Weichenstellung habe ich von dieser Funktion für Einzelaufträge übernommen, die einwandfrei funktioniert

Und so funktioniert es...

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
   {
//---
   if(CountTrade()>1) TrailingGroupOrder();
   }
//+----------------------------------------------------------------------------+
//| Расчет среденй цены                                                        |
//+----------------------------------------------------------------------------+
double GetAveragePrice()
   {
   order_lots = 0;
   price = 0;
      {
      for(int i = OrdersTotal()-1; i>=0; i--)
         {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  price += OrderOpenPrice() * OrderLots();
                  order_lots += OrderLots();
                  avg_price = NormalizeDouble(price / order_lots, Digits);

                  ObjectDelete(0, "AveragePriceLine");
                  ObjectCreate(0,"AveragePriceLine" ,OBJ_HLINE, 0, 0, avg_price);
                  ObjectSet("AveragePriceLine",OBJPROP_COLOR, Magenta);
                  }
               }
            }
         }
      }
   return(avg_price);
   }
//+----------------------------------------------------------------------------+
//| Трейлинг стоп групповых ордеров                                            |
//+----------------------------------------------------------------------------+
void TrailingGroupOrder()
   {
   for(int i = OrdersTotal()-1; i>=0; i--)
      {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
         if(OrderType() == OP_BUY)
            {
            if(Bid - GetAveragePrice() > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
               {
               if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder )*Point || OrderStopLoss() == 0)
                  {
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopGroupOrder*Point, Digits), tp, 0))
                     Print("Ошибка модификации групповых ордеров на покупку!");
                  }
               }
            }
         if(OrderType() == OP_SELL)
            {
            if(GetAveragePrice() - Ask > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
               {
               if(OrderStopLoss() > Ask + (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                  {
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopGroupOrder*Point, Digits), tp, 0))
                     Print("Ошибка модификации групповых ордеров на продажу!");
                  }
               }
            }
         } 
      }
   }
//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
   {
   for(int i = OrdersTotal()-1; i>=0; i--)
      {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            {
            if (otype == OP_BUY)
               {
               tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder*Point, Digits);
               if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                  Print("Ордера успешно модифицированы!");
               else Print("Ошибка модификации ордеров!");
               }
            if (otype == OP_SELL)
               {
               tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder*Point, Digits);
               if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                  Print("Ордера успешно модифицированы!");
               else Print("Ошибка модификации ордеров!");
               }
            }
         }
      }
   }

Ich habe die Funktionen optimiert - unnötige Funktionen entfernt
 
MakarFX #:

Es klappt also.

Sind Sie sicher, dass es funktioniert? Ich habe mit dieser Option immer noch alle Probleme. Und es ist mt5.

 
MakarFX #:
Warum die Aufregung um den Umzug?

Zum Sortieren

 
Andrey Sokolov #:

Zum Sortieren

Auch sortiert, aber ohne zusätzliche Funktionen

#property strict
#property indicator_chart_window
#property indicator_plots 0

enum ENUM_FULL_MANUAL { full, //весь график
            manual, //указанный
            };
input int timer=5; //время на шаг в секундах
input ENUM_FULL_MANUAL skr_mode=full; //размер скриншота   
input int width = 640; // ширина 
input int height = 320;// высота 
input string format = ".png";

ENUM_ALIGN_MODE align_mode=ALIGN_RIGHT; // тип выравнивания

string name_folder, name_file;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
EventSetTimer(timer);
Print("OnInit()");
name_folder=Symbol()+"  "+StringPeriod();
ScreenShot();

return(INIT_SUCCEEDED);
}
//===================================================================
void OnDeinit(const int reason)
{
EventKillTimer();
}
//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
   Print("OnTimer() ");
   ScreenShot();
}
//+------------------------------------------------------------------+
bool ScreenShot(){   
   name_file=TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+format;
   StringReplace(name_file, ":", "-");
   if(skr_mode==full){
      if(ChartScreenShot(0, name_folder+"//"+name_file, (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0)
      , (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0), ALIGN_RIGHT)){
         Print("screen name_file ", name_file);
         return true;
      }
      else{
         Print("screen ERR: ", GetLastError());
      }   
   }   
   if(skr_mode==manual){
      if(ChartScreenShot(0, name_file, width, height, align_mode)){
         return true;
      }
   }      
   return false;  
}
string StringPeriod(){
   if(Period()==1) return "M1";
   if(Period()==2) return "M2";
   if(Period()==3) return "M3";
   if(Period()==4) return "M4";
   if(Period()==5) return "M5";
   if(Period()==6) return "M6";
   if(Period()==10) return "M10";
   if(Period()==12) return "M12";
   if(Period()==15) return "M15";
   if(Period()==20) return "M20";
   if(Period()==30) return "M30";
   if(Period()==16385) return "H1";
   if(Period()==16386) return "H2";
   if(Period()==16387) return "H3";
   if(Period()==16388) return "H4";
   if(Period()==16390) return "H6";
   if(Period()==16392) return "H8";
   if(Period()==16396) return "H12";
   if(Period()==16408) return "Daily";
   if(Period()==32769) return "Weekly";
   if(Period()==49153) return "Monthly";
   return "ERROR";
}
 
Andrey Sokolov #:

Sind Sie sicher, dass es funktioniert? Mit dieser Option habe ich immer noch alle Probleme. Und es ist mt5.

Entschuldigung, ich schrieb für 4...

Eingecheckt in 5! Alles funktioniert.

2021.10.03 17:55:54.192 Scrin (BTCUSD,M5)       OnTimer() 
2021.10.03 17:55:54.195 Scrin (BTCUSD,M5)       screen name_file 2021.10.03 17-55-54.png
2021.10.03 17:55:59.211 Scrin (BTCUSD,M5)       OnTimer() 
2021.10.03 17:55:59.213 Scrin (BTCUSD,M5)       screen name_file 2021.10.03 17-55-59.png
2021.10.03 17:56:04.214 Scrin (BTCUSD,M5)       OnTimer() 
2021.10.03 17:56:04.217 Scrin (BTCUSD,M5)       screen name_file 2021.10.03 17-56-04.png
2021.10.03 17:56:09.204 Scrin (BTCUSD,M5)       OnTimer() 
2021.10.03 17:56:09.236 Scrin (BTCUSD,M5)       screen name_file 2021.10.03 17-56-09.png
2021.10.03 17:56:14.202 Scrin (BTCUSD,M5)       OnTimer() 
2021.10.03 17:56:14.205 Scrin (BTCUSD,M5)       screen name_file 2021.10.03 17-56-14.png
Dateien:
Scrin.mq5  8 kb
 
MakarFX #:

Es geht ungefähr so...

Ich habe die Funktionen überarbeitet - ich habe die unnötigen

Makar, können Sie klären, auf welche Stelle im Code sich die Funktion bezieht?

//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
          {
          if (otype == OP_BUY) tp = NormalizeDouble (GetAveragePrice() + TakeProfitGroupOrder*Point, Digits);
          if (otype == OP_SELL) tp = NormalizeDouble (GetAveragePrice() - TakeProfitGroupOrder*Point, Digits);
          if ((otype == OP_BUY || otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero)) 
           tp = NormalizeDouble (GetAveragePrice(), Digits);
          }
       }
    }
    for(int i = OrdersTotal()-1; i>=0; i--) 
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
           if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                  Print("Ордера успешно модифицированы!");
                else Print("Ошибка модификации ордеров!");
                TrailingGroupOrder();
           }
       }
    }
}
Grund der Beschwerde: