Questions des débutants MQL5 MT5 MetaTrader 5 - page 223

 
Après-midi. Veuillez aider un trader débutant à trouver un conseiller approprié pour le trading automatisé, qui soit capable d'ouvrir des ordres verrouillés dans des paires de devises avec la possibilité d'un réglage arbitraire du take profit. Merci.
 
abcxyzabcxyz:
Après-midi. Veuillez aider un trader débutant à trouver un conseiller approprié pour le trading automatisé, qui soit capable d'ouvrir des ordres verrouillés dans des paires de devises avec la possibilité d'un réglage arbitraire du take profit. Merci.
Si vous avez vraiment besoin de verrouillage, vous êtes au bon endroit. Il n'y a pas de verrouillage sur MetaTrader 5 car MetaTrader 5 est une plateforme de compensation.
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle:
Autre possibilité : déclarer dans chacun d'eux une méthode de type, dans laquelle l'identifiant du type de retour.

Heh, si tu pouvais éditer le code source... Vous n'avez pas besoin de simplifier autant les choses. Et encore - y a-t-il un nom de classe dans mql5 ?

 
YAndrey:

Heh, si tu pouvais éditer le code source... Vous n'avez pas besoin de simplifier autant les choses. Cependant, existe-t-il un moyen pour mql5 de connaître le nom d'une classe ?

Regardez dans la direction des modèles. Ce code retournera le nom de la classe ou un type primitif.

#include<Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
Commerce CTrade ;
double d_value=M_PI ;
int i_value=INT_MAX ;
Print("d_value : type=",GetTypeName(d_value),", value=", d_value) ;
Print("i_value : type=",GetTypeName(i_value),", value=", i_value) ;
Print("transaction : type=",GetTypeName(trade);
//---
}
//+------------------------------------------------------------------+
//| Retourne le type sous forme de chaîne de caractères|
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T&t)
{
//---renvoie le type sous forme de chaîne de caractères
return(typename(T))
//---
}

 
C-4:

Cherchez des modèles. Ce code renvoie le nom d'une classe ou d'un type primitif.

#include<Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
Commerce CTrade ;
double d_value=M_PI ;
int i_value=INT_MAX ;
Print("d_value : type=",GetTypeName(d_value),", value=", d_value) ;
Print("i_value : type=",GetTypeName(i_value),", value=", i_value) ;
Print("transaction : type=",GetTypeName(trade);
//---
}
//+------------------------------------------------------------------+
//| Retourne le type sous forme de chaîne de caractères|
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T&t)
{
//---renvoie le type sous forme de chaîne de caractères
return(typename(T))
//---
}

J'ai quelque chose ! Mais cela ne fonctionne pas avec new - dans le code il y a un exemple de ce dont j'ai besoin - peut-être que quelqu'un peut suggérer comment ?

class a{
public:
virtual void Print(){Print("Print class a");}
};

class b:public a{
public:
virtual void Print(){Print("Print class b");}
};

class c:public a{
public:
virtual void Print(){Print("Print class c");}
void Print2(){Print("!Print2! class c");}
};


void add(a *&arr[], bool var)
{
   ArrayResize(arr, ArraySize(arr)+1);
   if (var)
      arr[ArraySize(arr)-1] = new b;
   else
      arr[ArraySize(arr)-1] = new c;
   
}

void OnStart()
  {
//--- 
   
   
   a *arr[];

   add(arr, true); // На самом деле здесь я НЕ знаю, какой класс добавит функция add
   add(arr, false); // Это потомок класса а или сам класс а, исходный код которого я править не могу.
   for (int i = 0; i < ArraySize(arr); i++)
   {
      // Вот тут то мне и надо узнать, что за класс там
      // шаблон вернет *а, как и объявлено. Но мне надо проверить - можно ли вызвать функцию, которая есть только в с
      if (i == 1) // Вот тут должна быть проверка на имя класса
      {
         c *tmp = arr[i];
         tmp.Print2();
      }
    }  
   
   
   
   
   
//--- 
  }
 
YAndrey:

J'ai quelque chose ! Mais cela ne fonctionne pas avec new - il y a un exemple dans le code de ce dont j'ai besoin - quelqu'un peut-il suggérer un moyen ?

Il s'agit d'un problème de méthode de modèle. Malheureusement, la méthode template renvoie le nom de la classe référençant l'instance. Le type de l'instance elle-même est encore inconnu.
 

Quelqu'un peut-il m'expliquer pourquoi ce code ne fonctionne pas dans le testeur, alors qu'en temps réel il fonctionne ! !!? Je suis particulièrement intéressé par la raison pour laquelle, dans le testeur, après HistorySelect(0, TimeCurrent()), le HistoryOrderGetInteger...

#include <Trade\Trade.mqh>

CTrade trade;

int OnInit()
{
   trade.LogLevel(LOG_LEVEL_NO);
   return INIT_SUCCEEDED;
}
void OnTick()
{
   if(!DetectNewBar())return;
   trade.Sell(0.1);
   HistorySelect(0, TimeCurrent());
   for(; dealsCount < HistoryDealsTotal(); dealsCount++)
   {
      ulong ticket = HistoryDealGetTicket(dealsCount);
      RecalcDeal(ticket);
   }
}

bool DetectNewBar(void)
{
   MqlRates bars[1];
   CopyRates(Symbol(), PERIOD_M1, 0, 1, bars);
   if(bars[0].time != timeLastBar)
   {
      timeLastBar = bars[0].time;
      //printf(expertName + " new bar detected: " + TimeToString(bars[0].time));
      return true;
   }
   return false;
}

void RecalcDeal(ulong ticketDeal)
{
   //History is selected in OnTick()!
   ulong ticketOrder = HistoryDealGetInteger(ticketDeal, DEAL_ORDER);
   //if(!HistoryOrderSelect(ticketOrder))
   //   printf("order not select.");
   ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticketOrder, ORDER_TYPE);
   datetime time = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP); 
   ulong time_msc = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP_MSC); 
   printf("Order: " + (string)ticketOrder + " Type: " + EnumToString(type) + " Time: " + (string)time +
          " Time msc: " + (string)time_msc + " Total Orders: " + HistoryOrdersTotal());
}

int dealsCount;

datetime timeLastBar;

Capture d'écran dans le testeur de stratégie :

Capture d'écran en temps réel dans la démo :

p.s. Ce qui est intéressant, c'est que la première commande dans le testeur est traitée correctement mais les autres ne le sont pas. De même, si nous commentons HistroryOrderSelect(ticketOrder), nous obtenons un message dans le testeur de stratégie indiquant que l'ordre n'a pas été sélectionné et dans le testeur de stratégie, tout commence à fonctionner, sauf le premier ordre.

 

Et j'ai un problème avec HistorySelect(). J'ouvre une position avec le script en envoyant un ordre au marché, et si une transaction s'ouvre, je vérifie immédiatement le nombre de transactions dans l'historique depuis le lancement du script, et je le vérifie 10 fois à une seconde d'intervalle. Évidemment, il ne devrait y avoir qu'un seul échange. Voici le script :

void OnStart()
{
        // время запуска скрипта
        datetime dtStartTime = TimeCurrent();
        
        // структуры запроса
        MqlTradeRequest oRequest = {0};
        MqlTradeResult oResult = {0};
        
        // формируем запрос
        oRequest.action = TRADE_ACTION_DEAL;
        oRequest.magic  = 15;
        oRequest.symbol = _Symbol;
        oRequest.volume = 0.1;
        oRequest.type   = ORDER_TYPE_BUY;
        oRequest.type_filling = ORDER_FILLING_FOK;
        oRequest.price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
        oRequest.deviation = 1000;
        
        // шлём ордер
        bool bResult = OrderSend(oRequest, oResult);
        
        // если позиция успешно открыта
        if(bResult == true && oResult.retcode == 10009) // если позиция открыта
        {
                for(int i = 0; i < 10; i++)
                {
                        // запрашиваем историю за время работы скрипта
                        HistorySelect(dtStartTime, TimeCurrent());
                
                        // количество сделок за время работы скрипта (должна быть одна)
                        Print("Шаг: ", i, " Совершено сделок: ", HistoryDealsTotal());
                        
                        Sleep(1000);
                }
        }
}

Et voici le résultat dans Alfa-Forex :

Une transaction est effectivement effectuée, mais elle n'apparaît pas dans l'historique, même après 10 secondes. Qu'est-ce que c'est ? Un bug de MT ? Un problème d'alpha ? Une sorte de puce que je ne connais pas ? Alpari a le même script qui fonctionne normalement, seulement occasionnellement un zéro est détecté à la première étape (zéro) (bien, c'est compréhensible - l'historique n'a pas encore eu le temps de se mettre à jour), toutes les autres étapes sont un. Mais après dix secondes, pourquoi n'y a-t-il pas d'accord dans l'histoire ?

 
Algo:

Et j'ai un problème avec HistorySelect(). J'ouvre une position avec le script en envoyant un ordre au marché, et si une transaction s'ouvre, je vérifie immédiatement le nombre de transactions dans l'historique depuis le lancement du script, et je le vérifie 10 fois à une seconde d'intervalle. Évidemment, il ne devrait y avoir qu'un seul échange. Voici le script :

Et voici le résultat du courtier Alpha :

Une transaction est effectivement effectuée, mais elle n'apparaît pas dans l'historique, même après 10 secondes. Qu'est-ce que c'est ? Un bug de MT ? Un problème d'alpha ? Une sorte de puce que je ne connais pas ? Alpari a le même script qui fonctionne normalement, seulement occasionnellement un zéro est détecté à la première étape (zéro) (bien, c'est compréhensible - l'historique n'a pas encore eu le temps de se mettre à jour), toutes les autres étapes sont un. Mais pourquoi n'y a-t-il pas d'accord dans l'histoire en dix secondes ?

Ce qui me dérange, c'est la ligne suivante

datetime dtStartTime = TimeCurrent() ;

Êtes-vous sûr que dtStartTime et TimeCurrent() ne sont pas le même nombre par le moment pour ? Peut-être que l'arrondi à une seconde place la transaction terminée en dehors de dtStartTime.

 
C-4:

La ligne

datetime dtStartTime = TimeCurrent() ;

Etes-vous sûr que dtStartTime et TimeCurrent() ne sont pas le même nombre par le temps pour ? Peut-être que l'arrondi à une seconde place la transaction terminée en dehors de dtStartTime.

Et même si c'est un, MT ne devrait-il pas sortir l'historique de cette seconde ? En d'autres termes, ne produit-il pas l'historique dans les limites spécifiées, Y COMPRIS les limites elles-mêmes ?

Mais de toute façon, j'ai essayé d'écrire à la fois dtStartTime = TimeCurrent() - 1, et dtStartTime = TimeCurrent() - 10. Ça ne marche pas.