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

 
Vitaly Muzichenko:

Pour tous. Plus précisément, il affiche dans la fenêtre du graphique le nombre de barres spécifié dans le paramètre, et ne dépend pas de l'horizon temporel.

P.S. Je n'ai jamais modifié cette valeur, mais je viens de la vérifier et j'ai vu qu'elle ne peut pas être inférieure à 1000.

Vous devez donc vérifier aveciBars()?

 

Bon après-midi. Le script ne fonctionne pas pour une raison quelconque.

Quel est le problème ?


//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   
   if(!ChartSetInteger(0,CHART_IS_MAXIMIZED,true))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      //return(false);
     };


  }
//+------------------------------------------------------------------+
 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL4 MT4 MetaTrader 4".
 

Bonjour les amis !

Questions :

1. Les ordres de vente stop limite sont-ils placés du côté du courtier ou du côté du terminal ?

2. Lorsque je fermerai le programme, cet ordre sera-t-il déclenché lorsque les conditions seront remplies ?

Négociation sur le marché des actions MICEX. Merci d'avance !

Акции: новости и аналитика фондовых рынков - Блоги трейдеров и аналитика финансовых рынков
Акции: новости и аналитика фондовых рынков - Блоги трейдеров и аналитика финансовых рынков
  • www.mql5.com
Акция — это ценная бумага, которая выпускается каким-либо предприятием (акционерным обществом) и дает ее владельцу права на получение части прибыли от этого предприятия в виде дивидендов. Также
 

Bonjour, chers programmateurs. Question sur MQL5

Comment implémenter le contrôle de position dans MetaTrader 5 ? Je veux avoir une seule position ouverte sur une barre, c'est-à-dire que la position doit être fermée peu importe où - sur quelle barre, mais l'ouverture doit être sur une seule barre.

Ce code est complètement ignoré. Quelle est l'erreur ?

if (OrderSelect(HistoryDealsTotal()-1))

{
datetime Cu=PositionsTotal();
int hd=iBarShift(Symbol(),_Period,Cu);
if (hd<=1)
{
return;
}
}



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

Bonjour, chers programmateurs. Question sur MQL5

Comment implémenter le contrôle de position dans MetaTrader 5 ? Ainsi, sur une barre, il n'y a qu'une seule position ouverte. Cela signifie que la position est fermée peu importe où - sur quelle barre, mais l'ouverture doit se faire sur une seule barre.

Le moyen le plus simple est de sauvegarder l'heure d'ouverture de la barre, à laquelle la position est ouverte dans la variable globale, puis, lors de l'ouverture d'une nouvelle position, de vérifier l'heure d'ouverture de la barre si la valeur est supérieure à la valeur sauvegardée, puis d'ouvrir une position.

 
Alexey Belyakov:

Bonjour, chers programmateurs. Question sur MQL5

Comment implémenter le contrôle de position dans MetaTrader 5 ? Je veux avoir une seule position ouverte sur une barre, c'est-à-dire que la position doit être fermée peu importe où - sur quelle barre, mais l'ouverture doit être sur une seule barre.

Ce code est complètement ignoré. Quelle est l'erreur ?



Erreur : Vous avez confondu les mouches et les côtelettes - vous avez confondu les ORDRES à DISTANCE et les POSITIONS.

Pour éviter toute confusion, veuillez lire la référence :Principes généraux


La méthode simple ci-dessus consiste à se souvenir de l'heure d'ouverture de la barre actuelle lorsque vous ouvrez une position. Ensuite, si vous voulez ouvrir une nouvelle position, vous vérifiez l'heure enregistrée et l'heure d'ouverture de la barre actuelle.

Le stockage de l'heure d'ouverture d'une position est pratique dansOnTradeTransaction:

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal))
         m_deal.Ticket(trans.deal);
      else
         return;
      if(m_deal.Symbol()==m_symbol.Name() && m_deal.Magic()==InpMagic)
        {
         if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
           {
            if(m_deal.Entry()==DEAL_ENTRY_IN || m_deal.Entry()==DEAL_ENTRY_INOUT)
               m_last_deal_in=iTime(m_symbol.Name(),InpTimeFrame,0);
            int size_need_position=ArraySize(SPosition);
            if(size_need_position>0)
              {
               for(int i=0; i<size_need_position; i++)
                 {
                  if(SPosition[i].waiting_transaction)
                     if(SPosition[i].waiting_order_ticket==m_deal.Order())
                       {
                        Print(__FUNCTION__," Transaction confirmed");
                        SPosition[i].transaction_confirmed=true;
                        break;
                       }
                 }
              }
           }
        }
     }
  }

et vérifier l'heure à laquelle le signal est reçu :

//+------------------------------------------------------------------+
//| Search trading signals                                           |
//+------------------------------------------------------------------+
bool SearchTradingSignals(void)
  {
   if(m_prev_bars==m_last_deal_in) // on one bar - only one deal
      return(true);


Exemple tiré du codeOHLC Check 2

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

C'est un peu délicat.... en quelque sorte. Pas de problème à la première étape "se souvenir de l'heure d'ouverture du bar actuel".

Et voilà :

if (PositionsTotal()==1)  // Здесь проверяю, что открыта одна позиция
{
datetime Cu=iTime(NULL,_Period,0);        // Здесь в переменную - время открытия бара при открытой позиции

Mais ici " vous conciliez le temps enregistré et le temps d'ouverture de la barre actuelle " problème.

J'ai fait à peu près la même chose. Regarde ça :

if (PositionsTotal()==1)  // Здесь проверяю, что открыта одна позиция (или была открыта, неважно, любое торговое действие)
{
datetime Cu=iTime(NULL,_Period,0);        // Здесь в переменную - время открытия бара при открытой позиции
int hd=+iBarShift(Symbol(),_Period,Cu)+1;    // Здесь в переменную - бар на котором произошло открытие позиции 
if (hd>=1)                                //Здесь проверяем - если этих баров, больше чем один, то.......   
{
return; //....то зацикливанием программу, НО проблема только в return
}
}

Tout ce que j'ai besoin de faire ici est de boucler une marche comme "return(-1)" Mais je ne peux pas assigner une expression au return à cause du void. Comment puis-je contourner cela ? Comment boucler mais ne pas retourner ?

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
datetime PR=iTime(NULL,_Period,0);  // проверяю время открытие бара
if (PositionsTotal()==1)  
{
datetime TK=iTime(NULL,_Period,0);  // время открытия бара при открытой позиции                        
if (PR==TK)                         // сравниваю
{
return(true);  // НЕ катит true - ошибка 
}
}


Ça n'a pas marché non plus.

 
Alexey Belyakov:

C'est un peu délicat.... en quelque sorte. Pas de problème à la première étape "se souvenir de l'heure d'ouverture du bar actuel".

Et voilà :

Mais ici " vous vérifiez l'heure enregistrée et l'heure d'ouverture de la barre actuelle " problème.

J'ai fait à peu près la même chose. Regarde ça :

Tout ce que j'ai besoin de faire ici est de boucler une marche comme "return(-1)" Mais je ne peux pas assigner une expression au return à cause du void. Comment puis-je contourner cela ? Comment boucler mais ne pas retourner ?

Le traitement des programmes en boucle consiste à leur couper les bras autour du cou. Pour que vous n'ayez pas à le refaire à l'avenir.


Voici ce dont vous avez besoin - tout le corps du programme, vous avez juste besoin de formaliser la réception du signal :

//+------------------------------------------------------------------+
//|                              Example One position on one bar.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\DealInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
CTrade         m_trade;                      // object of CTrade class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
CDealInfo      m_deal;                       // object of CDealInfo class
//--- input parameters
input ulong    InpMagic             = 200;      // Magic number
//---
datetime m_prev_bars                = 0;        // "0" -> D'1970.01.01 00:00';
datetime m_last_deal_in             = 0;        // "0" -> D'1970.01.01 00:00';
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
   RefreshRates();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(m_symbol.Name(),Period(),0);
   if(time_0==m_prev_bars)
      return;
   m_prev_bars=time_0;
   if(!RefreshRates())
     {
      m_prev_bars=0;
      return;
     }
//--- search for trading signals
   if(!SearchTradingSignals())
     {
      m_prev_bars=0;
      return;
     }
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal))
         m_deal.Ticket(trans.deal);
      else
         return;
      if(m_deal.Symbol()==m_symbol.Name() && m_deal.Magic()==InpMagic)
        {
         if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
           {
            if(m_deal.Entry()==DEAL_ENTRY_IN || m_deal.Entry()==DEAL_ENTRY_INOUT)
               m_last_deal_in=iTime(m_symbol.Name(),Period(),0);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Search trading signals                                           |
//+------------------------------------------------------------------+
bool SearchTradingSignals(void)
  {
   if(m_prev_bars==m_last_deal_in) // on one bar - only one deal
      return(true);
//--- signal
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: ","RefreshRates error");
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: ","Ask == 0.0 OR Bid == 0.0");
      return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+


La variable"m_prev_bars" enregistre le temps d'ouverture de la barre actuelle et la variable"m_last_deal_in" enregistre le temps d'ouverture de la barre à laquelle la position a été ouverte.

Ces deux variables sont comparées dans le bloc d'obtention des signaux"SearchTradingSignals".