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

 
Alexey Belyakov:


Ça n'a pas marché non plus.

Ce qu'un hobgobelin aime des kilomètres de code...

Votre problème peut être résolu en SIX lignes de code, en tenant compte de la déclaration des variables.

/************************Expert tick function************************/
void OnTick()
 {
  bool signal = true;
  datetime timeBar = iTime(_Symbol, PERIOD_CURRENT, 0);// период можно поставить по своему усмотрению
  datetime static timeOpen = 0;
  if(timeBar > timeOpen)
   {
    if(signal)
     {
      // открыть позицию
      timeOpen = timeBar;
     }
   }
 }/******************************************************************/

J'espère que vous pourrez trouver la variable du signal.

 

О ! Ça marche ! Merci, camarades, pour les idées !

Mais j'ai dû le modifier un peu. C'est même devenu plus facile, sans (vrai). Bien que je ne puisse pas expliquer cette logique MQL compliquée).

C'est ainsi que je l'ai mis en œuvre :

datetime timeBar = iTime(_Symbol,PERIOD_CURRENT, 0);// период можно поставить по своему усмотрению
datetime static timeOpen = 0;

if((PositionsTotal()==0)&&(c0>h1)&&(rGENUP>0.30)&&(timeBar > timeOpen))    // Условие для открытия позиции.
     {
      MqlTradeRequest request;
      MqlTradeResult  result;
      request.action   =TRADE_ACTION_DEAL;                         // тип торговой операции
      request.symbol   =Symbol();                                 // символ
      request.volume   =1;                                       // объем в 1 лот
      request.type     =ORDER_TYPE_BUY;                         // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=3;
      request.sl    = NormalizeDouble(Ask-50*_Point,_Digits);
      request.tp    = NormalizeDouble(Ask+50*_Point,_Digits);    

      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки
      //--- информация об операции
      PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
      // допустимое отклонение от цены
timeOpen = timeBar;
}
Je me demande pourquoi il y a un si gros code dans MQL5 pour l'ouverture des positions. Contrairement à MQL4. Dans le 4, il n'y a qu'une ligne. Peut-on le réduire ? Par exemple, peut-on supprimer le gestionnaire d'erreurs ?


Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Alexey Belyakov:

О ! Ça marche ! Merci, camarades, pour les idées !

Mais j'ai dû le modifier un peu. C'est même devenu plus facile, sans (vrai). Bien que je ne puisse pas expliquer cette logique MQL compliquée).

C'est ainsi que je l'ai mis en œuvre :

Je me demande pourquoi il y a autant de code dans MQL5 pour ouvrir une position. Contrairement à MQL4. En 4, c'est juste une ligne. Mais ici... Peut-on le raccourcir ? Par exemple, peut-on supprimer le gestionnaire d'erreurs ?


Utilisez les classes commerciales. Et le code sera très court.

Exemple :

//+------------------------------------------------------------------+
//|                                            Only_one_purchase.mq5 |
//+------------------------------------------------------------------+
#property version   "1.003"
#property script_show_inputs
#include <Trade\Trade.mqh>
CTrade         m_trade;          // trading object
//--- input parameters
input ENUM_POSITION_TYPE   InpPositionType   = POSITION_TYPE_BUY; // Position Type
input double               InpVolume         = 0.0;               // Volume
input ulong                m_magic           = 15489;             // magic number
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   m_trade.SetExpertMagicNumber(m_magic);
//--- open a position
   if(InpPositionType==POSITION_TYPE_BUY)
      m_trade.Buy(InpVolume);
   else
      m_trade.Sell(InpVolume);
  }
//+------------------------------------------------------------------+
 
Alexey Belyakov:

О ! Ça marche ! Merci, camarades, pour les idées !

Mais j'ai dû le modifier un peu. C'est même devenu plus facile, sans (vrai). Bien que je ne puisse pas expliquer cette logique MQL compliquée).

C'est ainsi que je l'ai mis en œuvre :

Je me demande pourquoi il y a un si gros code dans MQL5 pour l'ouverture des positions. Contrairement à MQL4. En 4, c'est juste une ligne. Mais ici... Pouvez-vous le faire plus court ? Par exemple, pouvons-nous supprimer le gestionnaire d'erreurs ?


Donc, si vous avez dans l'état

if((PositionsTotal()==0)&&

pourquoi faut-il plus de contrôles pour un nouveau bar ? Ou existe-t-il une option selon laquelle la position sera fermée à la même barre et la deuxième ouverture sera interdite ?

 
Alexey Belyakov:

О ! Ça marche ! Merci, camarades, pour les idées !

Mais j'ai dû le modifier un peu. C'est même devenu plus facile, sans (vrai). Bien que je ne puisse pas expliquer cette logique MQL compliquée).

C'est ainsi que je l'ai mis en œuvre :

Je me demande pourquoi il y a un si gros code dans MQL5 pour ouvrir une position. Contrairement à MQL4. En 4, c'est juste une ligne. Mais ici... Peut-on le raccourcir ? Par exemple, pouvons-nous supprimer le gestionnaire d'erreurs ?


Vous savez, il y a longtemps, lorsqu'il y avait le MQL4, les gens s'indignaient qu'on ne leur ait pas donné un accès de niveau inférieur - pour qu'ils puissent faire quelque chose à leur manière.

Eh bien, ils l'ont fait - maintenant ils ont donné accès à OrderSend() dans MQL4 - pour ainsi dire, ils ont déployé sa logique dans MQL - alors faites ce que vous voulez. Mais non, maintenant j'ai des plaintes qui disent que c'est trop compliqué.

Compliqué ? Pas de problème - donnez-moi des classes de commerce dans SB - elles sont presque les mêmes que dans les fonctions de commerce standard de MQL4.
Dans MQL4, ces classes sont les fonctions commerciales. Et dans MQL5 - le tout en accès libre.

Profitez-en.

 
Artyom Trishkin:

Vous savez, il y a longtemps, lorsqu'il y avait le MQL4, les gens s'indignaient qu'on ne leur donne pas un accès de niveau inférieur - pour qu'ils puissent faire quelque chose à leur manière.

Eh bien, ils l'ont fait - maintenant ils ont donné accès à OrderSend() dans MQL4 - pour ainsi dire, ils ont déployé sa logique dans MQL - alors faites ce que vous voulez. Mais non, maintenant j'ai des plaintes qui disent que c'est trop compliqué.

Compliqué ? Pas de problème - donnez-moi des classes de commerce dans SB - elles sont presque les mêmes que dans les fonctions de commerce standard de MQL4.
Dans MQL4, ces classes sont les fonctions commerciales. Et dans MQL5 - le tout en accès libre.

Profitez-en.

Docent, et Docent. Pourquoi es-tu si en colère (aujourd'hui) ?

 
Alexey Viktorov:

Docent, ah Docent. Pourquoi es-tu si en colère (aujourd'hui) ?

Entrez dans le trou de glace...

 
Alexey Viktorov:

Donc si vous avez une condition

Pourquoi avez-vous besoin de vérifier un nouveau bar ? Ou bien existe-t-il une option selon laquelle la position sera fermée sur la même barre et nous devrions désactiver une seconde ouverture ?

Tout à fait exact - il y a une option pour fermer la position sur la même barre.

 

(Coupez dans le nouveau mur. ) Le "mur" est appelé seuil de rentabilité.

C'est ainsi qu'il a été implémenté dans MQL4 :

(Je l'ai copié quelque part, je ne me souviens pas).

int BULevel=30;

   for(int i=0; i<OrdersTotal(); i++) 
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY) 
          {
           if(OrderOpenPrice()<=(Bid-BULevel*Point)&&OrderOpenPrice()>OrderStopLoss())
            {      
             int p=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-50*Point,OrderTakeProfit(),0,Green);
            }
           }       
 
         if(OrderType() == OP_SELL) 
           {
            if(OrderOpenPrice()>=(Ask+BULevel*Point)&&OrderOpenPrice()<OrderStopLoss()) 
             {
              p=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+50*Point,OrderTakeProfit(),0,Red);
             }
           } 
         }
       }

//------------------------------------------------------------------+

Mais voici comment elle est mise en œuvre dans 5-PC. Comment dois-je m'y prendre ?

J'ai regardé dans les classes de négociation, je ne le vois pas. Mais la chose est nécessaire. Que disent les professionnels ?

 

Comment empêcher les transactions provenant d'autres graphiques d'apparaître sur le graphique ?

Seulement les transactions du robot qui se trouvent sur le graphique donné.