Any questions from newcomers on MQL4 and MQL5, help and discussion on algorithms and codes - page 1644

 
Andrey Sokolov terminal is closed or indicator is restarted.
2 screenshots except first one are not moved, error 5019 (file does not exist), although they are displayed in folder (except first one made by timer).


The market is closed and the timer does not work in the tester.
 
Andrey Sokolov terminal is closed or indicator is restarted.
2 screenshots, except the first, are not moved, error 5019 (file does not exist), although they are displayed in a folder (except the first one made by timer).


Checked on cripta all screenshots do, but there is a move error

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 #:

Checked all screenshots on the crypt, but there is a displacement error

That's how it works.

//+------------------------------------------------------------------+
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;
}
Why bother moving in the first place?
 
MakarFX #:

Separate the functions to make it easier for you to navigate.

Here's an example of OnTick()

As you can see there are only calls to functions

Good day, Makar, I have remade the code and implemented the function for calculating the average price in the journal, no errors, but no trawl from the average price

//+----------------------------------------------------------------------------+
//| Расчет среденй цены                                                        |
//+----------------------------------------------------------------------------+
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("Ошибка модификации групповых ордеров на продажу!");
              }
           }
         }
      } 
    }
}

I took the netting principle from this function for single orders that works without fail

//+----------------------------------------------------------------------------+
//| Трейлинг стоп одиночных ордеров                                            |
//+----------------------------------------------------------------------------+
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 #:

Good day, Makar, I have redesigned the code to calculate the average price, but the average price trawl does not appear in the log.

I took the trail setting principle from this function for single orders that works flawlessly

Here's how it works...

//+------------------------------------------------------------------+
//| 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("Ошибка модификации ордеров!");
               }
            }
         }
      }
   }

I tweaked the functions - removed unnecessary
 
MakarFX #:

So it's working.

Are you sure it works? I, with this option, still have all the problems. And it's mt5.

 
MakarFX #:
Why the fuss about moving at all?

To sort

 
Andrey Sokolov #:

For sorting

Also sorts, but without extra functions

#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 #:

Are you sure it works? I, with this option, still have all the problems. And it's mt5.

Sorry, I wrote for 4...

Checked in 5! Everything works.

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
Files:
Scrin.mq5  8 kb
 
MakarFX #:

It goes something like this...

I've tweaked the functions - I've removed the unnecessary

Makar, can you clarify where in the code the function is referred to?

//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
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();
           }
       }
    }
}
Reason: