Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1229

 
datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
int af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);                                // Шаг 1: OrderSelect Выбираем ордер (SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == "EURUSD") && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ EURUSD отсутствует,И если ордер присутствует , и ни один из ордеров НЕ содержит магикномер, то выходим из цикла.( выходим -значит откр. позицию) 
                                                                                    (если какое-либо условие из двух указанных не совпадает, то выходим) 
}
          

             
if ((Close[0]>High[1]))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1]))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}

D'après ce que j'ai compris, il s'agit d'une vérification périodique de la disponibilité. (Y a-t-il EURUSD ? et y a-t-il un ordre avec le Magic spécifié ?) Si l'une des conditions est manquante, nous ouvrons une position. Ce n'est que si les deux conditions sont remplies que nous ouvrons une position.

On nous demande alors à l'étape 2. Supposons que nous ayons un ordre ouvert manuellement. Nous remplissons alors la première condition (nous avons le même symbole) et nous ne remplirons pas la deuxième condition, puisque cet ordre ne contient pas de magie. Et si l'une des conditions ne correspond pas, alors le code doit ouvrir l'ordre. C'est exactement ce que fait le code. Mais au prochain tic, il ouvre le troisième, le quatrième et le cinquième ordre......

Pourquoi ouvre-t-il une troisième commande ?

Mais il y a deux commandes qui remplissent les deux conditions au total. Il devrait y avoir un contrôle (passage à return(0)), pas une ouverture. pas l'ouverture.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Bonne nuit à tous ! Pouvez-vous me dire si vous pouvez écrire un code en mql5 qui dessine une ligne sur le graphique (image jointe) et enregistre toutes les coordonnées de cette ligne dans le fichier ? Si vous voulez utiliser cette ligne comme base pour l'avenir, alors vous devez l'utiliser comme base pour le robot de trading. direct
 
GlushkoV_V_V:
Bonne nuit à tous ! Pouvez-vous me dire si vous pouvez écrire un code en mql5 qui dessine une ligne sur le graphique (image jointe) et enregistre toutes les coordonnées de cette ligne dans le fichier ? Si vous souhaitez tracer une ligne et la remplir avec les coordonnées, vous devez effectuer un simple traçage de la ligne.

Tout est dans la documentation.

Документация по MQL5: Графические объекты / ObjectCreate
Документация по MQL5: Графические объекты / ObjectCreate
  • www.mql5.com
[in]  Номер подокна графика. 0 означает главное окно графика. Указанное подокно должно существовать, в противном случае функция возвращает false. Возвращает true при успешной постановке команды в очередь указанного графика, иначе false. Если объект был уже создан ранее, то производится попытка изменить его координаты. При вызове ObjectCreate...
 
Сергей Таболин:

Tout est dans la documentation.

Merci pour le tuyau, vous pouvez peut-être m'aider à en construire un, gratuitement bien sûr.

 
GlushkoV_V_V:

Merci pour le tuyau, mais peut-être pouvez-vous m'aider à construire un de ces trucs, pas gratuitement bien sûr.

Pas gratuitement - c'est pour vous))))

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • www.mql5.com
Убрать из советника второй индикатор заменить другим,изменить условие открытие ордера .Условие сделки покупка: НМА линия вверх второй индикатор столбик гистограмы выше нуля (второй индикатор пересечение нуля точка входа) по закрытой свече если нма и второй индикатор не изменили показания совершается покупка для продаже наоборот.Изменить...
 
Merci beaucoup, mais pour moi c'est comme en chinois et je ne sais pas comment l'implémenter dans le code.
 
Alexey Belyakov:

D'après ce que j'ai compris, il s'agit d'une vérification périodique de la disponibilité. (Y a-t-il EURUSD ? et y a-t-il un ordre avec le Magic spécifié ?) Si l'une des conditions est manquante, nous ouvrons une position. Ce n'est que si ces deux conditions sont remplies que nous ouvrons une position.

On nous demande alors à l'étape 2. Supposons que nous ayons un ordre ouvert manuellement. Nous remplissons alors la première condition (nous avons le même symbole) et nous ne remplirons pas la deuxième condition, puisque cet ordre ne contient pas de magie. Et si l'une des conditions ne correspond pas, alors le code doit ouvrir l'ordre. C'est exactement ce que fait le code. Mais au prochain tic, il ouvre le troisième, le quatrième et le cinquième ordre......

Pourquoi ouvre-t-il une troisième commande ?

Mais il y a deux commandes qui remplissent les deux conditions au total. Il devrait y avoir un contrôle (passage à return(0)), pas une ouverture. mais pas l'ouverture.

== - s'il est égal != - s'il n'est pas égal. Continue - fin de l'itération de la boucle et début d'une nouvelle itération de la boucle. Rupture - fin du cycle et transition vers l'opérateur suivant qui suit le cycle, retour - fin de la fonction, dans votre cas Onstart et attente d'un nouveau tick. Et si un ordre avec votre magik est ouvert, il devrait terminer la fonction et partir pour attendre un nouveau tick.

Question, si vous voulez ouvrir un ordre dans la fenêtre actuelle, pourquoi devez-vous spécifier l'outil explicitement, ou voulez-vous ouvrir des ordres depuis la fenêtre d'un autre outil ? Le nombre d'ordres que vous souhaitez ouvrir n'est pas clair non plus. Selon votre code, une seule commande peut être ouverte et seulement après sa fermeture, la seconde sera ouverte. Vous avez un magicien et un outil de fenêtre ouverte. De plus, les conditions d'ouverture des ordres sont vérifiées pour l'instrument courant et non pour les Eurobucks.

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber); // так же здесь цены аск и бид тоже для текущего инструмента
}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber); // и поинт кстати тоже.
}

return(0);
}
 
Valeriy Yastremskiy:

== - si égal != - si non égal. Kontinue - termine l'itération de la boucle et commence une nouvelle itération de la boucle. Break - termine la boucle et passe à l'opérateur suivant de la boucle, return - termine la fonction, dans votre cas Onstart et attend un nouveau tick. Et si un ordre avec votre magik est ouvert, il devrait terminer la fonction et partir pour attendre un nouveau tick.

Question, si vous voulez ouvrir un ordre dans la fenêtre actuelle, pourquoi devez-vous spécifier l'outil explicitement, ou voulez-vous ouvrir des ordres depuis la fenêtre d'un autre outil ? Le nombre d'ordres que vous souhaitez ouvrir n'est pas clair non plus. Selon votre code, une seule commande peut être ouverte et seulement après sa fermeture, la seconde sera ouverte. Vous avez un magicien et un outil de fenêtre ouverte. De plus, les conditions d'ouverture des ordres sont vérifiées pour l'instrument courant et non pour les Eurobucks.

- Oui, je veux ouvrir dans la fenêtre actuelle ;

- Une commande. L'ordre suivant n'est pas ouvert tant que l'ordre précédent n'est pas fermé.

"De plus, les conditions d'ouverture des ordres sont vérifiées pour l'instrument courant et non pour les Eurobucks." - alors ?

((OrderSymbol() == "EURUSD" )  ???
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Alexey Belyakov:

- Oui, je veux ouvrir dans la fenêtre actuelle ;

- Une commande. L'ordre suivant n'est pas ouvert tant que l'ordre précédent n'est pas fermé.

"De plus, les conditions d'ouverture des ordres sont vérifiées pour l'instrument courant et non pour les Eurobucks." - alors ?

Et qu'est-ce qui se passe alors, par exemple, vous avez une fenêtre ouverte non pas Eurobucks, mais l'Eurofunt, vous comparez le symbole de l'ordre sélectionné avec Eurobucks, si c'est vrai, alors sur l'Eurobucks il y a un ordre, et si notre magik, alors on revient de la fonction OnStart, et si non, alors on place un ordre sur l'Eurobucks, mais Kloz, High, Asc, Bid, vous aurez une erreur lors de l'ouverture des ordres, parce que Bid et Asc pour ces instuents sont différents. Et Symbol() retournera le symbole de la fenêtre actuelle et aucune erreur ne se produira.

Utilisez le modèle de l'éditeur de méta, il y a un bouton Nouveau en haut à gauche. La fonction OnStart est toujours utilisée, mais ce n'est pas correct, et OnStart est pour les scripts. Le bon modèle.

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Code correct. Le commentaire de votre commande est manquant, et le magicien n'est pas pris en compte dans votre code. Dans les avertissements de la ligne d'ouverture, notez Conversion implicite de type d'un nombre en chaîne de caractères !!!

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return; // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen); // так же здесь цены аск и бид тоже для текущего инструмента

}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,"My order",MagicNumber,0,clrGreen); // и поинт кстати тоже.
}

return;
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

il y a beaucoup d'erreurs dans votre exemple

for(int i = OrdersTotal(); i >=0; i--)  

il devrait y en avoir :

for(int i = OrdersTotal()-1; i >=0; i--)  

ici les prix ne sont pas normalisés OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen) ;

Ici, je ne comprends pas la logique qui fait que la sortie de OnTick() est nécessaire si la condition est fausse.

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return;

peut-être, nous devrions continuer la boucleet juste compter le nombre de commandes

Votre exemple est très simple dans sa logique et il serait difficile de le modifier pour d'autres tâches... peut-être qu'il aimerait ajouter la queue