Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Или вы можете запустить счетчик после обнаружения перетаскивания, есть много способов сделать это..,
(Я просто "имею"один способ, который пока что делает это для меня - этот способ в вашем последнем комментарии).
Мистер Марко, вы спасли мой день, большое спасибо.
Пока нет, но я попробую позже, я хочу добавить дополнительно несколько функций к этим ' SL и TP ' функциям. Мне просто очень нужно изучить много вещей об этом, прежде чем я начну писать скрипт для этого.
Всего вам наилучшего!
Если я правильно помню - я видел давным-давно один советник "Order Modifier", который работал так: он не обновлялся при перетаскивании, когда я "Drag OFF" перетаскивал линию, после перетаскивания и затем " Stop Loss и Take Profit " значения могли измениться только один раз.
Поэтому я три и более раз прочитал ваш последний комментарий, а также попытался изменить немного больше, чтобы я мог остановить обновления во время перетаскивания.
Вопрос: Так это невозможно, пожалуйста?
Заранее спасибо.
Ну, пока флаг boolean drag == 1, вы можете использовать этот же флаг для отключения обновлений.
Как я уже сказал, вы также можете запустить счетчик, вот пример:
//| Drag Hline2.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
double price;
bool drag;
int cnt=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(1);
ObjectCreate(0,"line",OBJ_HLINE,0,0,Ask);
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
if(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
{
drag=1;
}
if(drag==1)
{
cnt++; // increase counter
{
if(cnt>=2)// if counter == 2 seconds
{
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0); // store new value
Print(" New price: ",DoubleToString(price));
PlaySound("ok.wav");
cnt=0; // reset counter
drag=0; // reset drag
}
}
}
}
//+------------------------------------------------------------------+
Или просто использовать цикл while, который работает очень хорошо:
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
{
PlaySound("ok.wav");
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
Comment(price);
}
}
//+------------------------------------------------------------------+
Ну, пока флаг boolean drag == 1, вы можете использовать этот же флаг для отключения обновлений.
Как я уже сказал, вы также можете запустить счетчик, вот пример:
Или просто использовать цикл while, который работает очень хорошо:
Он просто говорит: while (я перетаскиваю) обновляет цену, пока они не станут равны (когда я перестану перетаскивать).
(и ваши коды)
Какие блестящие примеры! Это действительно очень полезный комментарий, спасибо большое. И сейчас я пытаюсь добавить больше вещей для этой линии (конструкции и функции ).
(Пожалуйста, не вините меня за мой вопрос: У меня есть " graphics() ", которую я использую для графических объектов, и я вызываю ее через Init(), а мне нужно вызвать ее через OnTimer(), так что мой вопрос в том, что я делаю неправильно, пожалуйста? )
Всего вам наилучшего!
Вы можете столкнуться с ошибкой 4200 - не удалось создать объект, поскольку он уже существует.
Поэтому необходимо проверить, существует ли объект, прежде чем пытаться (повторно) создать или изменить его.
Вы можете использовать:
{
//Object does not exist
}
and/or
if(ObjectFind(0,"Long")>=0)
{
// Object already exists
}
Вы можете использовать:
Хм, это действительно новая функция для меня.
Я могу попробовать после того, как изучу этот вопрос. (Я видел ее много раз, но никогда не использовал для себя).
Спасибо большое.
#Преобразование цены в пиксели - Открыть
Я использую "HLine" для функции Take Profit.
У меня есть несколько объектов (Label, RecLabel... и так далее) и я хотел бы, чтобы эти объекты могли перемещаться с объектом "HLine". Поэтому я нашел нижеприведенную функцию. Но я не хочу конвертировать "X". Я хочу преобразовать только цену в Y.
Я никогда не пробовал ничего делать с приведенным ниже кодом.
Q: Потому что я хочу быть уверен, что это может помочь мне в этом вопросе?
(Если я знаю, что это может мне помочь, тогда я начну пробовать это для моей проблемы).
Q: И есть ли методы для некоторых объектов, которые могут перемещаться с помощью " HLine "?
datetime time = 0; // I just want to ignore this because I just want to give to X = 20; fixed mode ( should not change ever )
double price = ObjectGetDouble( 0, "line", OBJPROP_PRICE, 0 );
int x,y;
ChartTimePriceToXY( long chart_id, int sub_window, datetime time, double price, int& x, int& y );
Заранее спасибо.
Вам придется быть немного более конкретным, вы можете делать многие вещи разными способами.
Эти функции используются в функции OnChartEvent().
ChartPriceToXY - даст вам преобразование времени цены в координаты, это действительно то, что вам нужно?
Может быть, вы имеете в виду ChartXYToTimePrice()?
https://www.mql5.com/en/docs/chart_operations/chartxytotimeprice
Если вам не нужно значение, вы можете просто передать его как ноль, см. пример ниже.
//| CrossHair.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create some lines
ObjectCreate(0,"X",OBJ_HLINE,0,0,Ask); // X = Horizontal Axis (time==0)
ObjectCreate(0,"Y",OBJ_VLINE,0,TimeCurrent(),0);// Y = Vertical Axis (price==0)
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- clean up
ObjectsDeleteAll(0,0,EMPTY);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- If this is an event of a mouse click on the chart
if(id==CHARTEVENT_CLICK)
{
//--- Prepare variables
int x =(int)lparam;
int y =(int)dparam;
datetime time =0;
double price =0;
int window=0;
//--- Convert the X and Y coordinates in terms of date/time
if(ChartXYToTimePrice(0,x,y,window,time,price))
{
ObjectMove(0,"X",0,0,price); // notice time==0 because horizontal axis
ObjectMove(0,"Y",0,time,0); // notice price==0 because vertical axis
}
else
Print("ChartXYToTimePrice return error code: ",GetLastError());
Print("+--------------------------------------------------------------+");
}
}
//+------------------------------------------------------------------+
Я уже читал эту документацию, но до вашего последнего комментария я не мог понять, что это такое. На самом деле, но я еще не пробовал, потому что я борюсь с кодом ниже, я уже пробовал несколько способов для получения хороших результатов, но я не могу.
Г-н Марко, спасибо за ваш последний замечательный комментарий, который я чувствую, что могу использовать его для решения проблемы перемещения объектов.
Я действительно потратил много времени, чтобы найти решение моей проблемы, я не могу получить хорошие результаты.
Но в любом случае я могу получить (в настоящее время открытые позиции) цены тейк-профита, которые я хочу, чтобы объекты "hline" могли вызывать цены тейк-профита к себе, и это работает. И это работает только первые разы. Да, я знаю, потому что это в " Init() ". Но я пытался поместить его в " OnTimer() ", но id не работает правильно.
Пожалуйста, дайте мне знать что-нибудь, что поможет мне понять, что я могу узнать и сделать для решения этой проблемы.
Я начну исследовать этот вопрос снова через 7 часов.
Если я получу хороший комментарий, это будет лучше для меня.
for ( i = OrdersTotal() - 1; i >= 0; i-- )
{
if ( ! OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) continue;
if ( OrderSymbol() == Symbol() ) tpprice = OrderTakeProfit();
ObjectCreate (
"#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
OBJ_HLINE,
0, // subwindow
0, // time
tpprice // price1
);
tpprice =
ObjectGetDouble (
0,
"#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
OBJPROP_PRICE, 0
);
}
// ontimer() --------------------------------------------------------
if ( tpprice != ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 ) )
{
tpdrag = 1;
}
if ( tpdrag == 1 )
{
tpprice = ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 );
Print( "tpdrag: ", tpdrag, " - Price: ", DoubleToString( tpprice, Digits ) );
// actually here is a graphical objects functin()
// here one of them
// also which one soon I will try to below objects could moves together " tphline " - but I can't take a time to research about your latest comment and so...
ObjectCreate( "recl object", OBJ_RECTANGLE, 0, 0, tpprice ); // I feel I could add something to " string name " - I already tried few things not good results
tpdrag = 0;
}
//---
return;
Заранее спасибо.
Всего вам наилучшего!
Пожалуйста, используйте стилизатор, он находится на вкладке Инструменты.
Я понятия не имею, чего вы пытаетесь достичь, поэтому мне приходится гадать, что вы хотите сделать, а это никогда не бывает хорошо.
Но вы можете посмотреть пример здесь:
//| Stealth 4.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
static input int takeprofit=500;// Take Profit
static input int stoploss=500; // Stop Loss
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
for(int order=OrdersTotal(); order>=0; order--)
{
bool selected=OrderSelect(order,SELECT_BY_POS);
{
if(selected==1)
{
if(Symbol()==OrderSymbol()) // only for current chart symbol
{
switch(OrderType())
{
case OP_BUY: // for buy order
{
// if objects not found - create them
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()+takeprofit*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()-stoploss*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
}
// if objects exist
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
{
if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
{
if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
}
break;
case OP_SELL: // for sell order
{
// if objects not found - create them
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()-takeprofit*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()+stoploss*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
}
// if objects exist
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
{
if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
{
if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
}
break;
}
}
}
}
}
}
//+------------------------------------------------------------------+
Итак, вы видите, что вы можете использовать ObjectGetDouble напрямую, нет необходимости копировать значение в другой double, потому что объект сам хранит значение, и когда вы перетаскиваете линию, значение автоматически меняется, и будет видно при следующем чтении.