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

 
Veuillez m'aider à compléter ce code.

J'ai besoin d'ajouter une limite au nombre d'ordres ouverts.
Dossiers :
mjj.txt  21 kb
 
Vadim Podoprigora:
Veuillez m'aider à compléter ce code.

J'ai besoin d'ajouter une limite au nombre d'ordres ouverts.

et comment le code doit-il fonctionner et après quoi la restriction doit-elle être placée ?

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

D'ailleurs, qui peut expliquer pourquoi à n'importe quelle valeur de données

expression if((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))

donne de vrais

Le but est d'éliminer les grandes fluctuations

une dernière chose.

Vous cherchez du matériel pour fabriquer des boutons

J'ai besoin de fusionner tous ces codes dans un panneau
 
trader781:

et comment le code doit-il fonctionner et après quoi la restriction doit-elle être placée ?

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

D'ailleurs, qui peut expliquer pourquoi à n'importe quelle valeur de données

expression if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))

donne de vrais

Le but est d'éliminer les grandes fluctuations

une dernière chose.

recherche du matériel sur la création de boutons

il faut fusionner tous ces codes dans un panneau
La section des articles regorge de ce type de matériel. Les exemples les plus simples se trouvent dans l'aide relative à chaque type d'objet graphiquehttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object/obj_button.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
trader781:

et comment le code doit-il fonctionner et après quoi la restriction doit-elle être placée ?

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

D'ailleurs, qui peut expliquer pourquoi à n'importe quelle valeur de données

expression if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))

donne de vrais

Le but est d'éliminer les grandes fluctuations

une dernière chose.

recherche du matériel pour la fabrication de boutons

nous devons combiner tous ces codes dans un panneau
Limiter le nombre d'ordres ouverts en même temps.
 
Vadim Podoprigora:
Limiter le nombre d'ordres ouverts en même temps.
Tenir
Dossiers :
55677.mq4  42 kb
 
Bonjour, on m'a confié la tâche d'écrire un EA qui effectue des transactions comme suit :
Déterminer le minimum et le maximum du prix pour la période de temps spécifiée par l'utilisateur (par exemple, de 00-00 à 02-00). Acheter : le prix est passé sous le minimum de la bougie, vendre : le prix est passé au-dessus du maximum. Avec une position ouverte, les nouvelles transactions ne s'ouvrent pas. Nous fermons la position à un moment précis (également spécifié par l'utilisateur, disons à 22-00) ou par SL\TP (spécifié par l'utilisateur).


La question est de savoir comment définir réellement ce minimum et ce maximum dans la période de temps ? Et l'EA ne peut pas commencer à négocier avant la fin de la période spécifiée par l'utilisateur (où le minimum et le maximum sont recherchés). Et comment suivre le nombre de commandes (pour qu'il n'y en ait pas plus d'une) ?

Qui sait où creuser et où chercher, merci d'avance. Si quelqu'un peut vous aider avec le code, ce serait formidable.
 
Anarchist:
Bonjour, on m'a confié la tâche d'écrire un EA qui effectue des transactions comme suit :
Déterminer le minimum et le maximum du prix pour la période de temps spécifiée par l'utilisateur (par exemple, de 00-00 à 02-00). Acheter : le prix est passé sous le minimum de la bougie, vendre : le prix est passé au-dessus du maximum. Avec une position ouverte, les nouvelles transactions ne s'ouvrent pas. Nous fermons la position à un moment précis (également spécifié par l'utilisateur, disons à 22-00) ou par SL\TP (spécifié par l'utilisateur).


La question est de savoir comment définir réellement ce minimum et ce maximum dans la période de temps ? Et l'EA ne peut pas commencer à négocier avant la fin de la période spécifiée par l'utilisateur (où le minimum et le maximum sont recherchés). Et comment suivre le nombre de commandes (pour qu'il n'y en ait pas plus d'une) ?

Qui sait où creuser et où chercher, merci d'avance. Si quelqu'un peut vous aider avec le code, ce serait formidable.
C'est une dissertation ?
 
Alexey Viktorov:
C'est une dissertation ?
Il s'agit d'un simple travail de laboratoire, ici tous ces éléments (spécifiés par l'utilisateur) sont spécifiés comme variables dans le code au début du programme + considérer que l'utilisateur n'est pas stupide.
 
Anarchist :
Bonjour à tous, on m'a confié la tâche d'écrire un Expert Advisor qui se négocie comme suit :
Nous déterminons les prix minimum et maximum pour la période spécifiée par l'utilisateur (par exemple, de 00-00 à 02-00). Achat : sur la bougie, le prix est passé au-dessus du plus bas, Vente : le prix est passé au-dessus du plus haut. Avec une position ouverte, nous n'ouvrons pas de nouvelles offres. Nous fermons la position à l'heure spécifiée (également spécifiée par l'utilisateur, disons à 22-00) ou par SL \ TP (spécifiée par l'utilisateur).


La question est de savoir comment déterminer réellement ce minimum et ce maximum pour une période de temps ? De plus, le conseiller ne peut pas commencer à négocier avant la fin du temps spécifié par l'utilisateur (où le minimum et le maximum sont recherchés). Et comment suivre le nombre de commandes (pour qu'il n'y en ait pas plus d'une) ?

Qui vous dira où creuser et où chercher, merci d'avance. Si quelqu'un peut aider avec le code, ce serait super.

Gardez les croquis rapidement, sans vérifications particulières, cela suffira pour le testeur.

//+------------------------------------------------------------------+
//|                                                       test07.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com/ru/users/sergey1294"
#property version    "1.00"
#property strict

input string analysis_time_start= "10:00" ;
input string analysis_time_end= "12:00" ;
input string time_out= "16:00" ;
input string time_out_close= "23:00" ;

input int     shift_open= 0 ;
input int     MagicNumber= 20110315 ;       // Номер копии
input double Lot= 0.01 ;           // Объем лота
input int     StopLoss     = 300 ;             // Стоп Лосс (Пипс)
input int     TakeProfit   = 500 ;             // Тейк Профит (Пипс)
input int     Slippage     = 10 ;             // Проскальзование (Пипс)
input string CommentOrder= "test" ;     // Комментарий к ордеру

double    up_price= 0.0 ;
double down_price= 0.0 ;
double hist_high[];
double hist_low[];
double hist_close[];
MqlDateTime times;
MqlRates rates[];
datetime d1;
datetime d2;
datetime d3;
datetime d4;
bool flag_open= false ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   VLineCreate( 0 , "Line_start" );
   VLineCreate( 0 , "Line_end" );
   VLineCreate( 0 , "Line_time_out" );
   VLineCreate( 0 , "Line_time_out_close" );
   HLineCreate( 0 , "Line_max" );
   HLineCreate( 0 , "Line_min" );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   VLineDelete( 0 , "Line_start" );
   VLineDelete( 0 , "Line_end" );
   VLineDelete( 0 , "Line_time_out" );
   VLineDelete( 0 , "Line_time_out_close" );
   HLineDelete( 0 , "Line_max" );
   HLineDelete( 0 , "Line_min" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   datetime date= TimeCurrent (times);
   int ty=times.year;
   int tm=times.mon;
   int td=times.day;
   d1= StringToTime (( string )ty+ "." +( string )tm+ "." +( string )td+ " " +analysis_time_start);
   d2= StringToTime (( string )ty+ "." +( string )tm+ "." +( string )td+ " " +analysis_time_end);
   d3= StringToTime (( string )ty+ "." +( string )tm+ "." +( string )td+ " " +time_out);
   d4= StringToTime (( string )ty+ "." +( string )tm+ "." +( string )td+ " " +time_out_close);

   if (!flag_open && date>d1 && date<d2)flag_open= true ;
   if (date>=d3 && d2<d3)flag_open= false ;

   if (date>d2)
     {
       if ( CopyLow ( _Symbol , 0 ,d1,d2,hist_low)< 0 ) return ;
       if ( CopyHigh ( _Symbol , 0 ,d1,d2,hist_high)< 0 ) return ;
      up_price= NormalizeDouble (hist_high[ ArrayMaximum (hist_high)], _Digits );
      down_price= NormalizeDouble (hist_low[ ArrayMinimum (hist_low)], _Digits );
     }

   VLineMove( 0 , "Line_start" ,d1);
   VLineMove( 0 , "Line_end" ,d2);
   VLineMove( 0 , "Line_time_out" ,d3);
   VLineMove( 0 , "Line_time_out_close" ,d4);
   HLineMove( 0 , "Line_max" ,up_price);
   HLineMove( 0 , "Line_min" ,down_price);

   Comment (
           "\n date = " ,date,
           "\n d1 = " , TimeToString (d1),
           "\n d2 = " , TimeToString (d2),
           "\n d3 = " , TimeToString (d3),
           "\n d4 = " , TimeToString (d4)
           );

   if (flag_open)
     {
       if (TotalOrder()== 0 )
        {
         if ( CopyRates ( _Symbol , PERIOD_CURRENT , 0 ,shift_open+ 2 ,rates)==shift_open+ 2 )
           {
             if (date>d2 && date<d3 && d2<d3 && rates[shift_open].time>d2)
              {
               if (rates[shift_open].close>=up_price && rates[shift_open+ 1 ].close<=up_price)
                 {
                  OrderOpen( OP_BUY );
                 }

               if (rates[shift_open].close<=down_price && rates[shift_open+ 1 ].close>=down_price)
                 {
                  OrderOpen( OP_SELL );
                 }
              }
           }
        }
     }

   if (date>=d4 && d2<d4)
     {
       OrderClose ();
     }

   ModifySL(StopLoss);
   ModifyTP(TakeProfit);
  }
//+------------------------------------------------------------------+
int TotalOrder()
  {
   int value= 0 ;
   int total= OrdersTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS )) continue ;
       if ( OrderSymbol ()!= Symbol ()) continue ;
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
       if ( OrderType ()> 1 ) continue ;
      value++;
     }
   return (value);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OrderOpen( int type)
  {
   double price_open= 0.0 ;
   if (type== WRONG_VALUE ) return ;
   if (! IsTradeAllowed ()) return ;

   if (type== OP_BUY )price_open = NormalizeDouble ( Ask , _Digits );
   if (type== OP_SELL )price_open = NormalizeDouble ( Bid , _Digits );

   int ticket= OrderSend ( _Symbol ,type,Lot,price_open,Slippage, 0 , 0 ,CommentOrder,MagicNumber);
   if (ticket< 0 ) Print ( "Ошибка открытия ордера № - " , GetLastError ());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OrderClose ()
  {
   double price_close= 0.0 ;
   if (! IsTradeAllowed ()) return ;
   int total= OrdersTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS )) continue ;
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
       if ( OrderSymbol ()!= _Symbol ) continue ;
       if ( OrderType ()!= OP_BUY  &&  OrderType ()!= OP_SELL ) continue ;
       if ( OrderType ()== OP_BUY )price_close= NormalizeDouble ( Bid , _Digits );
       if ( OrderType ()== OP_SELL )price_close= NormalizeDouble ( Ask , _Digits );
       bool res= OrderClose ( OrderTicket (), OrderLots (),price_close,Slippage);
       if (!res) Print ( "Ошибка закрытия ордера № - " , GetLastError ());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifySL( double sl)
  {
   if (sl<= 0 ) return ;
   double price_sl= 0.0 ;
   int total= OrdersTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS )) continue ;
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
       if ( OrderSymbol ()!= _Symbol ) continue ;
       if ( OrderType ()> 1 ) continue ;
       if ( OrderStopLoss ()== 0 )
        {
         if ( OrderType ()== OP_BUY )price_sl= NormalizeDouble ( OrderOpenPrice ()-sl* _Point , _Digits );
         if ( OrderType ()== OP_SELL )price_sl= NormalizeDouble ( OrderOpenPrice ()+sl* _Point , _Digits );
         if (price_sl<= 0 ) continue ;
         bool res= OrderModify ( OrderTicket (), OrderOpenPrice (),price_sl, OrderTakeProfit (), 0 );
         if (!res) Print ( "Ошибка модификации стоп лосса ордера № - " , GetLastError ());
        }
     }
  }
//+------------------------------------------------------------------+
void ModifyTP( double tp)
  {
   if (tp<= 0 ) return ;
   double price_tp= 0.0 ;
   int total= OrdersTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS )) continue ;
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
       if ( OrderSymbol ()!= _Symbol ) continue ;
       if ( OrderType ()> 1 ) continue ;
       if ( OrderTakeProfit ()== 0 )
        {
         if ( OrderType ()== OP_BUY )price_tp= NormalizeDouble ( OrderOpenPrice ()+tp* _Point , _Digits );
         if ( OrderType ()== OP_SELL )price_tp= NormalizeDouble ( OrderOpenPrice ()-tp* _Point , _Digits );
         if (price_tp<= 0 ) continue ;
         bool res= OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),price_tp, 0 );
         if (!res) Print ( "Ошибка модификации тейк профита ордера № - " , GetLastError ());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Создает вертикальную линию                                       |
//+------------------------------------------------------------------+
bool VLineCreate( const long             chart_ID= 0 ,         // ID графика
                 const string           name= "VLine" ,       // имя линии
                 const int              sub_window= 0 ,       // номер подокна
                 datetime               time= 0 ,             // время линии
                 const color            clr= clrRed ,         // цвет линии
                 const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии
                 const int              width= 1 ,           // толщина линии
                 const bool             back= false ,         // на заднем плане
                 const bool             selection= true ,     // выделить для перемещений
                 const bool             ray= true ,           // продолжение линии вниз
                 const bool             hidden= true ,       // скрыт в списке объектов
                 const long             z_order= 0 )         // приоритет на нажатие мышью
  {
//--- если время линии не задано, то проводим ее через последний бар
   if (!time)
      time= TimeCurrent ();
//--- сбросим значение ошибки
   ResetLastError ();
//--- создадим вертикальную линию
   if (! ObjectCreate (chart_ID,name, OBJ_VLINE ,sub_window,time, 0 ))
     {
       Print ( __FUNCTION__ ,
             ": не удалось создать вертикальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- установим цвет линии
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль отображения линии
   ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину линии
   ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- включим (true) или отключим (false) режим отображения линии в подокнах графика
   ObjectSetInteger (chart_ID,name, OBJPROP_RAY ,ray);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Перемещение вертикальной линии                                   |
//+------------------------------------------------------------------+
bool VLineMove( const long    chart_ID= 0 ,   // ID графика
               const string name= "VLine" , // имя линии
               datetime      time= 0 )       // время линии
  {
//--- если время линии не задано, то перемещаем ее на последний бар
   if (!time)
      time= TimeCurrent ();
//--- сбросим значение ошибки
   ResetLastError ();
//--- переместим вертикальную линию
   if (! ObjectMove (chart_ID,name, 0 ,time, 0 ))
     {
       Print ( __FUNCTION__ ,
             ": не удалось переместить вертикальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Удаляет вертикальную линию                                       |
//+------------------------------------------------------------------+
bool VLineDelete( const long    chart_ID= 0 ,   // ID графика
                 const string name= "VLine" ) // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError ();
//--- удалим вертикальную линию
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": не удалось удалить вертикальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Создает горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineCreate( const long             chart_ID= 0 ,         // ID графика
                 const string           name= "HLine" ,       // имя линии
                 const int              sub_window= 0 ,       // номер подокна
                 double                 price= 0 ,           // цена линии
                 const color            clr= clrRed ,         // цвет линии
                 const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии
                 const int              width= 1 ,           // толщина линии
                 const bool             back= false ,         // на заднем плане
                 const bool             selection= true ,     // выделить для перемещений
                 const bool             hidden= true ,       // скрыт в списке объектов
                 const long             z_order= 0 )         // приоритет на нажатие мышью
  {
//--- если цена не задана, то установим ее на уровне текущей цены Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
   ResetLastError ();
//--- создадим горизонтальную линию
   if (! ObjectCreate (chart_ID,name, OBJ_HLINE ,sub_window, 0 ,price))
     {
       Print ( __FUNCTION__ ,
             ": не удалось создать горизонтальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- установим цвет линии
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль отображения линии
   ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину линии
   ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии                                 |
//+------------------------------------------------------------------+
bool HLineMove( const long    chart_ID= 0 ,   // ID графика
               const string name= "HLine" , // имя линии
               double        price= 0 )       // цена линии
  {
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
   ResetLastError ();
//--- переместим горизонтальную линию
   if (! ObjectMove (chart_ID,name, 0 , 0 ,price))
     {
       Print ( __FUNCTION__ ,
             ": не удалось переместить горизонтальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineDelete( const long    chart_ID= 0 ,   // ID графика
                 const string name= "HLine" ) // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError ();
//--- удалим горизонтальную линию
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": не удалось удалить горизонтальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }

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

...

Dossiers :
test07.mq4  34 kb
 
Il y avait un bug dans le bloc de fermeture des commandes, corrigé.