新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1551

 
natawik:

大家好,请帮助我

我有一个这样的问题。我从mql5 买了一个vpc,一切工作正常,自己安装了一个专家,设置了8个图表,并设置了一个专家。我把整个事情转移到vpc。

我不得不从我的电脑上卸载metatrade,因为它不是我的。

而现在当我从电脑里进去的时候。

一切都在运作,专家。它可以工作,但我看不到它,无法对设置进行任何修改。我怎样才能归还EA和时间表,以便我可以从我的电脑上管理它们?

谢谢你!

你需要为这种情况保存配置文件。为了以后在万国邮联下上传。

 

谁知道如何将报告中的所有数据不失真地导出到exel?

如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。

无论我怎么保存,都无法摆脱这个问题。

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

谁知道如何将报告中的所有数据不失真地导出到exel?

如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。

无论我怎么保存,都无法摆脱这个问题。

在上传之前,或在打开导出的文件之前,在Excell中把整数部分 和小数部分 之间的分隔符换成一个点。

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

谁知道如何将报告中的所有数据不失真地导出到exel?

如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。

无论我怎么保存,都无法摆脱这个问题。

所以

 
SGarnov:

也许你还应该考虑到被触发的停止次数。例如,EA 会在历史上找到一个止损点,如果有两个,它应该把它们都加到三个或四个,这完全取决于外部设置 "止损点的数量"。

在你的情况下,最好的事情是,不仅在你的情况下,而且在大多数情况下,不要用搜索关闭的订单转向交易历史,而是在一个数组中保留未结订单的票据。定期翻阅数组,检查这个订单是否被一个简单的条件所关闭。

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

如果订单已经关闭,可以通过票据选择并检查它是否以盈利方式关闭。你也可以检查从开仓到止损的距离,并在你母亲允许的范围内增加这一距离。

在所有这些操作之后,我们应该将数组大小 重置为0,并在循环中的当前时刻用开仓的订单的点数重新填充它,增加数组大小。

 
Vladislav Andruschenko:

你必须为这种场合保存档案。为了以后在万国邮联下上传。

如果我关掉VPN,把所有东西都放回去,再把VPN打开,把所有的图和EA都转给你呢?
不会有任何关于你的旧数据,对吗?
 

你好

帮助我理解代码

附上一段有类的代码,一切工作正常,但

我想把类中的一些函数连接到我自己的一个单独的函数中,并写入错误

例子

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

它的工作原理是这样的

而这并不奏效

void OpenHandPosition(int tp)
   {

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

   }

这个功能是有效的

void StrategyTrader::DoEntryTrade(TradeDirection tradeDir)

而这个人却没有

OpenHandPosition(int tp)

帮助

附加的文件:
test.mq5  21 kb
 
SGarnov:

我得出的结论是,这很难实现,你的代码更简单,更清晰,更有逻辑性,但.....,不知为何也没有加起来。最主要的是不要放弃。

这似乎是可以的。试试吧,问问...

//+------------------------------------------------------------------+
//|                                                 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:

这似乎是可以的。试试吧,问问...

谢谢你的帮助,只有在下周我才能写出EA的正确性,今天是周五,我不再寻找市场进入 价格了。

 
natawik:
如果我关闭VPN,把所有东西都放回去,然后再打开VPN,把所有东西都转给你,图形和专家顾问怎么办?
不会有任何关于你的旧数据,对吗?
我经常遇到这样的问题,当我设置一台电脑,配置终端,然后迁移一切,继续工作,改变图形,等等,然后砰的一声,有些东西需要被改变....。我必须重新做一遍。
原因: