t>>=1 - бинарный сдвиг вправо на 1 бит. В десятичном виде это будет как целочисленное деление на 2.
|= - побитовое "или".
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Справочник MQL4 / Основы языка / Операции и выражения / Побитовые операции
Это означает: присвоить переменной period результат побитового "ИЛИ" переменных period и tСочетание "|=" мне вообще непонятно.
ПС: расшифровать смысл данного цикла без остального кода нельзя. Побитовые операции очень эффективны, если знать как ими пользоваться.
Добавлено: 21-12-2018 11:02:34
Ну раз уж взялись объяснять, то приведите пример, распишите как это работает на битовом уровне - многим будет интересно.t>>=1 - бинарный сдвиг вправо на 1 бит. В десятичном виде это будет как целочисленное деление на 2.
t>>=1 - бинарный сдвиг вправо на 1 бит. В десятичном виде это будет как целочисленное деление на 2.
|= - побитовое "или".
Ок, на что их заменить для адеватных операторов?
t = t/2;
??
Бинарный сдвиг вправо.
Предположим, t=75 , в двоичной системе выглядит, как
1001011
Сдвиг вправо сдвигает вправо все биты на 1, последний бит справа пропадает, а освободившийся бит слева заполняется нулём.
0100101
В десятичной системе это 37.
Число 74 выглядит в двоичной системе как 1001010, и после сдвига вправо получится тоже 0100101 (37). Т.е., так как последний значащий бит пропадает, то чётное и следующее за ним нечётное число после сдвига дают одно и то же значение.
Побитовое "ИЛИ".
Допустим, t = 10, в двоичном виде будет, как 1010, а period = 19, в двоичном виде будет, как 10011. Добавим недостающие нули слева к 1010, чтобы получилось одинаковое количество цифр. Получается:
01010
10011
Побитовое "ИЛИ" - к каждой паре битов применяется логическое "ИЛИ" - то есть, если хотя бы один из операндов равен 1, то результат равен 1, иначе результат равен 0.
Получается:
11011
Что в десятичной системе равно 27.
В общем, понять, что делает данный цикл, без остальной части кода - нельзя. Предполагаю, что period будет равен 2[sup]n-1[/sup]-1, где n - кол-во значащих бит в изначальном значении t.
Изменено 21 декабря, 2018 пользователем machine
Народ, кто подскажет как ограничить рисование до одной стрелки при выполнении условия? Рисует стрелки на каждом баре, если условие выполняется.
int OnCalculate(......)
{
for (i = 0; i {
MABuffer1 = iMA(NULL, 0, PeriodMA1, 0, MODE_EMA, PRICE_CLOSE, i);
MABuffer2 = iMA(NULL, 0, PeriodMA2, 0, MODE_EMA, PRICE_CLOSE, i);
MABuffer3 = iMA(NULL, 0, PeriodMA3, 0, MODE_EMA, PRICE_CLOSE, i);
MABuffer4 = iMA(NULL, 0, PeriodMA4, 0, MODE_EMA, PRICE_CLOSE, i);
if (MABuffer1 > MABuffer2 && MABuffer2 > MABuffer3 && MABuffer3 > MABuffer4 && iClose(NULL,0,i) > MABuffer4)
{
ArrowUP = High + 5 * Point;
}
}
return(rates_total);
}
Смотрел рзные стрелочные индикаторы, и там похожий код, но рисует одну стрелку после привыполнении условия.
видимо похож, но не совсем...Смотрел рзные стрелочные индикаторы, и там похожий код, но рисует одну стрелку после привыполнении условия.
функция OnCalculate запускается на каждом тике, а далее цикл по всем барам, т.е. Ваш индикатор на каждом тике пересчитывает все бары - это не правильно.
Но не в этом причина рисования стрелки на каждом баре. Вам нужно строго контролировать последовательность сигналов, т.е. за UP должен следовать DOWN. Введите переменную last = 0(UP) или 1 (DOWN), Ваше условие UP дополните проверкой: && last == 1
Ребяты , подскажите... Сигнал на открытие сделки появляется и исчезает внутри свечи( особенно на хвостах). При открытии новой свечи сигнал уже постоянный.
Как написать в сове , чтобы ордер открывался не внутри свечи, а на открытии новой свечи , когда сигнал уже постоянный.
Сдвиг (Shift) на одну свечу - это уже слишком далеко получается.
Есть функция, которая сигналит на открытии свечи и есть сигнал индюка. У Вас сейчас условие открытия сделки if ( signal ) Open(...), а нужно: if ( isNewBar() && signal ) Open(...);Как написать в сове , чтобы ордер открывался не внутри свечи, а на открытии новой свечи
bool isNewBar()
{ static datetime newB;
if (newB == Time[0]) return(false); newB = Time[0]; return(true);
}
Выбираю ордер по тикету на истории, чтобы проверить, закрылся ли он с прибылью.
Почему-то одер отбирается еще когда он откыт, хотя в функции Select выбираю параметр MODE_HISTORY. В чем может быть моя ошибка?
Добавлено: 05-01-2019 10:23:11
Сама поняла свою ошибку ;) Исторические ордера нельзя отбирать по тикету.
Изменено 5 января, 2019 пользователем Larcher
Это не так. Любой ордер можно выбирать по тикету, после выбора можно посмотреть дату закрытия, если =0, то ордер не закрыт, если >0 - значит закрыт.Исторические ордера нельзя отбирать по тикету.
Я имела ввиду, что параметр MODE_HISTORY не работает, когда одер отбирается по тикету.
Подскажите , как в коде МАшку вставить не на график цены , а в окно к Стохастику ? Вручную выбираю Применить к Previous Indicators Data , а в коде нет такого - там только применять к виду МА ( Open, Close )..
Заранее благодарен !
Изменено 7 января, 2019 пользователем batmanuyga
Нужно побарно сглаживать стохастик, формула экспоненциального сглаживания проста:Подскажите , как в коде МАшку вставить не на график цены , а в окно к Стохастику ?
stohMA = ( stoh + stohMA[i-1] * (periodMA -1) ) / periodMA;
Нужно побарно сглаживать стохастик, формула экспоненциального сглаживания проста:
stohMA = ( stoh + stohMA[i-1] * (periodMA -1) ) / periodMA;
Спасибо.. Но я так понял , что просто вставить МА в нижнее окно нельзя ? Ну допустим у меня там не стохастик , а RVI или ATR , и на них нужно наложить МА. Новая формула нужна , чтоб МА на них выводилась ?
Sorry , дошло до меня ! Стохастик ведь и есть две МА ... Нужно просто одну выводить со своими параметрами в нижнее окно !
Изменено 7 января, 2019 пользователем batmanuyga
Доброго дня всем! Подскажите пожалуйста, кто знает, как сделать выпадающий список на графике. Вроде как нужно подключать Include а а какой и как не разобрался ~x(
Kasatik готового решения для Вас нет - сложные интерфейсы ни кто не использует. Метаквоты сделали что-то, есть ListView и ComboBox - пробуйте.
Да ... будем ковырять)
Новый урок:
http://tradelikeapro.ru/mql4-grafik-ekviti-i-statistika/
очень полезный на мой взгляд урок. спасибо.
но все таки хотелось бы извлечь не "относительную" просадку а "максимальную".
по идее для этого надо из:
if(MaxBal != 0 && MinBal != 0 && MaxDrawdown MaxDrawdown = ((MaxBal - MinBal)/AccountBalance())*100;
}
записать как то так ":
if(MaxBal != 0 && MinBal != 0 && MaxDrawdown MaxDrawdown = (MaxBal - MinBal);
так выйдет или нет?
Изменено 11 января, 2019 пользователем Ar4i
Добрый вечер, друзья! Хотел узнать, есть ли уроки по графическим объектом ну, например, прямоугольники, стрелочки или кнопки, если создал кнопку и на нее нажал, чтоб она нарисовала новый объект прямоугольник или линии. Есть такие уроки.
в уроке "закономерности свечных паттернов" рисуем стрелочки, а в уроке "копировщик сделок для MT" было описание кнопки. дальше заглядывать в справку и экспериментировать.
Добавлено: 20-01-2019 16:22:54
вопрос про slippage в наших советниках. как он работает на реале при:
Market Execution(тип счета standart) и instant execution(ecn счетах).
то есть конкретизирую: вариант на Market эта настройка есть ограничительным фактором на отклонение или она на ecn до одного места?
и на оборот на счете standart, если задать скажем slippage=30; то будут ли реквоты до заданного отклонения?
и еще как наш slippage может взаимодействовать с настройкой функции в мт4: "установкой максимального отклонения цены". опять таки в двух вариантах счета? счета?
Изменено 20 января, 2019 пользователем Ar4i
Всем добрый день. Созрел нубский вопрос: Как сделать оповещение о сделках например на почту?, но не стандартным методом, а внутри совы, что бы писала имя советника, параметры например, ну и погоду там, настроение и так далее. Может можно еще более продвинутые методы оповещения использовать, те же пуш уведомления (которые в стандартном исполнение весьма удобны, но малоинформативны если на счете торгует зоопарк советников). Вообщем прошу пнуть меня в нужном направлении :)) Спасибо.
Здравствуйте " содрал" код для перевода в безубыток, подскажите пожалуйста что с ним не так, почему не работает? Заранее спасибо!!!
if (BULevel!=0) BU();
//+------------------------------------------------------------------+
void BU()
{
for(int i=0; i {
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderType()==OP_BUY)
{
if(OrderOpenPrice()OrderStopLoss())
{
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
}
}
if(OrderType() == OP_SELL)
{
if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice() {
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
}
}
}
}
}
//------------------------------------------------------------------+
Изменено 23 января, 2019 пользователем 0ll
BULevel в каких значениях задаётся? Сейчас он будет работать, если задавать в абсолютных значениях, т.е., 0.00001. Чтобы задавать в пунктах (т.е., 1), нужно умножать на _Point, т.е. Ask+BULevel*_Point (пример для "новых" пунктов).
А вообще, в условиях бы поменять местами переменные. Если Ask-BULevel изменяется, а OrderOpenPrice - нет, то было бы понятнее Ask-BULevel=OrderOpenPrice()+BULevel (для Buy). Вроде бы, в оригинале всё равно условия неправильные (даже без перестановки переменных).
Спасибо большое за помощь!!! Может есть у кого- то рабочий перевод в безубыток?
Не там содрали... Этот код не рабочий.Здравствуйте " содрал" код для перевода в безубыток, подскажите пожалуйста что с ним не так, почему не работает?
К посту machine добавлю ошибку выбора ордера, вот правильная запись: OrderSelect ( i, SELECT_BY_POS, MODE_TRADES );
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем