Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#1751


Значит я не въехал... Я думал, что а и б это значения индикатора (может на разных барах). Если из них что-то является ценой и нуждается в проверке на каждом тике, то, естественно, эту проверку надо выносить из блока if (Н4).



Ну да, я так и делал, а показания индикатора записал в глобальную статическую переменную
#1752

Я немного не понял!!!А суть-то вопроса в чём?Ну высчитали мы раз в 4-е часа индикаторы и что дальше?
Нам надо их запоминать или нет?

Если надо то:

static double a = 0;
double a1 = Ваш индикатор №1;
static double b = 0;
double a1 = Ваш индикатор №2;
static datetime newbar = 0;
datetime t = iTime(NULL,PERIOD_H4,0);
if(newbar != t)
{
newbar = t;
if(a != a1) a = a1;
if(b != b1) b = b1;
if(a > b)
{
Ваш ордер
}
}

Если не надо запоминать значения индикаторов то:

double a = 0;
double b = 0;

static datetime newbar = 0;
datetime t = iTime(NULL,PERIOD_H4,0);
if(newbar != t)
{
newbar = t;
if(a > b)
{
Ваш ордер
}
}

Примерно вот так!

Изменено 6 января, 2015 пользователем Konstebl

#1753

Задумка такая - открывается ордер при условии отсутствия открытых ордеров и закрытых ордеров по истории, закрывается по стоп лосу или тейк профиту. после этого в истории появляется запись о закрытом ордере и ордера больше не открываются.
Вроде все сделал по мануалу, ордер открывается, после его закрытия открывается новый!
Уважаемые гуру, помогите разобраться чайнику.
Вот мое "изобретение"

#property copyright ""
#property link ""
#property version ""
#property strict

extern double Lots = 0.1;
extern int TakeProfit = 30;
extern int StopLoss = 30;
extern int Slippage = 2;
extern int Magic = 12345;


int ticket;
double TP, SL;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

Comment(" колличество закрытых ордеров ",CountTradesHistory(),"\n"
" колличество открытых ордеров ",CountTrades());
Sleep (4000);
if (CountTradesHistory() == 0 && CountTrades() == 0)
{
ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Buy", Magic, 0, Blue);
if (ticket > 0)
{
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble (Bid - StopLoss * Point, Digits);
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}
//+------------------------------------------------------------------+
//| Expert function |
//+------------------------------------------------------------------+
int CountTradesHistory()
{
int counthistory = 0;
for (int i = OrdersTotal() - 1; i >= 0; i --)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
counthistory++;
}
}
return (counthistory);
}
//+------------------------------------------------------------------+
int CountTrades()
{
int count = 0;
for (int i = OrdersTotal() - 1; i >= 0; i --)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count++;
}
}
return (count);
}


Буду благодарен за помощь!
Влад

Изменено 7 января, 2015 пользователем VladVM

#1754


Задумка такая - открывается ордер при условии отсутствия открытых ордеров и закрытых ордеров по истории, закрывается по стоп лосу или тейк профиту. после этого в истории появляется запись о закрытом ордере и ордера больше не открываются.
Вроде все сделал по мануалу, ордер открывается, после его закрытия открывается новый!
Уважаемые гуру, помогите разобраться чайнику.

У берите из этой строки if (CountTradesHistory() == 0 && CountTrades() == 0)
это: "CountTradesHistory() == 0 && "
это лишнее. В реальном терминале ордера в истории всегда есть. Первый раз вижу такое...
#1755

Здравствуйте 0ll ! Спасибо за отклик!
В том то и дело, мне надо чтоб при условии не верности "CountTradesHistory() == 0 && " ордера переставали открываться.
я проверял в тестере МТ4 на истории. обнуляю журнал и запускаю, выставляется первый ордер ( if (CountTradesHistory() == 0 && CountTrades() == 0) условие выполняется, ордер открылся)
после закрытия ордера не важно как, в Comment(CountTradesHistory=1,CountTrades=0) прописываются на терминале кратковременно, а ордер открывается снова, т.е. получается как будто условие "if (CountTradesHistory() == 0 && CountTrades() == 0" соблюдено. Не могу понять как так получается!? (по факту CountTradesHistory=1 и CountTrades=0, по условию открытия CountTradesHistory() == 0 && CountTrades() == 0, а ордер открывается)
Если я по Вашему совету удаляю "CountTradesHistory() == 0 && " получается следующее, ордер открывается, после его закрытия открывается новый т.е. тоже что и было, а мне надо, чтоб при наличии ордера в истории именно этого ( скажем "советника") ордера перестали выставляться.

Изменено 7 января, 2015 пользователем VladVM

#1756

Так Вам надо, чтоб советник перестал выставлять ордера? Но всё равно через контроль исторических ордеров - неправильно, т.к. если поставите в итоге бота на реальный счёт - работать не будет. Проще сделать флаг одноразовой операции:

bool flOpenNew = true;
void OnTick()
{
...
if (flOpenNew && CountTrades() == 0)
{
ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Buy", Magic, 0, Blue);
if (ticket > 0)
{
flOpenNew = false;
.... далее Ваш код

#1757

Спасибо, наверно так и сделаю.
Просто хотел далее использовать информацию по крайнему закрытому ордеру в основном алгоритме при, скажем обрыве связи.
Я только начал изучать MQL, хотел набросать простенький советник, в кратце алгоритм таков: открытие первого ордера по индикатору, пусть это БАЙ с лотом 0,1, сработал ТП открывается опять БАЙ с начальным лотом, если первый БАЙ ордер закрылся по СЛ, то открывается СЕЛЛ с удвоенным лотом. СЕЛЛ закрылся по ТП, открывается СЕЛЛ с начальным лотом, а если СЕЛЛ закрылся по СЛ, открывается БАЙ и опять удваивается лот и т.д.
Как то так, может что порекомендуете, как лучше реализовать данный алгоритм. Я хотел использовать данные из истории о крайнем закрытом ордере, но если Вы говорите это не будет работать, то пока не знаю чего делать, буду думать.
А по предыдущему моему описанию проблемы, есть какое либо объяснение поведения написанного мной кода?

Изменено 7 января, 2015 пользователем VladVM

#1758

1. По Вашему алгоритму: это самый простой вид мартингейла. Реализаций множество. На флёте сливает - несколько заходов в (-) и лот становится космическим.
2. Данные из истории нужно использовать в ОнИнит - при запуске/перезапуске советника (в случае проблем с терминалом). В остальных случаях копить данные в переменных. Количество лосей последний тикет и может лот последнего ордера.
3. По Вашему коду - не разбирался. по-идее должен был работать. Надо принты ставить и отслеживать ошибку.

#1759

В коде уже стоят "коменты", просто запустить и посмотреть, хотелось бы понять проблему.
Я понимаю, что это будет не граль, да и не пытаюсь его создать, это так для набития руки!
По Лосям я думал, ввести счетчик и по мере накопления поступательно изменять положение ТП на увеличение, чтоб выйти из канала флета, или ввести остановку работы советника (по накоплению определенного количества ЛОСЕЙ) с последующей ручной оптимизацией и повторным запуском, может еще ввести трал СЛ с выводом в безубыток и далее в ПРОФИТ, ну это еще только задумки,а реализация впереди.
Скорей всего по мере погружения еще будут вопросы, буду признателен, если в дальнейшем поможете мудрым советом в освоении MQL!
С уважением,
Влад

Изменено 8 января, 2015 пользователем VladVM

#1760

Доброго времени суток! Нужна помощь в создании, как мне кажется, несложного индикатора.
Суть вопроса:
Возможно ли сделать индикатор, который бы мог подхватывать на графике нарисованную вручную фигуру: прямоугольник, и растягивать его вслед за графиком, даже желательно чтоб он был впереди графика на свечей 20, пока я его не удалю? а то надоедает каждый раз вручную это делать :)

#1761

Мои познания MQL языка равняется к нулю и столкнулся с такой проблемой как добавить алерт к индикатору, который в свою очередь очень сильно облегчил бы мне мониторинг графика. В общем, прошу вас уважаемые и знающие своё дело программисты добавить алерт к индикатору OsMA_Divergence_v1. Нужно чтобы при появлении дивергенции и серых точек выскакивал алерт-табличка. Думаю есть еще трейдеры которые торгуют на дивергенции цены и данный алерт помог бы многим из нас. Наверняка для вас, программисты, это не составит большого труда, но ваша помощь очень сильно облегчило бы мне мониторинг и торговлю в целом.

.PNG
OsMA_Divergence_v1.mq410 скач.

Изменено 12 января, 2015 пользователем Problematico

#1762

Я думал что в плане графических построений, я самый ленивый трейдер этого форума.....как я ошибался.....браво коллега =d> :))

#1763

Пришлось поиграться.
1. В Вашем индюке 2 сигнала + отдельно по хаям и лоям.
2. Сигнал появляется на 0-баре, но может исчезнуть (звенит несколько раз, а в итоге пусто) - поэтому съём сигнала сделал с 1-бара. поэтому у Вас будет ощущение, что алерт запаздывает
Пробуйте.

OsMA_Divergence_v1.mq421 скач.

#1764


Пришлось поиграться.
1. В Вашем индюке 2 сигнала + отдельно по хаям и лоям.
2. Сигнал появляется на 0-баре, но может исчезнуть (звенит несколько раз, а в итоге пусто) - поэтому съём сигнала сделал с 1-бара. поэтому у Вас будет ощущение, что алерт запаздывает
Пробуйте.



Огромнейшее спасибо за ваш труд. По тестим...
#1765

Помогите пожалуйста убрать алерт в индикаторе!Не могу выключить его!

atrzq.mq411 скач.

Изменено 10 января, 2015 пользователем Китаец

#1767


Пробуй




Спасибо большое!!Вроде молчит <:-p>
#1768
0ll, если вас не затруднит, не могли бы вы переделать трал советник e-movinginwl2? Нужно лишь добавить 5 уровней/шагов Б/У за ценой. На данном советнике имеется значения лишь LevelProfit (уровень после которого активируется Б/У) и LevelWLoss (уровень без убытка). Хочу чтобы таких уровней было 5. Искал подобные моему описанию тралы, но ничего толкового и работающего не нашел :( Закинул на 5 разных окон графиков, но получился по спартанский, хочется чтобы было удобно :d Скрин чего я хочу прилагается.

Безымянный.PNG
1.PNG
e-movinginwl2.mq49 скач.
e-movinginwl2.ex44 скач.

Изменено 12 января, 2015 пользователем Problematico

#1769

Уважаемые трейдеры!! возникла проблема, и никак не могу ее решить...гдето на сайте уважаемый XBMS выкладывал свой сов HA-EXPERT для таких как я...я его вроде бы от и до прочесал...и решил просто изменить условия входа в сделку...сделки вроде открываются в тестере, а вот закрываются только покупки, продажа закрывается по завершении тестирования...в чем может быть проблема...в журнале иногда пишет OrderModify Error 1

ATR-2.mq410 скач.

#1770
kempo У Вас ордера закрываются по СЛ или ТР. в расчёте СЛ есть ошибки. проверьте.
#1771


kempo У Вас ордера закрываются по СЛ или ТР. в расчёте СЛ есть ошибки. проверьте.


void OpenSellOrder()
{
mlots = GetLots();

if (AutoSL) sl = CalcSL(OP_SELL);
else sl = ND(Bid - StopLoss*Point);

tp = ND(Bid - TakeProfit*Point);

ticket = OrderSendReliable(Symbol(), OP_SELL, mlots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if(ticket > 0)
OrderModifyReliable(OrderTicket(), OrderOpenPrice(), sl, tp, 0);

все дело в Bid/Ask???


Oll большое спасибо))))разобрался)))

Изменено 15 января, 2015 пользователем kempo

#1772



kempo У Вас ордера закрываются по СЛ или ТР. в расчёте СЛ есть ошибки. проверьте.


все дело в Bid/Ask???
Я бы сказал больше в + / -
#1773




kempo У Вас ордера закрываются по СЛ или ТР. в расчёте СЛ есть ошибки. проверьте.


все дело в Bid/Ask???
Я бы сказал больше в + / -

да я разобрался)))спасибо и удачи Вам)))

Добавлено: 16-01-2015 05:02:57

Возник еще один вопрос...а как можно сделать ограничение сделок в день...По идее нужно немного переделать функцию CountSell/CountBuy...я правильно понял???

Изменено 16 января, 2015 пользователем kempo

#1774


Возник еще один вопрос...а как можно сделать ограничение сделок в день...По идее нужно немного переделать функцию CountSell/CountBuy...я правильно понял???

Нет. надо делать отдельный счётчик и сброс счётчика. ф-ции CountSell считают открытые ордера, а Вам надо считать закрытые, или я не правильно понял?
#1775



Возник еще один вопрос...а как можно сделать ограничение сделок в день...По идее нужно немного переделать функцию CountSell/CountBuy...я правильно понял???

Нет. надо делать отдельный счётчик и сброс счётчика. ф-ции CountSell считают открытые ордера, а Вам надо считать закрытые, или я не правильно понял?

я наверно неправильно задал вопрос...по идее в функции CountSell нужно поменять OrdersTotal на OrdersHistoryTotal и MODE_TRADES на MODE_HISTORY...ведь так???
а вот как это связать с датой я не знаю...не могли бы вы подсказать как это делать...
С ув.

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025