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

 
PokrovMT5:

Bonsoir à tous ! J'ai décidé de mettre une piste sur les transactions ouvertes dans le testeur, j'ai essayé de passer par OrderGet....() et je me suis rendu compte que la transaction est passée de la catégorie des ordres à une position ouverte, respectivement passé par PositionGet....(), mais encore une fois rien ne fonctionne,

La question est de savoir si je dois maintenant utiliser HistoryDealGet...() ? Ou je ne comprends pas quelque chose ? Comment modifier le SL dans une transaction ouverte dans le testeur ? Merci d'avance pour les commentaires.

PositionSelect(Symbol())
 

Veuillez me diriger vers ! !!! pour savoir comment implémenter dans MQL5 la vérification de la présence (ou de l'absence) d'un objet graphique, par exemple une ligne de tendance ou une ligne verticale ?

Idéalement, j'aimerais utiliser une logique similaire à "Si l'ordre n'existe pas" ou "Si l'ordre existe".

 
aleks557:

Veuillez me diriger vers ! !!! pour savoir comment implémenter dans MQL5 la vérification de la présence (ou de l'absence) d'un objet graphique, par exemple une ligne de tendance ou une ligne verticale ?

Idéalement, j'aimerais utiliser une logique similaire à "Si l'ordre n'existe pas" ou "Si l'ordre existe".

https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
pako:
Merci ! Tout fonctionne :)).
 

Pouvez-vous nous conseiller sur la manière d'implémenter correctement l'algorithme d'achat ?

Actuellement, le conseiller expert doit acheter plusieurs fois, jusqu'à ce qu'il reçoive l'information qu'il y a des positions ouvertes, et il prend du retard. Comment faire en sorte que le conseiller expert attende la réponse de la bourse après le premier achat (lorsque les conditions sont réunies).

Le problème maintenant est que la variable Bye_opened devrait devenir vraie et cela devrait empêcher l'EA de faire des transactions inutiles jusqu'à ce que les stops soient déclenchés. Mais modifier la variable Bye_opened prend beaucoup de temps et l'EA a le temps de faire plusieurs transactions.


Que manque-t-il dans mon code ? Veuillez signaler les lacunes.


 //--- Do we have positions opened already?
   bool Buy_opened=false;  // variable to hold the result of Buy opened position
   bool Sell_opened=false; // variables to hold the result of Sell opened position

   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //It is a Buy
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if(last_tick.last < BBLow[2] && Buy_opened == false)
        {
        int znak = last_tick.last - BBLow[2];

      //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={0};            // Инициализация структуры торгового запроса
         Trade_reqst.action=TRADE_ACTION_DEAL;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol=_Symbol;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TakeProfit*_Point; // Цена исполнения
         Trade_reqst.type=ORDER_TYPE_BUY;            // Тип ордера: на продажу
         Trade_reqst.type_filling=ORDER_FILLING_RETURN; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point;  // Stop Loss
         Trade_reqst.tp=SymbolInfoDouble(_Symbol,SYMBOL_ASK) + TakeProfit * _Point; // Take Profit
      // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
      //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={0};             // Инициализация структуры результата торгового запроса
         OrderSend(Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if(Trade_reslt.retcode==10016) Print("Ответ: ",Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);
 
mavar:

Le problème maintenant est que la variable Bye_opened devrait devenir vraie et cela devrait empêcher l'EA de faire des transactions inutiles jusqu'à ce que les stops soient déclenchés. Mais les changements de la variable Bye_opened prennent beaucoup de temps et l'EA a le temps de faire plusieurs trades.

Ce n'est pas parce qu'un changement de variable prend beaucoup de temps... comment l'avez-vous déterminé ? Ok, supposons que c'est le cas. Alors la réponse se trouve dans la question. Si vous avez besoin d'un retard dans l'ouverture d'une position, vous devez utiliser Sleep( N ) où N est calculé expérimentalement.

Variante 2. La réponse, encore une fois, est dans la question. Rendez Bye_opened global et changez-le immédiatement après que la position soit ouverte avec succès, directement dans ce module. Réinitialisez de la même manière, comme vous vérifiez l'existence de la position.

 
papaklass:
...

Si vous insérez une ligne

après la commande : OrderSend(), il n'y aura pas de réouverture des positions.

Il est peut-être préférable de vérifier d'abord si la position est ouverte, puis ...

? ??

 
papaklass:

Apparemment, il a un robot qui fonctionne à chaque tic. Entre l'envoi de l'ordre au serveur et la réception de la réponse du serveur, plusieurs ticks supplémentaires vont arriver et une position supplémentaire va s'ouvrir sur chaque tick. Ma proposition exclut la situation de répétition des ouvertures. Et il est nécessaire de vérifier si une position a été ouverte ou non.

C'est ce que je veux dire. Sinon, ils vont littéralement tout comprendre et manquer un contrôle important.
 
artmedia70:
C'est ce que je dis. Sinon, il comprendrait littéralement tout et manquerait un contrôle important.

C'est donc bien comme ça qu'il faut vérifier correctement ? Désolé, je n'arrive pas à le faire correctement.

Voici le code (tout est situé dans le bloc OnTick) :


void OnTick()
  {

      MqlTick last_tick;
     
      if(SymbolInfoTick(Symbol(),last_tick))
        {
        // Print(last_tick.time,": Bid = ",last_tick.bid,
        //       " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume, "  LastPrice = ",last_tick.last );
        }
      else Print("SymbolInfoTick() failed, error = ",GetLastError());
      //---
      
        //---Читаем свечку
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(Symbol(),0,0,1,rates);
   if(copied>0)
     {
      //Print("Скопировано баров: "+copied);
      string format="open = %G, high = %G, low = %G, close = %G, volume = %d";
      string out;
      int size=fmin(copied,10);
      for(int i=0;i<size;i++)
        {
         //out=i+":"+TimeToString(rates[i].time);
         out=out+" "+StringFormat(format,
                                  rates[i].open,
                                  rates[i].high,
                                  rates[i].low,
                                  rates[i].close,
                                  rates[i].tick_volume);
        // Print(out);
       
         //Print(rates[i].open - rates[i].close );

        }
     }
   else Print("Не удалось получить исторические данные по символу ",Symbol());

//---=======-----\_____BOLLINGER____/--------========--//
//--- получить хэндл индикатора Bollinger Bands и DEMA
      BolBandsHandle=iBands(NULL,my_timeframe,bands_period,bands_shift,deviation,PRICE_LOW);
      ChartIndicatorAdd(0,0,BolBandsHandle);
   
//--- копируем новые значения индикаторов используя хэндлы
   if(CopyBuffer(BolBandsHandle,0,0,3,BBMidle)<0 || CopyBuffer(BolBandsHandle,1,0,3,BBUp)<0
      || CopyBuffer(BolBandsHandle,2,0,3,BBLow)<0)
     {
      Alert("Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:",GetLastError(),"!!");
      return;
     }
//********** это цикл надо добавить в код советника, выводит значения при наступлении нового бара
   //for(int nbar=0; nbar < 3; nbar++)
    // Print("nbar=", nbar, "  BBLow[nbar]=", DoubleToString(BBLow[nbar], _Digits), "  BBMidle[nbar]", DoubleToString(BBMidle[nbar], _Digits),
   //                 "  BBUp[nbar]=", DoubleToString(BBUp[nbar], _Digits));
      
      
  //--- Define some MQL5 Structures we will use for our trade
   MqlTick latest_price;      // To be used for getting recent/latest price quotes
   
       
   //--- Do we have positions opened already?
   bool Buy_opened=false;  // variable to hold the result of Buy opened position
   bool Sell_opened=false; // variables to hold the result of Sell opened position

   if(PositionSelect(_Symbol)==true) // we have an opened position
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //It is a Buy
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if(last_tick.last < BBLow[2]-natyajka && Buy_opened == false)
        {
        int znak = last_tick.last - BBLow[2];

      //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={0};            // Инициализация структуры торгового запроса
         Trade_reqst.action=TRADE_ACTION_DEAL;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol=_Symbol;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK)-TakeProfit*_Point; // Цена исполнения
         Trade_reqst.type=ORDER_TYPE_BUY;            // Тип ордера: на продажу
         Trade_reqst.type_filling=ORDER_FILLING_RETURN; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point;  // Stop Loss
         Trade_reqst.tp=SymbolInfoDouble(_Symbol,SYMBOL_ASK) + TakeProfit * _Point; // Take Profit
      // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
      //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={0};             // Инициализация структуры результата торгового запроса
         OrderSend(Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if(Trade_reslt.retcode==10016) Print("Ответ: ",Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);

//--- вернем код ответа торгового сервера
        Print("Покупаю. Buy_opened = ", Buy_opened);
        Print( "last_tick.last= ", last_tick.last, 
               " last_tick.ask= ", last_tick.ask, " - ",    
               " BBLow= ",DoubleToString(BBLow[2], _Digits) , 
               " SYMBOL_BID=", SymbolInfoDouble(_Symbol,SYMBOL_BID),
               " SYMBOL_ASK=", SymbolInfoDouble(_Symbol,SYMBOL_ASK), 
               " StopLoss=", StopLoss,
               " TakeProfit=", TakeProfit,
               " Trade_reslt.bid=", Trade_reslt.bid,
               " Trade_reslt.bid=", Trade_reslt.bid,
               " Trade_reslt.ask=", Trade_reslt.ask
            ); 

      
   //return Trade_reslt.retcode;

         
        }

  } 
 
papaklass:

Afin d'éviter d'ouvrir des volumes inutiles :

Malheureusement, cette condition ne fonctionne pas lors de l'ouverture d'une transaction.

      //проверка выполнения торгового приказа
      if(Trade_reslt.retcode==10009)   //заявка выполнена
      {
         Bye_opened = true;
      }