Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1644

 
Andrey Sokolov #:

Здравствуйте. Подскажите, пожалста. 

делаю: индикатор, который по таймеру делает скриншоты и раскладывает по папкам (символ период). 

задуманный алгоритм: скриншот делается при инициализации. Тк на файловые операции нужно время, то по таймеру сначала перемещается сделанный скриншот, и делается новый.

Скрин сделанный при инициализации по таймеру успешно перемещается. 

Проблемы:
1 первый скрин сделанный  по таймеру в папке сразу не отображается. Отображается ТОЛЬКО при закрытии терминала или перезапуске индикатора.
2 скрины, кроме первого, не перемещаются, ошибка 5019 (файл не существует), хотя в папке отображаются (кроме первого сделанного по таймеру).


Рынок закрыт, а в тестере таймер не работает.
 
Andrey Sokolov #:

Здравствуйте. Подскажите, пожалста. 

делаю: индикатор, который по таймеру делает скриншоты и раскладывает по папкам (символ период). 

задуманный алгоритм: скриншот делается при инициализации. Тк на файловые операции нужно время, то по таймеру сначала перемещается сделанный скриншот, и делается новый.

Скрин сделанный при инициализации по таймеру успешно перемещается. 

Проблемы:
1 первый скрин сделанный  по таймеру в папке сразу не отображается. Отображается ТОЛЬКО при закрытии терминала или перезапуске индикатора.
2 скрины, кроме первого, не перемещаются, ошибка 5019 (файл не существует), хотя в папке отображаются (кроме первого сделанного по таймеру).


Проверил на крипте все скрины делает, но есть ошибка перемещения

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

Проверил на крипте все скрины делает, но есть ошибка перемещения

Так все работает

//+------------------------------------------------------------------+
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;
}
А зачем вообще заморочка с перемещением?
 
MakarFX #:

Раздели функции тебе будет легче ориентироваться

Вот пример OnTick()

Как видишь здесь только обращения к функциям

Макар доброе время суток переделал код вывел функцию расчета средней цены в журнале ошибок нет но  и трала от средней цены нет

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

  Принцип выставления трала  я взял из этой функции для одиночных ордеров которая работает безотказно 

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

Макар доброе время суток переделал код вывел функцию расчета средней цены в журнале ошибок нет но  и трала от средней цены нет

  Принцип выставления трала  я взял из этой функции для одиночных ордеров которая работает безотказно 

Примерно так...

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

Я подправил функции - убрал лишнее
 
MakarFX #:

Так все работает

Точно работает? У меня, с таким вариантом, все проблемы остались. И это мт5

 
MakarFX #:
А зачем вообще заморочка с перемещением?

Для сортировки

 
Andrey Sokolov #:

Для сортировки

Тоже сортирует, но без лишних функций

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

Точно работает? У меня, с таким вариантом, все проблемы остались. И это мт5

Сорри, я для 4 писал...

Проверил в 5! Все работает.

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
Файлы:
Scrin.mq5  8 kb
 
MakarFX #:

Примерно так...

Я подправил функции - убрал лишнее

Макар а можете пояснить а с какого места кода будет отсылка к функции 

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