Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1551

 
natawik:

Bonjour à tous, aidez-nous !

J'ai un problème de ce genre. J'ai acheté un vpc chez mql5 tout fonctionne bien, je me suis installé un expert, j'ai configuré 8 graphiques et j'ai installé un expert. Et j'ai transféré le tout au vpc.

J'ai dû désinstaller metatrade de mon ordinateur car il ne m'appartenait pas.

Et maintenant, quand j'y vais depuis mon ordinateur.

Tout fonctionne, l'expert. Il fonctionne, mais je ne peux pas le voir pour effectuer des changements dans les paramètres. Comment puis-je renvoyer l'EE et les horaires afin de pouvoir les gérer depuis mon ordinateur ?

Merci !

Vous devez enregistrer des profils pour ce cas. Pour le télécharger plus tard sous l'UPU.

 

Qui sait comment exporter toutes les données du rapport vers exel sans distorsion ?

si je copie simplement certaines des données de la colonne "profit", elles sont exportées sous forme de date, par exemple janvier 94 au lieu de 1.94.

J'ai beau essayer de sauvegarder, je ne peux pas me débarrasser de ce problème.

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

Qui sait comment exporter toutes les données du rapport vers exel sans distorsion ?

si je copie simplement certaines des données de la colonne "profit", elles sont exportées sous forme de date, par exemple janvier 94 au lieu de 1.94.

J'ai beau essayer de sauvegarder, je ne peux pas me débarrasser de ce problème.

Avant de télécharger ou d'ouvrir le fichier exporté, remplacez le séparateur entre la partie entière et la partie fractionnaire dans Excell par un point.

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

Qui sait comment exporter toutes les données du rapport vers exel sans distorsion ?

si je copie simplement certaines des données de la colonne "profit", elles sont exportées sous forme de date, par exemple janvier 94 au lieu de 1.94.

J'ai beau essayer de le sauvegarder, je ne peux pas me débarrasser du problème.

Alors

 
SGarnov:

Vous devriez peut-être aussi tenir compte du nombre d'arrêts déclenchés. Par exemple, l'EA trouvera un stop dans l'historique, et s'il y en a deux, il devra les ajouter tous les deux à trois ou quatre, tout dépend du paramètre externe "nombre de stop loss".

La meilleure chose à faire dans votre cas, et pas seulement dans votre cas, mais dans la plupart des cas, au lieu de vous tourner vers l'historique des transactions avec une recherche des ordres fermés, gardez les tickets des ordres ouverts dans un tableau. Périodiquement, parcourez le tableau pour vérifier si cet ordre a été fermé par une simple condition.

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

Si l'ordre a été clôturé, il peut être sélectionné par le ticket et vérifié s'il a été clôturé avec un bénéfice ou non. Vous pouvez également vérifier la distance entre la position ouverte et le stop et ajouter à cette distance autant que votre mère le permet.

Après toutes ces manipulations, nous devrions remettre la taille du tableau à 0 et le remplir à nouveau avec les ticks des ordres ouverts au moment actuel de la boucle, augmentant ainsi la taille du tableau.

 
Vladislav Andruschenko:

vous devez garder des profils pour cette occasion. Pour le télécharger plus tard sous l'UPU.

Et si je désactivais le VPN, que je remettais tout en place, que je réactivais le VPN et que je vous transférais tous les graphiques et les EA ?
Il n'y aura pas d'anciennes données sur vous, n'est-ce pas ?
 

Bonjour

Aidez-moi à comprendre le code

J'ai joint un morceau de code qui a des classes et tout fonctionne bien mais...

Je veux connecter certaines fonctions des classes dans une fonction séparée de la mienne et écrire des erreurs.

exemple

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

cela fonctionne comme suit

et cela ne fonctionne pas

void OpenHandPosition(int tp)
   {

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

   }

cette fonction fonctionne

void StrategyTrader::DoEntryTrade(TradeDirection tradeDir)

et celui-ci ne le fait pas

OpenHandPosition(int tp)

aide

Dossiers :
test.mq5  21 kb
 
SGarnov:

J'en suis arrivé à la conclusion que c'est difficile à mettre en œuvre, votre code est beaucoup plus simple, plus clair et plus logique, mais ..... ne correspond pas non plus. L'essentiel est de ne pas abandonner.

Il semble que ce soit bon. Essayez-le, demandez...

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

Il semble que ce soit bon. Essayez-le, demandez...

Merci pour votre aide, ce n'est que la semaine prochaine que je serai en mesure d'écrire la justesse de l'EA, aujourd'hui nous sommes vendredi et je ne cherche plus les prix d'entrée sur le marché.

 
natawik:
Et si je désactive le VPN et que je remets tout en place, puis que je réactive le VPN et que je vous transfère tout, les graphiques et le conseiller expert ?
Il n'y aura pas d'anciennes données sur vous, n'est-ce pas ?
Je rencontre souvent ce genre de problèmes lorsque j'installe un PC, que je configure le terminal, puis que je migre tout, que je continue à travailler, que je change les graphismes, etc., et puis bam, il faut changer quelque chose..... Je dois tout recommencer.
Raison: