Créer un robot - page 8

 

MERCI BEAUCOUP À TOUS ! !!

Le code de programme qui crée l'indicateur ZigZagColor sur le graphique actuel et le supprime après la fermeture de l'EA ressemble à ceci

dans le bloc d'initialisation de l'EA

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

dans le bloc de désinitialisation de l'Expert Advisor

(AVERTISSEMENT pour ceux qui utiliseront ce code ! Cette version du code est un intermédiaire et n'est applicable qu'aux paramètres de l'indicateur Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; à d'autres paramètres, l'indicateur ne sera pas supprimé ! Pour que l'indicateur soit supprimé à d'autres paramètres dans le bloc de désinitialisation, indiquez-les à la place de 80,20,0).

//---
  ChartIndicatorDelete(0,0,"ZigZag(80,20,0)");

Maintenant, je dois comprendre comment faire pour qu'il supprime l'indicateur après avoir modifié ses paramètres. J'ai essayé la variante suivante :

//---
  ChartIndicatorDelete(0,0,"ZigZag("+Inp_ZZ_Depth+","+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+")");

Il efface l'indicateur pour tous les paramètres, mais lors de la compilation de l'EA, l'éditeur génère 3 avertissements concernant la conversion implicite d'un nombre en chaîne:

implicit conversion from 'number' to 'string'   ZigZag_Fibonacci_(M1).mq5       230     38

Je pense que tout est lié à ces valeurs : "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Eh bien, je dois étudier davantage le langage de programmation MQL5.

Merci encore pour votre aide !

Sincèrement, Vladimir.

 
MrBrooklin:

MERCI BEAUCOUP À TOUS ! !!

Le code final qui crée l'indicateur ZigZagColor sur le graphique actuel et le supprime après la fermeture de l'EA ressemble à ceci

dans le bloc d'initialisation de l'EA

en bloc de désinitialisation de l'EA

(AVERTISSEMENT pour ceux qui utiliseront ce code ! Cette version du code est un intermédiaire et n'est applicable qu'aux paramètres de l'indicateur Inp_ZZ_Depth = 80; Inp_ZZ_Deviation = 20; Inp_ZZ_Backstep = 0; à d'autres paramètres, l'indicateur ne sera pas supprimé ! Pour que l'indicateur soit supprimé à d'autres paramètres dans le bloc de désinitialisation, indiquez-les à la place de 80,20,0).

Maintenant, je dois comprendre comment faire pour qu'il supprime l'indicateur après avoir modifié ses paramètres. J'ai essayé la variante suivante :

Il efface l'indicateur pour tous les paramètres, mais lors de la compilation de l'EA, l'éditeur génère 3 avertissements concernant la conversion implicite d'un nombre en chaîne:

Je pense que tout est lié à ces valeurs : "+Inp_ZZ_Depth+", "+Inp_ZZ_Deviation+","+Inp_ZZ_Backstep+". Eh bien, je dois étudier davantage le langage de programmation MQL5.

Merci encore une fois pour votre aide précieuse !

Sincèrement, Vladimir.

 ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

L'avertissement sur une conversion de type implicite. Pour une implémentation stricte, la conversion implicite donne un avertissement.

Vous devriez explicitement taper. Et dans MT5, il s'agit toujours d'une exécution stricte. Dans MT4 vous pouvez sélectionner et ne pas spécifier dans les propriétés #property strict

 
SanAlex:

Je suis moi-même autodidacte - et je copie moi-même les codes disponibles, - Le problème est que je ne sais pas comment expliquer comment sculpter !? - quelque chose en moi me dit comment sculpter.

----------------------------------

Je sais ce que j'ai moulé, il manque là, aussi un chalut pour la ligne.

J'ai ajouté le chalut.

input string   t0="---- Trailing Line:      -----";              //
input ushort   InpObjTrailingStop           = 0;                 // Obj: Trailing Stop (distance from price to object, in pips)
input ushort   InpObjTrailingStep           = 0;                 // Obj: Trailing Step, in pips (1.00045-1.00055=1 pips)
input string   t1="---- Line Name           -----";              //
input string   InpObjUpName                 = "Имя Линии Up";    // Obj: Up (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InpTradeCommand    = UpName_s;          // Obj:  command: UP
input string   InpObjDownName               = "Имя Линии Down";  // Obj: Down (Trailing Horizontal Line) or Trend Line)
input ENUM_TRADE_COMMAND InTradeCommand     = DownName_b;        // Obj:  command: DOWN
input ushort   InpObjStep                   = 15;                // Obj: Step (distance from price to object, in pips)
Dossiers :
0006.mq5  109 kb
 
Valeriy Yastremskiy:

Avertissement sur la conversion de type non explicite. Pour une exécution directe (stricte), une conversion non explicite donne un avertissement.

Vous devez explicitement exprimer les types. Et dans MT5, il s'agit toujours d'une exécution stricte. Dans MT4 vous pouvez sélectionner et ne pas spécifier dans les propriétés #property strict

Tu as raison, Valery ! En l'état actuel des choses, tout fonctionne comme il se doit. La version finale dans le bloc d'initialisation de l'EA :

//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(m_symbol.Name(),Period(),"Examples\\ZigzagColor",
                          Inp_ZZ_Depth,
                          Inp_ZZ_Deviation,
                          Inp_ZZ_Backstep);
   ChartIndicatorAdd(ChartID(),0,handle_iCustom);

dans le bloc de désinitialisation de l'EA :

ChartIndicatorDelete(0,0,"ZigZag("+(string)Inp_ZZ_Depth+","+(string)Inp_ZZ_Deviation+","+(string)Inp_ZZ_Backstep+")");

Merci pour le conseil !

Salutations, Vladimir.

 
Роман Жилин:

Oooh, merci beaucoup, avec autant d'informations on peut faire beaucoup de choses...

Je suissur le point de partir en voyage d'affaires, et je pense donc approfondir le matériel qui m'a été donné, mais le codage... Je pourrais aussi le faire sur une feuille de papier, ce serait un bon outil d'entraînement...


Salutations, Roman

Bonjour à tous !

Pendant que Roman est en voyage d'affaires et ne participe pas à ce sujet, je vais continuer à poser des questions sur le langage de programmation MQL5 à la place. J'ai trouvé la bibliothèque Maximum Percentage of Equity Risk dans CodeBase à l'adresse https://www.mql5.com/ru/code/2142. J'ai décidé d'essayer de mettre en œuvre l'ouverture de positions d'achat et de vente dans un simple Expert Advisor, mais pas avec un lot fixe, mais avec le pourcentage maximum de risque sur l'équité.

Voici le code source (j'ai supprimé toutes les choses inutiles pour me concentrer sur la tâche principale) :

//+------------------------------------------------------------------+
//|                                                  11111111111.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"

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот

double Ask;
double Bid;
//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

J'y ai inséré le code de la bibliothèque spécifiée. J'ai obtenu le code suivant :

//+------------------------------------------------------------------+
//|                                                  11111111111.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\SymbolInfo.mqh> // добавлено из библиотеки

input int      TakeProfit=300; //Тейк-профит
input int      StopLoss=250;  //Стоп-лосс
input double   lot=0.1;        //Лот
input double   MaximumPercentageRisk=25; //Риск - добавлено из библиотеки

bool UseMaximumPercentageRisk=true; // добавлено из библиотеки
double Ask;
double Bid;
//--- этот блок добавлен из библиотеки
//+------------------------------------------------------------------+
//|  GetLotSize RPTrade                                              |
//+------------------------------------------------------------------+
double GetLotSize(double lotsize)
  {
//--- Gets pair specs  
   CSymbolInfo symInfo;
   int  digits_bn=symInfo.Digits();
   double  points_bn=symInfo.Point();
   string symbol_bn=_Symbol;
//--- adjust lot 
   int tmpdecimal=1;
   double old_lot=lotsize;
//---
   if((NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*(MaximumPercentageRisk/100)/1000.0,tmpdecimal)<lotsize) 
   && UseMaximumPercentageRisk) //лот подходит под риск ?
     {
      lotsize=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)
      *(MaximumPercentageRisk/100)/1000.0,tmpdecimal);  //расчет нового размера лота 

      if(lotsize<SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN)) //размер лота подходит под минимльный размер лота брокера ?
        {
         lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_MIN); //Нет! Настройка размера лота под минимальный размер лота брокера
         Print(_Symbol," Lot adjusted from ",old_lot," для уменьшения размера разрешенного сервером ",lotsize);
        }
      else
        {
         Print(_Symbol," Lot adjusted from ",old_lot,
         " to ",lotsize," для соответствия условию максимального риска. В каждой сделке рисковать можно только ",
         MaximumPercentageRisk,"% от свободной маржи.");   //Да! 
         if(MathAbs(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
         -MathRound(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)))>1.0 E-10) //Размер лота подходит под разрешенный шаг брокера ?
           {
            lotsize=SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP)
            *NormalizeDouble(lotsize/SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),0);   //НЕТ! Перерасчет размера лота.    
            Print("M-",_Symbol," Warning: Your calculated percentage at risk lot size of was not a multiple of minimal step",
            SymbolInfoDouble(symbol_bn,SYMBOL_VOLUME_STEP),". Размер лота изменился до",lotsize);
           }
        }
     }
   return(lotsize);
 }

//+------------------------------------------------------------------+
//| Функция открытия длинной (Long) позиции.                         |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1,
             int slippage=10,
             string comment="Long",
             int magic=0)
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   ZeroMemory(my_trade);
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(volume,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Ask-StopLoss*_Point,_Digits);
   my_trade.tp=NormalizeDouble(Ask+TakeProfit*_Point,_Digits);
   my_trade.deviation=slippage;
   my_trade.type=ORDER_TYPE_BUY;
   my_trade.type_filling=ORDER_FILLING_FOK;
   my_trade.comment=comment;
   my_trade.magic=magic;
   ResetLastError();

   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции - ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера = ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| функция открытия короткой (Short) позиции.                       |
//| Аналогична функции открытия длинной позиции.                     |
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert OnTick function                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
.   double Open[];
.
.
         if(Open[1]>(Open[2]))
           {
            OpenShort(lot,10,"Short",1234);
            return;
           }
         if((Open[1]<Open[2])
           {
            OpenLong(lot,10,"Long",1234);
            cantrade=false;
            return;
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+

Mais le conseiller expert continue de travailler avec un lot fixe, c'est-à-dire que le risque n'est pas pris en compte. Veuillez me conseiller sur ce qu'il faut faire pour que le pourcentage de risque de la plus-value soit respecté.

Salutations, Vladimir.

Maximum Percentage of Equity Risk
Maximum Percentage of Equity Risk
  • www.mql5.com
Change Chart and Timeframe Модифицированные скрипты для быстрого изменения графиков и таймфреймов на всех графиках при помощи горячих клавиш. Apply Template Простой скрипт для применения шаблона и/или таймфрейма ко всем открытым графикам. Long position Простой скрипт...
 
Messieurs, il n'y a qu'une page de discussion dans tout le fil, le reste est du code. Ne suffit-il pas d'insérer les codes?
 
MrBrooklin:

Bonne journée à vous tous !

Pendant que Roman est en voyage d'affaires et ne participe pas activement à ce fil de discussion, je vais continuer à poser des questions sur le langage de programmation MQL5 à la place. J'ai trouvé la bibliothèque Maximum Percentage of Equity Risk dans CodeBase à l'adresse https://www.mql5.com/ru/code/2142. J'ai décidé d'essayer d'implémenter l'ouverture de positions d'achat et de vente dans un simple Expert Advisor, mais pas avec un lot fixe, mais avec le pourcentage maximum de risque sur l'équité.

Voici le code source (j'ai supprimé toutes les choses inutiles pour me concentrer sur la tâche principale) :

J'y ai inséré le code de la bibliothèque spécifiée. J'ai obtenu le code suivant :

Mais le conseiller expert continue de travailler avec un lot fixe, c'est-à-dire que le risque n'est pas pris en compte. Veuillez me conseiller sur ce qu'il faut faire pour que le pourcentage de risque de la plus-value soit respecté.

Mon respect Vladimir.

De la façon dont vous l'avez écrit, c'est comme ça que ça marche. Vous avez besoin d'une ligne, si Lot==0, alors comptez le lot risqué et assignez la valeur du calcul à la variable Lot à la fin.

Au Quaternaire, de cette manière, par le biais d'une variable supplémentaire Lts

bool CheckMoneyForTrade()
 {
 RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера
 
   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия
 
   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Not enough money for ", Lts," lots");
     Work=false;
      return(false) ;                                   // Выход из функции()
     }
     return(true);
     }
 
VVT:
Messieurs, le sujet entier est une page de discussion, le reste est du code. Ne suffit-il pas d'insérer les codes?

Comment aider alors ?

 
SanAlex:

Comment aider alors ?

Ne mettez que ce qui est demandé

 
Valeriy Yastremskiy:

C'est ainsi qu'il est rédigé et qu'il fonctionne. Nous avons besoin d'une ligne si Lot==0 alors nous comptons le lot risqué et à la fin nous assignons la valeur du calcul à la variable Lot.

Au Quaternaire, c'est comme ça, par le biais d'une variable supplémentaire Lts.

Merci, Valeriy, je vais essayer dans la soirée !

Sincèrement, Vladimir.