Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 59
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
J'ai besoin d'ajouter une limite au nombre d'ordres ouverts.
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 panneauet 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 panneauet 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 panneauLimiter le nombre d'ordres ouverts en même temps.
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.
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 ?
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 );
}
//+------------------------------------------------------------------+
...