Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//| Stoploss.mq4 |
//| Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create object
BitmapLabelCreate(
0, // chart's ID
"BmpLabel", // label name
0, // subwindow index
20, // X coordinate
20, // Y coordinate
"\\Images\\on.bmp", // image in On mode
"\\Images\\off.bmp", // image in Off mode
0, // visibility scope X coordinate
0, // visibility scope Y coordinate
0, // visibility scope shift by X axis
0, // visibility scope shift by Y axis
0, // pressed/released
CORNER_LEFT_UPPER, // chart corner for anchoring
ANCHOR_LEFT_UPPER, // anchor type
clrRed, // border color when highlighted
STYLE_SOLID, // line style when highlighted
1, // move point size
false, // in the background
false, // highlight to move
true, // hidden in the object list
0); // priority for mouse click
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(ObjectGetInteger(0,"BmpLabel",OBJPROP_STATE)==true)
{
Print("Stoploss active");
// Do Something...
}
if(ObjectGetInteger(0,"BmpLabel",OBJPROP_STATE)==false)
{
Print("Stoploss inactive");
// Do Something...
}
}
//+------------------------------------------------------------------+
//| Create Bitmap Label object |
//+------------------------------------------------------------------+
bool BitmapLabelCreate(const long chart_ID=0, // chart's ID
const string name="BmpLabel", // label name
const int sub_window=0, // subwindow index
const int x=0, // X coordinate
const int y=0, // Y coordinate
const string file_on="", // image in On mode
const string file_off="", // image in Off mode
const int width=0, // visibility scope X coordinate
const int height=0, // visibility scope Y coordinate
const int x_offset=10, // visibility scope shift by X axis
const int y_offset=10, // visibility scope shift by Y axis
const bool state=false, // pressed/released
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // chart corner for anchoring
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // anchor type
const color clr=clrRed, // border color when highlighted
const ENUM_LINE_STYLE style=STYLE_SOLID, // line style when highlighted
const int point_width=1, // move point size
const bool back=false, // in the background
const bool selection=false, // highlight to move
const bool hidden=true, // hidden in the object list
const long z_order=0) // priority for mouse click
{
//--- reset the error value
ResetLastError();
//--- create a bitmap label
if(!ObjectCreate(chart_ID,name,OBJ_BITMAP_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": failed to create \"Bitmap Label\" object! Error code = ",GetLastError());
return(false);
}
//--- set the images for On and Off modes
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,0,file_on))
{
Print(__FUNCTION__,
": failed to load the image for On mode! Error code = ",GetLastError());
return(false);
}
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,1,file_off))
{
Print(__FUNCTION__,
": failed to load the image for Off mode! Error code = ",GetLastError());
return(false);
}
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); //--- set label coordinates
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); //--- set visibility scope for the image; if width or height values
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset); //--- set the part of an image that is to be displayed in the visibility scope
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); //--- define the label's status (pressed or released)
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); //--- set the chart's corner, relative to which point coordinates are defined
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); //--- set anchor type
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- set the border color when object highlighting mode is enabled
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- set the border line style when object highlighting mode is enabled
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width); //--- set a size of the anchor point for moving an object
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- display in the foreground (false) or background (true)
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);//--- enable (true) or disable (false) the mode of moving the label by mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- hide (true) or display (false) graphical object name in the object list
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- set the priority for receiving the event of a mouse click in the chart
return(true); //--- successful execution
}
//+------------------------------------------------------------------+
//| Stoploss.mq4 |
//| Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
bool use_stoploss; // stoploss flag
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create object
BitmapLabelCreate(
0, // chart's ID
"BmpLabel", // label name
0, // subwindow index
20, // X coordinate
20, // Y coordinate
"\\Images\\on.bmp", // image in On mode
"\\Images\\off.bmp", // image in Off mode
0, // visibility scope X coordinate
0, // visibility scope Y coordinate
0, // visibility scope shift by X axis
0, // visibility scope shift by Y axis
0, // pressed/released
CORNER_LEFT_UPPER, // chart corner for anchoring
ANCHOR_LEFT_UPPER, // anchor type
clrRed, // border color when highlighted
STYLE_SOLID, // line style when highlighted
1, // move point size
false, // in the background
false, // highlight to move
true, // hidden in the object list
0); // priority for mouse click
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- check stoploss
CheckStoplossState();
if(use_stoploss==0)
{
// Do something...
}
if(use_stoploss==1)
{
// Do Something else...
}
}
//+------------------------------------------------------------------+
//| Check Stoploss state |
//+------------------------------------------------------------------+
void CheckStoplossState()
{
if(ObjectGetInteger(0,"BmpLabel",OBJPROP_STATE)==true)
{
if(use_stoploss==0)
{
Alert("Stoploss active");
use_stoploss=1;
}
}
if(ObjectGetInteger(0,"BmpLabel",OBJPROP_STATE)==false)
{
if(use_stoploss==1)
{
Alert("Stoploss inactive");
use_stoploss=0;
}
}
}
//+------------------------------------------------------------------+
//| Create Bitmap Label object |
//+------------------------------------------------------------------+
bool BitmapLabelCreate(const long chart_ID=0, // chart's ID
const string name="BmpLabel", // label name
const int sub_window=0, // subwindow index
const int x=0, // X coordinate
const int y=0, // Y coordinate
const string file_on="", // image in On mode
const string file_off="", // image in Off mode
const int width=0, // visibility scope X coordinate
const int height=0, // visibility scope Y coordinate
const int x_offset=10, // visibility scope shift by X axis
const int y_offset=10, // visibility scope shift by Y axis
const bool state=false, // pressed/released
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // chart corner for anchoring
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // anchor type
const color clr=clrRed, // border color when highlighted
const ENUM_LINE_STYLE style=STYLE_SOLID, // line style when highlighted
const int point_width=1, // move point size
const bool back=false, // in the background
const bool selection=false, // highlight to move
const bool hidden=true, // hidden in the object list
const long z_order=0) // priority for mouse click
{
//--- reset the error value
ResetLastError();
//--- create a bitmap label
if(!ObjectCreate(chart_ID,name,OBJ_BITMAP_LABEL,sub_window,0,0))
{
Print(__FUNCTION__,
": failed to create \"Bitmap Label\" object! Error code = ",GetLastError());
return(false);
}
//--- set the images for On and Off modes
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,0,file_on))
{
Print(__FUNCTION__,
": failed to load the image for On mode! Error code = ",GetLastError());
return(false);
}
if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,1,file_off))
{
Print(__FUNCTION__,
": failed to load the image for Off mode! Error code = ",GetLastError());
return(false);
}
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); //--- set label coordinates
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); //--- set visibility scope for the image; if width or height values
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset); //--- set the part of an image that is to be displayed in the visibility scope
ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); //--- define the label's status (pressed or released)
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); //--- set the chart's corner, relative to which point coordinates are defined
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); //--- set anchor type
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- set the border color when object highlighting mode is enabled
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- set the border line style when object highlighting mode is enabled
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width); //--- set a size of the anchor point for moving an object
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- display in the foreground (false) or background (true)
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);//--- enable (true) or disable (false) the mode of moving the label by mouse
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- hide (true) or display (false) graphical object name in the object list
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- set the priority for receiving the event of a mouse click in the chart
return(true); //--- successful execution
}
//+------------------------------------------------------------------+
Или вы можете поместить его в самостоятельную функцию.
Я поместил его в функцию OnTick(), но в конечном итоге вы, возможно, захотите запустить его в функции таймера, потому что теперь он должен получить тик, чтобы изменить состояние, и если вы разместите ордер до поступления нового тика, он все еще будет иметь старое состояние, что может быть нежелательно, но опять же, таймер не работает в тестере, так что это лучше для целей тестирования, но в конечном итоге переключение состояний в функции таймера будет намного быстрее и будет работать, когда рынок закрыт и нет входящих тиков, просто помните об этом, потому что вы не хотите в конечном итоге спросить себя, почему он не работает, чтобы обнаружить, что это только потому, что нет входящих тиков.
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- check stoploss
CheckStoplossState();
if(use_stoploss==0)
{
// Do something...
}
if(use_stoploss==1)
{
// Do Something else...
}
}
//+------------------------------------------------------------------+
//| Check Stoploss state |
//+------------------------------------------------------------------+
void CheckStoplossState()
{
if(ObjectGetInteger(0,"BmpLabel",OBJPROP_STATE)==true)
{
if(use_stoploss==0)
{
Alert("Stoploss active");
use_stoploss=1;
}
}
if(ObjectGetInteger(0,"BmpLabel",OBJPROP_STATE)==false)
{
if(use_stoploss==1)
{
Alert("Stoploss inactive");
use_stoploss=0;
}
}
}
Или вы можете поместить его в самостоятельную функцию.
Я поместил его в функцию OnTick(), но в конечном итоге вы, возможно, захотите запустить его в функции таймера, потому что теперь он должен получить тик, чтобы изменить состояние, и если вы разместите ордер до поступления нового тика, он все еще будет иметь старое состояние, что может быть нежелательно, но опять же, таймер не работает в тестере, так что это лучше для целей тестирования, но в конечном итоге переключение состояний в функции таймера будет намного быстрее и будет работать, когда рынок закрыт и нет входящих тиков, просто помните об этом, потому что вы не хотите в конечном итоге спросить себя, почему он не работает, чтобы обнаружить, что это только потому, что нет входящих тиков.
Блин, я пока не пробую, чувствую, что ваши 2 комментария доработают эту часть кода моего советника.
Огромная благодарность, вы правильно меня поняли.
Еще одно большое спасибо, я решил свой вопрос с вашей помощью.
Могу ли я использовать OnChartEvent() вместо OnTick(), возможно ли это?
Я уже попробовал, пока не вижу проблем, но вы использовали функцию OnTick() , просто я хочу быть уверенным.
@Marco просто я хочу спросить, есть ли что-то неправильное о местах изображения, потому что когда Off ( / False / 1 ) Stop Loss активен, а когда On ( / True / 0 ) Stop Loss неактивен. ( Просто я бы не хотел ничего менять, эта битовая карта очень опасна для меня, без шуток - я вижу, что это все еще занимает много времени от меня )
Также я хочу спросить, прежде чем начать пробовать, есть ли какие-нибудь специфические вещи, которые нужно использовать в глобальных переменных для объекта Bitmap Label? (причина моего вопроса - я просто вижу, что для Bitmap Label Object нужно что-то совсем другое, чем для других... и так далее)
Заранее спасибо.
Нет, вы можете просто следовать документации.
И да, его можно использовать в OnChartEvent(), но помните, что вы не можете включить, например, код trailingstop, потому что он будет выполняться только один раз, когда вы нажмете на него.
Что касается проблемы с растровыми изображениями, перейдите в папку и переименуйте on в onOLD, затем переименуйте off в on, а затем переименуйте onOLD в off, это должно решить вашу проблему, просто переименовав оба файла.
Или вы можете использовать эти кнопки ниже.
Я также могу изменить их размер, если вам нужно что-то меньшее.
Переименование сработало для меня, но я чувствую, что должен проверить его еще раз, потому что в вашем коде оно работает правильно.
Глобальные переменные: Я пробовал как ниже код для этого, но никаких результатов, даже я вижу это в окне глобальных переменных.
use_stoploss_gv = _Symbol + "test BmpLabel GV";
if ( GlobalVariableCheck( use_stoploss_gv ) == true )
{
use_stoploss = GlobalVariableGet( use_stoploss_gv );
}
else
{
GlobalVariableSet( use_stoploss_gv, use_stoploss );
}
Вы многое сделали для меня, большое спасибо.
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---Global Variables
string use_stoploss_gv=_Symbol+"test BmpLabel GV";
if(GlobalVariableCheck(use_stoploss_gv)==true)
{
use_stoploss=GlobalVariableGet(use_stoploss_gv);
Print(use_stoploss_gv," Exists");
}
else
{
GlobalVariableSet(use_stoploss_gv,use_stoploss);
Print(use_stoploss_gv," Created");
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
Кажется, работает.
Marco vd Heijden:
Вроде бы работает.
Но он не сохраняет последние изменения.
Например: я добавляю его на график, затем переключаю его на "On", а затем переключаюсь на другой таймфрейм, он возвращает "Off", это не нормально.
И я использую глобальные переменные для других функций 'Lot, Stop Loss, Take Profit', которые прекрасно работают, но эта Bitmap Label не работает.
Пожалуйста, помогите мне или дайте совет, как я могу решить эту проблему с Bitmap Label.
Большое спасибо.
Нижеприведенный код отлично работает после того, как вы мне помогли, спасибо.
И я переименовал, как вы сказали, он работает хорошо, но мне просто интересно, делаю ли я что-то неправильно?
(просто я беспокоюсь)
void ordersell()
{
CheckStopLossState();
if ( use_stoploss == 0 )
{ sl = Bid + points_to_change( stoploss * 10 ); }
if ( use_stoploss == 1 )
{ sl = 0; }
OrderSend( ... sl, ... );
return;
}
Заранее спасибо.