Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1644

 
Andrey Sokolov se cierra el terminal o se reinicia el indicador.
2 capturas de pantalla excepto la primera no se mueven, error 5019 (el archivo no existe), aunque se muestran en la carpeta (excepto la primera hecha por el temporizador).


El mercado está cerrado y el temporizador no funciona en el probador.
 
Andrey Sokolov se cierra el terminal o se reinicia el indicador.
2 capturas de pantalla, excepto la primera, no se mueven, error 5019 (el archivo no existe), aunque se muestran en una carpeta (excepto la primera hecha por el temporizador).


Comprobado en cripta todas las capturas de pantalla hacen, pero hay un error de movimiento

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

Comprobado todas las capturas de pantalla en la cripta, pero hay un error de desplazamiento

Así es como funciona.

//+------------------------------------------------------------------+
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;
}
¿Por qué molestarse en mudarse en primer lugar?
 
MakarFX #:

Separe las funciones para facilitar la navegación.

Este es un ejemplo de OnTick()

Como puede ver, sólo hay llamadas a funciones

Buenos días, Makar, he rehecho el código y he implementado la función para calcular el precio medio en el diario, sin errores, pero sin arrastre del precio medio

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

Tomé el principio de establecer una red de arrastre de esta función para las órdenes individuales que funciona sin problemas

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

Buenos días, Makar, he rediseñado el código para calcular el precio medio, pero el arrastre del precio medio no aparece en el registro.

Tomé el principio de ajuste de la pista de esta función para las órdenes individuales que funciona sin problemas

Así es como funciona...

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

He ajustado las funciones: he eliminado lo innecesario
 
MakarFX #:

Así que está funcionando.

¿Seguro que funciona? Yo, con esta opción, sigo teniendo todos los problemas. Y es mt5.

 
MakarFX #:
¿Por qué tanto alboroto por la mudanza?

Para clasificar

 
Andrey Sokolov #:

Para clasificar

También clasifica, pero sin funciones adicionales

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

¿Seguro que funciona? Yo, con esta opción, sigo teniendo todos los problemas. Y es mt5.

Lo siento, escribí para 4...

¡Ha facturado 5! Todo funciona.

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

Es algo así...

He ajustado las funciones: he eliminado los

Makar, ¿puedes aclarar en qué parte del código se hace referencia a la función?

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