Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 59
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich muss ein Limit für die Anzahl der offenen Aufträge setzen.
Bitte helfen Sie mir, diesen Code zu vervollständigen.
Ich muss ein Limit für die Anzahl der offenen Aufträge setzen.
und wie sollte der Code funktionieren und nach was sollte die Beschränkung erfolgen?
----------------------------------------------------------------------
Übrigens, wer kann erklären, warum bei jedem Datenwert
Ausdruck if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))
gibt wahre
Zweck ist es, große Schwankungen abzuschwächen
eine letzte Sache.
Suche nach Material zur Herstellung von Knöpfen
Ich muss alle diese Codes in einem Panel zusammenführenund wie sollte der Code funktionieren und nach was sollte die Beschränkung erfolgen?
----------------------------------------------------------------------
Übrigens, wer kann erklären, warum bei jedem Datenwert
Ausdruck if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))
gibt wahre
Zweck ist es, große Schwankungen abzuschwächen
eine letzte Sache.
Suche nach Material zur Herstellung von Knöpfen
alle diese Codes in einem Panel zusammenführen müssenund wie sollte der Code funktionieren und nach was sollte die Beschränkung erfolgen?
----------------------------------------------------------------------
Übrigens, wer kann erklären, warum bei jedem Datenwert
Ausdruck if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))
gibt wahre
Zweck ist es, große Schwankungen zu beseitigen
eine letzte Sache.
Suche nach Material zur Herstellung von Knöpfen
müssen wir alle diese Codes in einem Panel kombinierenBegrenzen Sie die Anzahl der gleichzeitig offenen Aufträge.
Bestimmen Sie das Kursminimum und -maximum für den vom Benutzer angegebenen Zeitraum (zum Beispiel von 00-00 bis 02-00). Kaufen: der Kurs ist unter das Minimum der Kerze gefallen, verkaufen: der Kurs ist über das Maximum gestiegen. Bei einer offenen Position werden keine neuen Transaktionen eröffnet. Wir schließen die Position zu einem bestimmten Zeitpunkt (ebenfalls vom Benutzer festgelegt, sagen wir um 22-00 Uhr) oder um SL\TP (vom Benutzer festgelegt).
Die Frage ist, wie man dieses Minimum und Maximum in der Zeitperiode tatsächlich definiert. Und der EA kann den Handel nicht vor dem Ende des vom Benutzer angegebenen Zeitraums (in dem das Minimum und das Maximum gesucht werden) beginnen. Und wie die Anzahl der Bestellungen zu verfolgen (so dass sie nicht mehr als eine)?
Wer weiß, wo zu graben und wo für sie zu suchen, danke im Voraus. Wenn jemand mit dem Code helfen kann, wäre das großartig.
Hallo, mir wurde die Aufgabe gestellt , einen EA zu schreiben, der wie folgt handelt:
Bestimmen Sie das Kursminimum und -maximum für den vom Benutzer angegebenen Zeitraum (zum Beispiel von 00-00 bis 02-00). Kaufen: der Kurs ist unter das Minimum der Kerze gefallen, verkaufen: der Kurs ist über das Maximum gestiegen. Bei einer offenen Position werden keine neuen Transaktionen eröffnet. Wir schließen die Position zu einem bestimmten Zeitpunkt (ebenfalls vom Benutzer festgelegt, sagen wir um 22-00 Uhr) oder um SL\TP (vom Benutzer festgelegt).
Die Frage ist, wie man dieses Minimum und Maximum in der Zeitperiode tatsächlich definiert. Und der EA kann den Handel nicht vor dem Ende des vom Benutzer angegebenen Zeitraums (in dem das Minimum und das Maximum gesucht werden) beginnen. Und wie die Anzahl der Bestellungen zu verfolgen (so dass sie nicht mehr als eine)?
Wer weiß, wo zu graben und wo für sie zu suchen, danke im Voraus. Wenn jemand mit dem Code helfen kann, wäre das großartig.
Ist dies eine Semesterarbeit?
Hallo zusammen, ich hatte die Aufgabe , einen Expert Advisor zu schreiben , der wie folgt handelt:
Wir ermitteln die Mindest- und Höchstpreise für den vom Benutzer angegebenen Zeitraum (z. B. von 00-00 bis 02-00). Kaufen: Bei der Kerze ging der Preis über das Tief hinaus, Verkaufen: Der Preis ging über das Hoch hinaus. Mit einer offenen Position eröffnen wir keine neuen Geschäfte. Wir schließen die Position zur angegebenen Zeit (ebenfalls vom Benutzer angegeben, sagen wir um 22-00) oder per SL \ TP (vom Benutzer angegeben).
Die Frage ist, wie kann man dieses Minimum und Maximum für einen bestimmten Zeitraum tatsächlich bestimmen? Darüber hinaus kann der Berater den Handel nicht vor Ablauf der vom Benutzer angegebenen Zeit beginnen (wobei das Minimum und Maximum gesucht werden). Und wie kann man die Anzahl der Bestellungen verfolgen (damit es nicht mehr als eine gibt)?
Wer sagt Ihnen, wo Sie graben und wo Sie suchen müssen, danke im Voraus. Wenn jemand mit dem Code helfen kann, wäre das großartig.
Schnell skizziert bleiben, ohne besondere Kontrollen, das reicht für den Tester.
//| 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 );
}
//+------------------------------------------------------------------+
...