if 식 ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE)))
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
if 식 ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE)))
안녕하세요 여러분, 저는 다음과 같이 거래 되는 Expert Advisor를 작성하는 임무를 받았습니다. 사용자가 지정한 기간(예: 00-00에서 02-00까지) 동안 최소 및 최대 가격을 결정합니다. 매수: 양초에서 가격이 저점 위로 올랐습니다. 매도: 가격이 고점 위로 올랐습니다. 열린 위치에서 우리는 새로운 거래를 열지 않습니다. 우리는 지정된 시간(사용자가 지정, 22-00에 지정) 또는 SL \ TP(사용자 지정)로 포지션을 마감합니다.
문제는 일정 기간 동안 이 최소값과 최대값을 실제로 결정하는 방법입니다. 또한, 어드바이저는 사용자가 지정한 시간(최소값과 최대값이 검색되는)이 종료되기 전에는 거래를 시작할 수 없습니다. 그리고 주문 수를 추적하는 방법(하나 이상이 없도록)?
파기할 곳과 볼 곳을 알려줄 사람, 미리 감사드립니다. 누군가 코드를 도와줄 수 있다면 정말 좋을 것입니다.
Anarchist : 안녕하세요 여러분, 저는 다음과 같이 거래 되는 Expert Advisor를 작성하는 임무를 받았습니다. 사용자가 지정한 기간(예: 00-00에서 02-00까지) 동안 최소 및 최대 가격을 결정합니다. 매수: 양초에서 가격이 저점 위로 올랐습니다. 매도: 가격이 고점 위로 올랐습니다. 열린 위치에서 우리는 새로운 거래를 열지 않습니다. 우리는 지정된 시간(사용자가 지정, 22-00에 지정) 또는 SL \ TP(사용자 지정)로 포지션을 마감합니다.
문제는 일정 기간 동안 이 최소값과 최대값을 실제로 결정하는 방법입니다. 또한, 어드바이저는 사용자가 지정한 시간(최소값과 최대값이 검색되는)이 종료되기 전에는 거래를 시작할 수 없습니다. 그리고 주문 수를 추적하는 방법(하나 이상이 없도록)?
파기할 곳과 볼 곳을 알려줄 사람, 미리 감사드립니다. 누군가 코드를 도와줄 수 있다면 정말 좋을 것입니다.
Anarchist : 안녕하세요 여러분, 저는 다음과 같이 거래 되는 Expert Advisor를 작성하는 임무를 받았습니다. 사용자가 지정한 기간(예: 00-00에서 02-00까지) 동안 최소 및 최대 가격을 결정합니다. 매수: 양초에서 가격이 저점을 넘어 매도: 가격이 고점을 넘어섰습니다. 열린 위치에서 우리는 새로운 거래를 열지 않습니다. 우리는 지정된 시간(사용자가 지정, 22-00에 지정) 또는 SL \ TP(사용자 지정)로 포지션을 마감합니다.
문제는 일정 기간 동안 이 최소값과 최대값을 실제로 결정하는 방법입니다. 또한, 어드바이저는 사용자가 지정한 시간(최소값과 최대값이 검색되는)이 종료되기 전에는 거래를 시작할 수 없습니다. 그리고 주문 수를 추적하는 방법(하나 이상이 없도록)?
파기할 곳과 볼 곳을 알려줄 사람, 미리 감사드립니다. 누군가가 코드를 도울 수 있다면 좋을 것입니다.
미결 주문 수에 대한 제한을 추가해야 합니다.
코드 작성을 도와주세요.
미결 주문 수에 제한을 추가해야 합니다.
코드가 어떻게 작동하고 제한을 두어야 할까요?
-------------------------------------------------- --------------------
그건 그렇고, 누가 그 이유를 설명 할 것입니다. 데이터의 가치에 대해
if 식 (( AccountInfoDouble (ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE)))
true를 반환
목표는 큰 변동을 줄이는 것입니다
그리고 마침내.
버튼을 만드는 재료를 찾고 있습니다.
이 모든 코드를 패널로 결합해야 합니다.코드가 어떻게 작동하고 제한을 두는가?
-------------------------------------------------- --------------------
그건 그렇고, 누가 왜 데이터의 가치에 대해 설명 할 것입니까?
if 식 ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE)))
true를 반환
목표는 큰 변동을 줄이는 것입니다
그리고 마침내.
버튼을 만드는 재료를 찾고 있습니다.
이 모든 코드를 패널로 결합해야 합니다.코드가 어떻게 작동하고 제한을 두는가?
-------------------------------------------------- --------------------
그건 그렇고, 누가 왜 데이터의 가치에 대해 설명 할 것입니까?
if 식 ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE)))
true를 반환
목표는 큰 변동을 줄이는 것입니다
그리고 마침내.
버튼을 만드는 재료를 찾고 있습니다.
이 모든 코드를 패널로 결합해야 합니다.동시에 열려 있는 주문의 수를 제한합니다.
사용자가 지정한 기간(예: 00-00에서 02-00까지) 동안 최소 및 최대 가격을 결정합니다. 매수: 양초에서 가격이 저점 위로 올랐습니다. 매도: 가격이 고점 위로 올랐습니다. 열린 위치에서 우리는 새로운 거래를 열지 않습니다. 우리는 지정된 시간(사용자가 지정, 22-00에 지정) 또는 SL \ TP(사용자 지정)로 포지션을 마감합니다.
문제는 일정 기간 동안 이 최소값과 최대값을 실제로 결정하는 방법입니다. 또한, 어드바이저는 사용자가 지정한 시간(최소값과 최대값이 검색되는)이 종료되기 전에는 거래를 시작할 수 없습니다. 그리고 주문 수를 추적하는 방법(하나 이상이 없도록)?
파기할 곳과 볼 곳을 알려줄 사람, 미리 감사드립니다. 누군가 코드를 도와줄 수 있다면 정말 좋을 것입니다.
안녕하세요 여러분, 저는 다음과 같이 거래 되는 Expert Advisor를 작성하는 임무를 받았습니다.
사용자가 지정한 기간(예: 00-00에서 02-00까지) 동안 최소 및 최대 가격을 결정합니다. 매수: 양초에서 가격이 저점 위로 올랐습니다. 매도: 가격이 고점 위로 올랐습니다. 열린 위치에서 우리는 새로운 거래를 열지 않습니다. 우리는 지정된 시간(사용자가 지정, 22-00에 지정) 또는 SL \ TP(사용자 지정)로 포지션을 마감합니다.
문제는 일정 기간 동안 이 최소값과 최대값을 실제로 결정하는 방법입니다. 또한, 어드바이저는 사용자가 지정한 시간(최소값과 최대값이 검색되는)이 종료되기 전에는 거래를 시작할 수 없습니다. 그리고 주문 수를 추적하는 방법(하나 이상이 없도록)?
파기할 곳과 볼 곳을 알려줄 사람, 미리 감사드립니다. 누군가 코드를 도와줄 수 있다면 정말 좋을 것입니다.
이것은 기말 논문입니까?
안녕하세요 여러분, 저는 다음과 같이 거래 되는 Expert Advisor를 작성하는 임무를 받았습니다.
사용자가 지정한 기간(예: 00-00에서 02-00까지) 동안 최소 및 최대 가격을 결정합니다. 매수: 양초에서 가격이 저점을 넘어 매도: 가격이 고점을 넘어섰습니다. 열린 위치에서 우리는 새로운 거래를 열지 않습니다. 우리는 지정된 시간(사용자가 지정, 22-00에 지정) 또는 SL \ TP(사용자 지정)로 포지션을 마감합니다.
문제는 일정 기간 동안 이 최소값과 최대값을 실제로 결정하는 방법입니다. 또한, 어드바이저는 사용자가 지정한 시간(최소값과 최대값이 검색되는)이 종료되기 전에는 거래를 시작할 수 없습니다. 그리고 주문 수를 추적하는 방법(하나 이상이 없도록)?
파기할 곳과 볼 곳을 알려줄 사람, 미리 감사드립니다. 누군가가 코드를 도울 수 있다면 좋을 것입니다.
특별한 확인 없이 빠르게 스케치를 유지하면 테스터에게 도움이 됩니다.
//| 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 );
}
//+------------------------------------------------------------------+
...