Ваши вопросы по языку MQL4

griz

Активный участник
Внутри OnChartEvent() поставь условие
Код:
Expand Collapse Copy
if(id == CHARTEVENT_OBJECT_ENDEDIT)
 {
 // тут что надо выполнять по окончанию редактирования текста в поле ввода
 }
Тут вот еще какое дело: Под объектом OBJ_EDIT находится объект OBJ_HLINE(он выделен для перемещения). И как раз из-за этой выделенной линии выполняется событие CHARTEVENT_OBJECT_DRAG("Перетаскивание графического объекта").

Но мне нужно, чтобы сначала срабатывало событие CHARTEVENT_OBJECT_CLICK(Нажатие мышки на графическом объекте). Т.к. в событии CHARTEVENT_OBJECT_DRAG находятся пользовательские ф-и, которые в холостую выполняются и могут даже мешать.

В общем не знаю как объяснить, прикрепляю файл. Нужно чтобы при изменении текста в объекте OBJ_EDIT, срабатывало сначала событие CHARTEVENT_OBJECT_CLICK(Нажатие мышки на графическом объекте).
 

Вложения

  • 123.mq4
    123.mq4
    26,6 КБ · Просмотры: 13

AlexeyVik

Программист mql4 mql5
Тут вот еще какое дело: Под объектом OBJ_EDIT находится объект OBJ_HLINE(он выделен для перемещения). И как раз из-за этой выделенной линии выполняется событие CHARTEVENT_OBJECT_DRAG("Перетаскивание графического объекта").

Но мне нужно, чтобы сначала срабатывало событие CHARTEVENT_OBJECT_CLICK(Нажатие мышки на графическом объекте). Т.к. в событии CHARTEVENT_OBJECT_DRAG находятся пользовательские ф-и, которые в холостую выполняются и могут даже мешать.

В общем не знаю как объяснить, прикрепляю файл. Нужно чтобы при изменении текста в объекте OBJ_EDIT, срабатывало сначала событие CHARTEVENT_OBJECT_CLICK(Нажатие мышки на графическом объекте).
Я чужие коды не правлю. Всё что сказано, уже достаточно чтобы догадаться и дополнить условие sparam == имя_объекта и изменить id события. В общем, дерзай и всё получится.
 

mobidik

-----
Тут вот еще какое дело
Вот Вы определяете, что есть клик по объекту - а по какому именно?
А для этого есть параметр sparam - фильтруйте по какому именно объекту был клик.
А на счет того, что срабатывает один объект под другим - так при создании таких объектов нужно задавать приоритет на нажатие мышкой.
 

Абдулхаким

Почетный гражданин
мне нужно, чтобы сначала срабатывало событие CHARTEVENT_OBJECT_CLICK(Нажатие мышки на графическом объекте). Т.к. в событии CHARTEVENT_OBJECT_DRAG находятся пользовательские ф-и, которые в холостую выполняются и могут даже мешать.
На лицо очерёдность обработки событий. И если OBJECT_DRAG в этой очереди стоит раньше OBJECT_CLICK, то ничего с этим не сделать :)
Остаётся только внутри OBJECT_DRAG прописывать условия на игнор (например сравни цену линии до и во время клика)
 

ZNV

Активный участник
Подскажите что делать...
Советник работает на счету хорошо... но, в 1 из 50ти раз что то глючит и значение Stohastik вместо истинного 5 допустим показывает 92....

Stohastik = MathRound(iStochastic(pr,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN,1));

if( Stohastik<minST && Stohastik!=0 && Stohastik>0 )
{
..... ордер
}


уже не знаю что думать. Каждый 20й-30й вход с какими то неадекватными параметрами... (((

Может ему дать остановку секунду, типо нагрузка на память и подглючивание? Или это бред?
 

mobidik

-----
Подскажите что делать...
Советник работает на счету хорошо... но, в 1 из 50ти раз что то глючит и значение Stohastik вместо истинного 5 допустим показывает 92....

Stohastik = MathRound(iStochastic(pr,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN,1));

if( Stohastik<minST && Stohastik!=0 && Stohastik>0 )
{
..... ордер
}


уже не знаю что думать. Каждый 20й-30й вход с какими то неадекватными параметрами... (((

Может ему дать остановку секунду, типо нагрузка на память и подглючивание? Или это бред?
А откуда знаете, что именно находится в переменной Stohastik?
Ф-ция MathRound тут ни к чему, да и по условию: если Stohastik>0, то никак не может быть равным 0, проверка Stohastik!=0 лишняя. Надо полагать, что в переменной minST находиться значение уровня - правильно было отслеживать сам факт пересечения уровня, а не выше/ниже него, но, все зависит от самой задумки на вход... Что бы точно знать что же находится в переменной Stohastik на момент установки позиции: если позиция установилась - выведете в принт её значение.
 

AlexeyVik

Программист mql4 mql5
А откуда знаете, что именно находится в переменной Stohastik?
Ф-ция MathRound тут ни к чему, да и по условию: если Stohastik>0, то никак не может быть равным 0, проверка Stohastik!=0 лишняя. Надо полагать, что в переменной minST находиться значение уровня - правильно было отслеживать сам факт пересечения уровня, а не выше/ниже него, но, все зависит от самой задумки на вход... Что бы точно знать что же находится в переменной Stohastik на момент установки позиции: если позиция установилась - выведете в принт её значение.
Я думаю это следствие попыток исправить ошибку дополнительными условиями. Шкала стохастика от 0 до 100, но ни 0 ни 100 я ни разу не встречал. Думаю оба эти условия абсолютно бесполезны.
 

ZNV

Активный участник
Вот я написал функцию проверки - выставлялся ли ранее ордер по этой цене...

А в МТ4 в тестере оно не будет работать я так понимаю?

Как енто можно запустить проверить?
 

mobidik

-----
Вот я написал функцию проверки - выставлялся ли ранее ордер по этой цене...

А в МТ4 в тестере оно не будет работать я так понимаю?

Как енто можно запустить проверить?
Не верно, все работает:
C-подобный:
Expand Collapse Copy
   int ticket = OrderSend(...);
  if(ticket>0)
   {
     Print("Установлена позиция ...."," / сигнал от индикатора \"Stohastik\" - ",DoubleToStr(Stohastik,1));
   }else{
     Print("Ошибка установки позиции - ",GetLastError());
   }
Если в тестере, смотреть в закладке "Журнал".
 

ZNV

Активный участник
Не верно, все работает..
Вот такого типа код... в тестере никак не реагирует..

C-подобный:
Expand Collapse Copy
int vtoroi_order( string Symbl, int type, double sl, double tp, double minPrice, double maxPrice ) //-- 0 - Покупка / 1 - Продажа
{
   for(int p=OrdersHistoryTotal()-1;p>=0;p--)
   {
      f = OrderSelect(p,SELECT_BY_POS,MODE_HISTORY);
      
      if( OrderSymbol()==Symbl && OrderType()==type && OrderStopLoss()==sl && OrderTakeProfit()==tp && OrderProfit()<0 )
      {
         if( OrderType()==OP_BUY && Ask>minPrice  && Ask<maxPrice ){ f = OrderSend(Symbol(),OP_BUY,lot,Ask,3,sl,tp,"",0,0,Blue); return(0); }
         if( OrderType()==OP_SELL && Bid>minPrice  && Bid<maxPrice ){ f = OrderSend(Symbol(),OP_SELL,lot,Bid,3,sl,tp,"",0,0,Red); return(1); }
      }
   }
  return(99);
}
 

ZNV

Активный участник
У меня такое чувство что тестер смотрит реальную историю а не ту что сам создает...
 

mobidik

-----
Если стоит задача установить новый ордер после последнего убыточного - тогда проверка на СЛ и ТП не нужна. Вы же не станете устанавливать позицию с точно таким же значение СЛ/ТП? В этот момент времени цена Ask/Bid будет уже совсем в другом месте, а данные значения по СЛ/ТП уже не актуальны. В 5 строке: что за f? Там должна быть проверка условия. Так, что, уберите: OrderStopLoss()==sl && OrderTakeProfit()==tp и будет все норм.
 
  • Like
Реакции: ZNV

ZNV

Активный участник
Если стоит задача установить новый ордер после последнего убыточного - тогда проверка на СЛ и ТП не нужна. Вы же не станете устанавливать позицию с точно таким же значение СЛ/ТП? В этот момент времени цена Ask/Bid будет уже совсем в другом месте, а данные значения по СЛ/ТП уже не актуальны. В 5 строке: что за f? Там должна быть проверка условия. Так, что, уберите: OrderStopLoss()==sl && OrderTakeProfit()==tp и будет все норм.
Да задача такая.
После того как выбило по стоплосу (проверка OrderProfit()<0) ==== >>>> происходит проверка - если цена в диапазоне минимума/максимума, то выставлять идентичный ордер закрытому.
По алгоритму, если выставлен ордер и цена выбита, но вернулась в начальную точку - выставить заново.
 

mobidik

-----
Да задача такая.
После того как выбило по стоплосу (проверка OrderProfit()<0) ==== >>>> происходит проверка - если цена в диапазоне минимума/максимума, то выставлять идентичный ордер закрытому.
По алгоритму, если выставлен ордер и цена выбита, но вернулась в начальную точку - выставить заново.
Что ж, можно и так. А вы уверены в том, что значения, переданы в ф-цию, sl и tp имеют точно такие же значения, как и ранее закрытая позиция по значениям OrderStopLoss()/OrderTakeProfit()?
Представим, что Ваш код работает верно: цена оказалась в нужном диапазоне, определили тип позиции, сл, тп - установили. Спустя время, она закрылась по СЛ, затем цена вернулась в заданный диапазон - повторная установка - закрылись по ТП. Но, спустя время, зона все та же и цена в неё вернулась - так, как среди закрытых поз есть убыточная, которая была открыта в этой зоне - снова ставим новую позу и не важно, что перед этим уже был вход и закрытие по ТП.
И так, если цена находится в нужной зоне - определяем, а есть ли закрытая позиция, цена открытия которой попадает в заданный диапазон - если да, тогда нужно узнать время её закрытия. Если таких позиций будет несколько, нужно выбрать самую последнюю по времени закрытия и только потом определить её профит. Если позиция закрылась в убытке или её цена закрытия меньше или равна цене СЛ (это для бая) - то только тогда ставим новую позицию.
И да, ознакомьтесь в справке на счет ф-ции OrderSend(), особенно там, где примечание, а то, Ваши тестерные работы будут глючить даже на демке.
 
  • Like
Реакции: ZNV

ZNV

Активный участник
Редактировать
А вы уверены в том, что значения, переданы в ф-цию, sl и tp имеют точно такие же значения, как и ранее закрытая позиция по значениям OrderStopLoss()/OrderTakeProfit()?
Да. Они вычисляются по свечам, и поменяться не могут. Иначе будет работать другой сценарий.
Спасибо за ваши ответы! Указали на ошибку с определением последней по времени позиции.
Подправил. Вроде на демке начал давать правильные данные! :D
(y)
 

ZNV

Активный участник
Здравствуйте.
С очередным как..)
Простой код, выхода цены из канала. Канал рисуется индикатором ©Price Border
Ну просто жутко тормозит. Все виснет, иногда терминал приходиться закрывать... ((
Подскажите решение пожалуйста.

Код обработки:
C-подобный:
Expand Collapse Copy
   void start()
   {
     
   double ch1 = iCustom(NULL,PERIOD_M1,"©Price Border",PERIOD_M1,61      ,0,2,0); //-- down
   double ch2 = iCustom(NULL,PERIOD_M1,"©Price Border",PERIOD_M1,61      ,0,1,0); //-- up
 
   double ch1_ = iCustom(NULL,PERIOD_M5,"©Price Border",PERIOD_M5,61      ,0,2,0); //-- down
   double ch2_ = iCustom(NULL,PERIOD_M5,"©Price Border",PERIOD_M5,61      ,0,1,0); //-- up
 
      string result = "";
     
      if( Bid<=ch1 && Bid<=ch1_ )
      {
         result = "buy";
      }  
      if( Bid>=ch2 && Bid>=ch2_ )
      {
         result = "sell";
      }
 
   Comment(result);
     
   }
 

Вложения

vladradon

Программист
Подскажите решение пожалуйста.
Для начала таймфрейм в настройках индикатора задается символьной переменной, а не енумом - нужно вписать М1 и М5 без PERIOD_ (это который в самом индикаторе). В 33-й строке индикатора массив образцов. Либо там вообще пустые кавычки поставь "".
 
  • Like
Реакции: ZNV

ZNV

Активный участник
Для начала таймфрейм в настройках индикатора задается символьной переменной, а не енумом - нужно вписать М1 и М5 без PERIOD_ (это который в самом индикаторе). В 33-й строке индикатора массив образцов. Либо там вообще пустые кавычки поставь "".
Индикатор не мой. Исправил, но это не сильно что то меняет..
 

vladradon

Программист
Индикатор не мой. Исправил, но это не сильно что то меняет..
А М1 и М5 в кавычках?
Вот сделал индюка - все читает без проблем.
C-подобный:
Expand Collapse Copy
   double Ch1=iCustom(_Symbol,PERIOD_M1,"©Price Border","M1",1,0);
   double Ch2=iCustom(_Symbol,PERIOD_M1,"©Price Border","M1",2,0);
   double Ch11=iCustom(_Symbol,PERIOD_M5,"©Price Border","M5",1,0);
   double Ch21=iCustom(_Symbol,PERIOD_M5,"©Price Border","M5",2,0);
С пустыми кавычками вместо М1 и М5 тоже работает нормально.
 
Последнее редактирование:
  • Like
Реакции: ZNV

ZNV

Активный участник
А М1 и М5 в кавычках?
Вот сделал индюка - все читает без проблем.
C-подобный:
Expand Collapse Copy
double Ch1=iCustom(_Symbol,PERIOD_M1,"©Price Border","M1",1,0);
   double Ch2=iCustom(_Symbol,PERIOD_M1,"©Price Border","M1",2,0);
   double Ch11=iCustom(_Symbol,PERIOD_M5,"©Price Border","M5",1,0);
   double Ch21=iCustom(_Symbol,PERIOD_M5,"©Price Border","M5",2,0);
аааа..... вы про это... я не туда смотрел. Спасибо! )
 
Верх