Скрипт, реагирующий на показатели индикатора

 

Добрый день!

Недавно (не помню где) нашел интересный индикатор. Этот индикатор закомпилирован - раскодировать сам не могу. Но суть не в этом.
Индикатор имеет три состояния - "Ждем" "Покупаем" "Продаем". Если вручную следовать ему, то очень много времени уходит на реагирование и дальнейшее открытие новых ордеров и закрытие текущих.

От чего возникла задача, которую хочу решить. И если товарищи гуру не будут против - то с вашей помощью/подсказками/пинками :)

1. Для начала хотел бы просто написать скрипт, который бы закрывал текущий ордер и открывал новый в противоположную сторону.
Вопрос - подскажите, раздел(-ы) на сайте, где можно глянуть спецификацию - пока нашел мало.

2. Далее хотел бы написать советника (или скорее - помощника), который бы регировал на показания индикатора. Но так как сам индикатор закомпилирован - вытянуть переменные оттуда не знаю как.
Ниже приведу скриншоты того, что выдает индикатор.

Это окошко настройки параметров:

А это сигнальное окошко:


А это окошко терминала с работающим там индикатором. Он, конечно, как и всё автоматическое, далеко не всегда показывает реальное положение дел :)


Это первый опыт - хочу сделать в качестве тренировки - интересна тема, авось, что и получится.

Всем откликнувшимся заранее огромное спасибо за уделенное время! :)

 
mookmo:

1. Для начала хотел бы просто написать скрипт, который бы закрывал текущий ордер и открывал новый в противоположную сторону.
Вопрос - подскажите, раздел(-ы) на сайте, где можно глянуть спецификацию - пока нашел мало.


Учебник MQL4 - https://book.mql4.com/ru/

Документация - https://docs.mql4.com/ru/

 

"Авось" - это наше все. Но ничего не получится. )))

 

Спасибо abolk :)

Итак - первый результат.. Но не работающий... Скрипт, который должен закрывать ордер и открывать новый в противоположную сторону.

extern double Lots = 0.01;
int order_type;

for (int i=0; i<OrdersTotal(); i++)
{
if((OrderSelect(i,SELECT_BY_POS)==true)
{
double ocp=OrderClosePrice();
order_type=OrderType();
OrderClose(i,Lots,ocp,3,CLR_NONE);
}
}

if (OrderTotal()==0 || order_type=OP_BUY)
{
OrderSend(EURUSDm,OP_SELL,Lots,Bid,3,0,0,"My order #"+counter,16384,0,Red);

}

if (OrderTotal()==0 || order_type=OP_SELL)
{
OrderSend(EURUSDm,OP_BUY,Lots,Ask,3,0,0,"My order #"+counter,16384,0,Green);

}

 

Как раз присматриваюсь к этому индикатору, а тут смотрю я не один :-))

 

Чуствую, что я где-то уже близко. Если не трудно - укажите на ошибки - почему не запускается скрипт? :)

double price;
bool result;
int order_type;

int init() {return(0);}


int start()
{
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
{
order_type=OrderType();
if(order_type==OP_BUY) price=Bid; else price=Ask;
result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}

if (order_type==OP_BUY) OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"",16384,0,Red); else OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"",16384,0,Green);
return;
}

int deinit(0) {return(0);}

 

Ура! Удалось запустить скрипт:

#property copyright "Copyright © 2010, mookmo"
#property link "http://www.net.net.net.da/"
#property show_confirm

int start()
{
double price;
bool result;
int order_type,error;

if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
{
order_type=OrderType();
if(order_type==OP_BUY) price=Bid; else price=Ask;
OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
// if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
// else error=0;
// if(error==135) RefreshRates();
// else break;
}
if (order_type==OP_BUY) OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"",16384,0,Red); else OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"",16384,0,Green);
return(0);

}


Компилятор ругался на break; - почему? хз... можт кто подскажет?

 
mookmo:

Ура! Удалось запустить скрипт:



Компилятор ругался на break; - почему? хз... можт кто подскажет?


Оператор break; используется только в цикле. (Поставь курсор на этот оператор и нажми F1, в справке всё понятно расписано.)

Во втором примере Вы его закомментировали и компиляция прошла успешно.

 
SEVER11:

Как раз присматриваюсь к этому индикатору, а тут смотрю я не один :-))


Ато :) А какие у тебя параметры? И за что они отвечают, если не секрет :)


lasso:

Оператор break; используется только в цикле. (Поставь курсор на этот оператор и нажми F1, в справке всё понятно расписано.)

Во втором примере Вы его закомментировали и компиляция прошла успешно.

Собственно для этого и закомментировал, чтобы прошла успешно :) Спасибо за подсказку.
 

Ксати, парни, сможет ли кто-то направить меня по второму вопросу - перехвату сообщений от индикатора?

Теоретически, если не получится найти переменную, которая отвечает за это или функцию - можно сделать разбор строки и взять нужное оттуда :)

Это как обходной вариант.

Причина обращения: