Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 59
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Preciso acrescentar um limite ao número de pedidos em aberto.
Por favor, ajude-me a completar este código.
Preciso acrescentar um limite ao número de pedidos em aberto.
e como deve funcionar o código e depois de qual deve ser colocada a restrição?
----------------------------------------------------------------------
A propósito, quem pode explicar por que em qualquer valor de dados
expressão if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))
dá verdade
é para aparar grandes flutuações
uma última coisa.
Procurando material sobre como fazer botões
Eu preciso fundir todos estes códigos em um painele como deve funcionar o código e depois de qual deve ser colocada a restrição?
----------------------------------------------------------------------
A propósito, quem pode explicar por que em qualquer valor de dados
expressão if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))
dá verdade
é para aparar grandes flutuações
uma última coisa.
à procura de material para fazer botões
necessidade de fundir todos esses códigos em um painele como deve funcionar o código e depois de qual deve ser colocada a restrição?
----------------------------------------------------------------------
A propósito, quem pode explicar por que em qualquer valor de dados
expressão if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))
dá verdade
é para aparar grandes flutuações
uma última coisa.
procurando material sobre a criação de botões
temos que colocar todos estes códigos juntos em um painelLimitar o número de pedidos em aberto ao mesmo tempo.
Determinar o preço mínimo e máximo para o período de tempo especificado pelo usuário (por exemplo, de 00-00 a 02-00). Comprar: o preço foi abaixo do mínimo na vela, vender: o preço foi acima do máximo. Com uma posição aberta, novas transações não se abrem. Fechamos a posição em um horário especificado (também especificado pelo usuário, digamos em 22-00) ou por SL\TP (especificado pelo usuário).
A questão é como realmente definir este mínimo e máximo no período de tempo? E a EA não pode iniciar as negociações antes do final do período de tempo especificado pelo usuário (onde o mínimo e o máximo são procurados). E como rastrear o número de pedidos (para que não sejam mais de um)?
Quem sabe onde cavar e onde procurá-lo, obrigado antecipadamente. Se alguém puder ajudar com o código, isso seria ótimo.
Olá, foi-me dada uma tarefa para escrever um EA que negocia da seguinte forma:
Determinar o preço mínimo e máximo para o período de tempo especificado pelo usuário (por exemplo, de 00-00 a 02-00). Comprar: o preço foi abaixo do mínimo na vela, vender: o preço foi acima do máximo. Com uma posição aberta, novas transações não se abrem. Fechamos a posição em um horário especificado (também especificado pelo usuário, digamos em 22-00) ou por SL\TP (especificado pelo usuário).
A questão é como realmente definir este mínimo e máximo no período de tempo? E a EA não pode iniciar as negociações antes do final do período de tempo especificado pelo usuário (onde o mínimo e o máximo são procurados). E como rastrear o número de pedidos (para que não sejam mais de um)?
Quem sabe onde cavar e onde procurá-lo, obrigado antecipadamente. Se alguém puder ajudar com o código, isso seria ótimo.
Isto é um termo de papel?
Olá a todos, recebi a tarefa de escrever um Expert Advisor que negocia da seguinte forma:
Determinamos os preços mínimos e máximos para o período de tempo especificado pelo usuário (por exemplo, de 00-00 a 02-00). Comprar: na vela, o preço ultrapassou a mínima, Vender: o preço ultrapassou a máxima. Com uma posição aberta, não abrimos novos negócios. Fechamos a posição no horário especificado (também especificado pelo usuário, digamos às 22:00) ou por SL \ TP (especificado pelo usuário).
A questão é, como realmente determinar esse mínimo e máximo por um período de tempo? Além disso, o consultor não pode iniciar a negociação antes do final do tempo especificado pelo usuário (onde o mínimo e o máximo são pesquisados). E como rastrear o número de pedidos (para que não haja mais de um)?
Quem lhe dirá onde cavar e onde procurar, obrigado antecipadamente. Se alguém puder ajudar com o código, seria ótimo.
Mantenha esboçado rapidamente, sem verificações especiais, isso servirá para o testador.
//| 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 );
}
//+------------------------------------------------------------------+
...