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

 
natawik:

Hola a todos, ¡ayuda por favor!

Tengo un problema de este tipo. He comprado un vpc de mql5 todo funciona bien, he instalado un experto, he configurado 8 gráficos y he puesto un experto. Y he transferido todo a Vpc.

He tenido que desinstalar metatrade de mi ordenador porque no era mío.

Y ahora cuando entro desde mi ordenador.

Todo funciona, el experto. Funciona, pero no puedo ver para hacer ningún cambio en la configuración. ¿Cómo puedo devolver el EA y los horarios para poder gestionarlos desde mi ordenador?

Gracias.

Para este caso es necesario guardar los perfiles. Para subirlo después bajo la UPU.

 

¿Quién sabe cómo exportar todos los datos del informe a exel sin distorsión?

si solo copio algunos de los datos de la columna "profit" se exporta como fecha por ejemplo enero 94 en lugar de 1.94

No importa cómo intente guardar, no puedo deshacerme de este problema.

 
законопослушный гражданин:

¿Quién sabe cómo exportar todos los datos del informe a exel sin distorsión?

si solo copio algunos de los datos de la columna "profit" se exporta como fecha por ejemplo enero 94 en lugar de 1.94

No importa cómo intente guardar, no puedo deshacerme de este problema.

Antes de cargar, o antes de abrir el archivo exportado, sustituya el separador entre la parte entera y la parte fraccionaria en Excell por un punto.

 
законопослушный гражданин:

¿Quién sabe cómo exportar todos los datos del informe a exel sin distorsión?

si solo copio algunos de los datos de la columna "profit" se exporta como fecha por ejemplo enero 94 en lugar de 1.94

No importa cómo intente guardarlo, no puedo deshacerme del problema.

Así que

 
SGarnov:

Tal vez debería tener en cuenta también el número de paradas activadas. Por ejemplo, el EA encontrará un stop en el historial, y si hay dos de ellos, debería añadirlos ambos a tres o cuatro, todo depende de la configuración externa "número de stop losses".

Lo mejor en tu caso, y no sólo en tu caso, sino en la mayoría de los casos, en lugar de acudir al historial de operaciones con una búsqueda de órdenes cerradas, guarda los tickets de órdenes abiertas en una matriz. Periódicamente, recorre la matriz para comprobar si esta orden fue cerrada por una condición simple.

if(OrderCloseTime() != 0) // значит ордер закрылся…

Si la orden se ha cerrado, se puede seleccionar por el ticket y comprobar si se ha cerrado con beneficio o no. También puede comprobar la distancia desde la posición abierta hasta el tope y añadir a esta distancia todo lo que su madre le permita.

Después de todas estas manipulaciones, debemos restablecer el tamaño del array a 0 y llenarlo de nuevo con los ticks de las órdenes abiertas en el momento actual del bucle, aumentando el tamaño del array.

 
Vladislav Andruschenko:

hay que guardar los perfiles para esta ocasión. Para subirlo después bajo la UPU.

¿Y si apago la VPN y vuelvo a poner todo en marcha y vuelvo a encender la VPN y te transfiero todos los gráficos y el EA?
No habrá datos antiguos sobre ti, ¿verdad?
 

Hola

Ayúdame a entender el código

Adjunto un trozo de código que tiene clases y todo funciona bien pero

Quiero conectar algunas funciones de las clases en una función propia y escribe errores

ejemplo

void OpenHandPosition(int tp)
   {
      string lot=0.01
      bool response = actionTrade.ManageOrderSend(tp, lt, 0, 0, 0, 0, 0);//
   }

funciona así

y esto no funciona

void OpenHandPosition(int tp)
   {

    int stopLoss   = GetStopLossPoints(size);
    int takeProfit = GetTakeProfitPoints();
    bool response = actionTrade.ManageOrderSend(tp, lt , stopLoss, takeProfit, 0, 0, 0);

   }

esta función funciona

void StrategyTrader::DoEntryTrade(TradeDirection tradeDir)

y este no lo hace

OpenHandPosition(int tp)

ayuda

Archivos adjuntos:
test.mq5  21 kb
 
SGarnov:

He llegado a la conclusión de que es difícil de implementar, tu código es mucho más sencillo, claro y lógico, pero ..... de alguna manera tampoco cuadra. Lo principal es no rendirse.

Parece que está bien. Pruébalo, pregunta...

//+------------------------------------------------------------------+
//|                                                 SGarnov.v2.1.mq4 |
//|                                           Copyright 2020, DrMak. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, DrMak."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//--- input parameters
input int      T_Profit = 2;     // Коэффициент Take Profit
input int      S_Loss   = 200;   // Уровень Stop Loss
input double   O_Lots   = 0.01;  // Лоты
input int      SL_Count = 2;     // Количество убыточных ордеров
input int      Slippage = 30;    // Проскальзывание
input int      N_Magic  = 888;   // Magic

datetime T_Start;
double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 
   Comment("");
//--- 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   t_profit = S_Loss*T_Profit * Point();
   tp_price = NormalizeDouble(t_profit+GetPointLoss(), Digits);
//---
   s_loss   = MathMax(S_Loss, MarketInfo(_Symbol, MODE_STOPLEVEL)) * Point();
   sl_price = NormalizeDouble(s_loss, Digits);
//---
   // Удаляем отложенный ордер после профита
   if(CountOrders(-1)==1) DeletePending();
//---
   // Проверяем серию убыточных ордеров
   if(CountOrders(-1)==1&&GetLossOrders()<SL_Count)
     {
      // Устанавливаем отложенный ордер
      SendPending();
     }
//---
   // Проверяем наличие ордеров
   if(CountOrders(-1)>0)
     {
      // Устанавливаем StopLoss/TakeProfit
      ModifyOrder();
     }
//---
   int a=(int)TimeStart();
   int b=GetLossOrders();
   int c=(int)((GetPointLoss()+t_profit)/Point);
   
   Comment("Время начала цикли: ",TimeToStr(a,TIME_SECONDS),"\n",
           "Серия StopLoss ордеров: ",b,"\n",
           "Размер TakeProfita: ",c);
  }
//+------------------------------------------------------------------+
//| Модификация ордера                                               |
//+------------------------------------------------------------------+
void ModifyOrder()
  {
   double op=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderStopLoss()==0)
              {
               if(OrderType()==OP_BUY)
                 {op=OrderOpenPrice();
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), op-sl_price, op+tp_price, OrderExpiration()))
                    {Print("Ордер модифицирован");}
                  else
                    {Print("Ошибка модификации ордера:", GetLastError());}
                 }
               if(OrderType()==OP_SELL)
                 {op=OrderOpenPrice();
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), op+sl_price, op-tp_price, OrderExpiration()))
                    {Print("Ордер модифицирован");}
                  else
                    {Print("Ошибка модификации ордера:", GetLastError());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL               |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT          |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP           |
//|  6 - ордера типа Balance     -1 - Все типы ордеров               |
//+------------------------------------------------------------------+
int CountOrders(int or_ty=-1) 
  {
   int cnt=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==_Symbol)
           {
            if(or_ty<0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
//| Установка отложенного ордера                                     |
//+------------------------------------------------------------------+
void SendPending()
  {
   double op=0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderStopLoss() != 0)
                 {
                  op=OrderStopLoss();
                  if(OrderSend(_Symbol,OP_SELLSTOP,O_Lots,op,Slippage,0,0,NULL,N_Magic))
                    {Print("Отложенный ордер установлен");}
                  else
                    {Print("Ошибка установки отложеного одера: ", GetLastError());}
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss() != 0)
                 {
                  op=OrderStopLoss();
                  if(OrderSend(_Symbol,OP_BUYSTOP,O_Lots,op,Slippage,0,0,NULL,N_Magic))
                    {Print("Отложенный ордер установлен");}
                  else
                    {Print("Ошибка установки отложеного одера: ", GetLastError());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|  Возвращает пункты убытка закрытых ордеров с начала цикла        |
//+------------------------------------------------------------------+
double GetPointLoss()
  {
   double result=0,b=0,s=0;;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderProfit()<0)
                 {
                  if(OrderCloseTime()>=TimeStart())
                    {
                     if(OrderType()==OP_BUY)
                       {
                        b+=OrderOpenPrice()-OrderClosePrice();
                       }
                     if(OrderType()==OP_SELL)
                       {
                        s+=OrderClosePrice()-OrderOpenPrice();
                       }
                    }
                 }
              }
           }
        }
     }
   return(b+s);
  }
//+------------------------------------------------------------------+
//| Удаление отложенного ордера                                      |
//+------------------------------------------------------------------+
void DeletePending()
  {
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
              {
               if(OrderMagicNumber() == N_Magic)
                 {
                  if(OrderDelete(OrderTicket()))
                    {Print("Отложенный ордер удален");}
                  else
                    {Print("Ошибка удаления отложеного одера: ", GetLastError());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Возвращает время начала цикла                                    |
//+------------------------------------------------------------------+
datetime TimeStart()
  {
   datetime ts1=0,ts2=0;
   if(OrdersTotal()!=0)
     {
      for(int i = OrdersTotal() - 1; i >= 0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS))
           {
            if(OrderMagicNumber()!=N_Magic)
              {
               if(OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                  if(OrderSymbol()==_Symbol)
                    {
                     if(ts1<OrderOpenTime())
                       {
                        ts1=OrderOpenTime();
                       }
                    }
                 }
              }
           }
        }
      for(int pos=0; pos<OrdersHistoryTotal(); pos++)
        {
         if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
           {
            if(OrderMagicNumber()!=N_Magic)
              {
               if(OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                  if(OrderSymbol()==_Symbol)
                    {
                     if(ts2<OrderOpenTime())
                       {
                        ts2=OrderOpenTime();
                       }
                    }
                 }
              }
           }
        }
     }
   return(MathMax(ts1,ts2));
  }
//+------------------------------------------------------------------+
//|  Возвращает кол-во серии убыточных ордеров                       |
//+------------------------------------------------------------------+
int GetLossOrders()
  {
   int cnt=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if((OrderSymbol()==_Symbol))
           {
            if(OrderCloseTime()>=TimeStart())
              {
               if(OrderProfit()<0) cnt++;
              }
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
 
MakarFX:

Parece que está bien. Pruébalo, pregunta...

Gracias por la ayuda, recién la semana que viene podré escribir la corrección del EA, hoy es viernes y ya no estoy buscando precios de entrada al mercado.

 
natawik:
¿Qué pasa si apago la VPN y vuelvo a poner todo, luego vuelvo a encender la VPN y te transfiero todo, los gráficos y el Asesor Experto?
No habrá datos antiguos sobre ti, ¿verdad?
A menudo me encuentro con este tipo de problemas cuando monto un PC, configuro el terminal, luego migro todo, sigo trabajando, cambio de gráficos, etc., y entonces zas, hay que cambiar algo.... Tengo que hacerlo todo de nuevo.