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

 
EgorKim:

J'ai le temps et le prix des points A et B

Comment puis-je connaître l'heure et le prix du point C ? Il se trouve au milieu entre A et B.

Je ne trouve aucun exemple nulle part


//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) 
  {
   return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
  }
//+------------------------------------------------------------------+
 
EgorKim:

J'ai le temps et le prix des points A et B

Comment puis-je connaître l'heure et le prix du point C ? Il se trouve au milieu entre A et B.

Je ne trouve aucun exemple nulle part.


Temps C = Temps B - ((Temps B - Temps A) / 2)

Prix au moment C

 
Сергей Таболин:

Temps C = Temps B - ((Temps B - Temps A) / 2)

Prix par heure C

J'ai vérifié, parfois j'ai un week-end).

Y a-t-il un moyen de trouver le centre dans la ligne elle-même ?

Voici ma ligne

void SetLow(double price_1,double price_2,datetime time_1,datetime time_2)
  {
   ObjectCreate(0,"Low",OBJ_TREND,0,time_2,price_2,time_1,price_1);
   ObjectSetInteger(0,"Low",OBJPROP_COLOR,clrAqua);
   ObjectSetInteger(0,"Low",OBJPROP_WIDTH,2);
   ObjectSetInteger(0,"Low",OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,"Low",OBJPROP_BACK,false);
   ObjectSetInteger(0,"Low",OBJPROP_RAY_RIGHT,true);
  }
 
Igor Makanu:

comment trouver le ticket de la dernière commande ouverte ? ça ne marche pas comme ça :

Que voulez-vous savoir exactement ? Nous devons faire une distinction claire entre les termes ORDRE, COMMANDE et POSITION.

Deuxièmement : Vous avez immédiatement créé une confusion en nommant les objets de la classe CTrade "ordre_1" " "ordre_2". Ils avaient l'habitude d'appeler les objets de la classe CTrade "m_trade_1" et "m_trade_2". Cela n'affecte pas la facilité d'utilisation, mais cela ajoute beaucoup de confusion.

Troisièmement : la méthodePositionClose ne fonctionnera pas seulement parce que vous lui passez un ticket de position égal à zéro (et vous les initialisez avec zéro dans OnInit()). - Ces conditions idéales, lorsque la première position a un ticket "0", ne peuvent être obtenues que dans le testeur.

Quatrièmement : la méthode d'achat

Note

L'exécution réussie de la méthode Buy(...) ne signifie pas toujours que la transaction est réussie. Il faut vérifier le résultat de l'exécution de la demande de transaction (code de retour du serveur de transaction) en appelant la méthodeResultRetcode() ainsi que lavaleur renvoyée par la méthodeResultDeal().


MéthodeResultDeal()

Obtient le ticket READ.

 
Vladimir Karputov:

Que voulez-vous savoir exactement ? Vous devez distinguer clairement les termes ORDRE, COMMANDE et POSITION.

Deuxièmement, vous avez immédiatement créé une confusion en nommant les objets de la classe CTrade avec les mots "order_1" et "order_2". Ils avaient l'habitude d'appeler les objets de la classe CTrade "m_trade_1" et "m_trade_2". Cela n'affecte pas la facilité d'utilisation, mais cela ajoute beaucoup de confusion.

Troisièmement : la méthodePositionClose ne fonctionnera pas seulement parce que vous lui passez un ticket de position égal à zéro (et vous les initialisez avec zéro dans OnInit()). - Ces conditions idéales, lorsque la première position a un ticket "0", ne peuvent être obtenues que dans le testeur.

Quatrièmement : la méthode d'achat

Note

L'exécution réussie de la méthode Buy(...) ne signifie pas toujours que la transaction est réussie. Il faut vérifier le résultat de l'exécution de la demande de transaction ( code de retour du serveur de transaction) en appelant la méthode ResultRetcode() ainsi que lavaleur renvoyée par la méthodeResultDeal().


MéthodeResultDeal()

Obtient le ticket RECEIVED.

Merci ! Je l'ai déjà compris

en général, le problème venait de l'abondance d'informations, de rumeurs et d'opportunités..... j'étais sûr de ne pas pouvoir attraper un ticket dans Result(), car l'événement OnTradeTransaction() est rappelé de temps en temps ... et c'est parti !

je travaille actuellement dessus avec MT5 tester, je cherche juste des exemples reproductibles, je ne parle pas du code fonctionnel - juste un testeur pour le moment

Merci encore pour votre aide !

ce code permet d'obtenir les tickets des dernières commandes dans le testeur :

//+------------------------------------------------------------------+
//|                                                   tst_CTrade.mq5 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"

input double Lot_1 = 0.10;
input double Lot_2 = 0.20;
input ulong  Magic1 = 12345;
input ulong  Magic2 = 67890;
#include<Trade\Trade.mqh>
 CTrade order_1,order_2;
ulong   ticket_1,ticket_2;
//_______________________________________________________________________ 
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };
//_______________________________________________________________________ 

CNewbar Bar_H1(PERIOD_H1);
CNewbar Bar_M30(PERIOD_M30);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   order_1.SetExpertMagicNumber(Magic1);
   order_2.SetExpertMagicNumber(Magic2);
   ticket_1 = 0;
   ticket_2 = 0;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Bar_H1.NewBar())
     {
      order_1.PositionClose(ticket_1);
      if(order_1.Buy(Lot_1))
        {
         ticket_1=order_1.ResultOrder();
         Print("NewBar H1, ticket_1 = ",ticket_1);
        }
     }

   if(Bar_M30.NewBar())
     {
      order_2.PositionClose(ticket_2);
      if(order_2.Sell(Lot_2))
        {
         ticket_2=order_2.ResultOrder();
         Print("NewBar M30, ticket_2 = ",ticket_2);
        }
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Merci ! Je l'ai déjà compris.

en général, le problème venait de l'abondance d'informations, de ragots et de possibilités..... j'étais sûr de ne pas pouvoir attraper le ticket dans Result(), car l'événement OnTradeTransaction() est rappelé de temps en temps ... et c'est parti !

je travaille actuellement dessus avec MT5 tester, je cherche juste des exemples reproductibles, je ne parle pas du code fonctionnel - juste un testeur pour le moment

Merci encore pour votre aide !

Un tel code peut obtenir les ticks des derniers ordres dans le testeur :

Oui, en utilisant ResultOrder, vous obtiendrez le ticket de commande.

 
Vladimir Karputov:

Oui, avec ResultOrder nous pouvons obtenir un ticket pour la commande.

Ok, maintenant je n'ai aucun problème avec ça, mais un autre problème est apparu en utilisant CTrade : j'ai un ticket d'ordre mémorisé et je peux le fermer en utilisant PositionClose(m_ticket)

En MQL4, c'était assez simple : je sélectionnais l'ordre via OrderSelect() et vérifiais if(OrderCloseTime()>0) - si l'heure de clôture n'est pas égale à 0, l'ordre est fermé.

Comment puis-je savoir si un ordre est fermé en utilisant SB CTrade ?

 
Igor Makanu:

OK, maintenant je n'ai aucun problème avec ça, mais un autre problème est apparu en utilisant CTrade : j'ai un ticket d'ordre mémorisé et je peux le fermer en utilisant PositionClose(m_ticket)

En MQL4, c'était assez simple : je sélectionnais l'ordre via OrderSelect() et vérifiais if(OrderCloseTime()>0) - si l'heure de clôture n'est pas égale à 0, l'ordre est fermé.

Comment puis-je savoir que l'ordre est clôturé en utilisant SB CTrade ?

Oubliez l'ordre ! Il y a un poste !

J'ai demandé spécifiquement ce que vous vouliez : un ORDRE, une PRISE OU une POSITION ? Ne pas confondre la terminologie. Après l'exécution de l'ordre de bourse, c'est la POSITION qui apparaît, pas l'ORDRE !


Par conséquent, décrivez d'abord avec des mots ce que vous faites et ce que vous voulez obtenir. Au lieu d'un ORDRE, utilisez "Ordre commercial d'achat" et "Ordre commercial de vente". Il en résulte une position "ACHAT" ou "VENTE".

 
Igor Makanu:

OK, maintenant je n'ai aucun problème avec ça, mais un autre problème est apparu en utilisant CTrade : j'ai un ticket d'ordre mémorisé et je peux le fermer en utilisant PositionClose(m_ticket)

Dans MQL4, il était très facile de savoir si l'ordre était fermé ou non. Je le sélectionnais à l'aide de OrderSelect() et vérifiais if(OrderCloseTime()>0) - si le temps de clôture est différent de 0, l'ordre est fermé.

Comment puis-je savoir si un ordre est fermé en utilisant SB CTrade ?

En laissant de côté le fait qu'un ticket de position correspond généralement à un ticket d'ordre, mais pas absolument toujours, il est possible d'utiliser la fonction PositionSelectByTicket sans SB.

Документация по MQL5: Торговые функции / PositionSelectByTicket
Документация по MQL5: Торговые функции / PositionSelectByTicket
  • www.mql5.com
Выбирает открытую позицию для дальнейшей работы с ней по указанному тикету. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Функция PositionSelectByTicket() копирует данные о позиции в программное окружение, и...
 
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[])
  {

Puis-je substituer ma propre formule de calcul dans le code de calcul de cet indicateur?

Par exemple, open/2