Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1332

 
DanilaMactep:

Сделал по коду так как советовали. Вначале по коду у меня идёт условие на выбор типа стопа - по атр или фиксированный

Далее свою нормализацию я закомментировал, а присвоил вот таким образом

Далее по коду у меня идёт вычисление профита- там проблем не было и после вычисления профита добавил страшную формулу которую советовали

Всё скомпилировалось без ошибок. А при запуске теста в журнале вылетает ошибка что происходит деление на ноль насколько я понимаю и тест прекращается. Где я тут накосячил-то или чего не сделал правильно?


Просто удали это

     sl = fabs(OrderOpenPrice()-OrderStopLoss())/_Point;// ПРИСВОИЛ ЗНАЧЕНИЕ КАК СОВЕТОВАЛИ
     //sl= NormalizeDouble(sl,Digits());// НОРМАЛИЗАЦИЯ ЗНАЧЕНИЯ СТОП ЛОССА ДЛЯ ОТКРЫТИЯ СДЕЛКИ ТО  ЧТО БЫЛО ЗАКОМЕНТИРОВАЛ
 
DanilaMactep:

Сделал по коду так как советовали. Вначале по коду у меня идёт условие на выбор типа стопа - по атр или фиксированный

Далее свою нормализацию я закомментировал, а присвоил вот таким образом

Далее по коду у меня идёт вычисление профита- там проблем не было и после вычисления профита добавил страшную формулу которую советовали

Всё скомпилировалось без ошибок. А при запуске теста в журнале вылетает ошибка что происходит деление на ноль насколько я понимаю и тест прекращается. Где я тут накосячил-то или чего не сделал правильно?


Просто когда вам дают два разных варианта, то применять оба сразу не надо.

Вы считаете sl двумя разными вариантами

sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1);// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА

или

sl= razmer_fikc_sl*Point; // ПЕЕРМЕННОЙ СТОП ЛОССА ПРИСВАЕВАЕМ ФИКСИРОВАНОНЕ ЗНАЧЕНИЕ ПУНКТОВ И ДОМНОЖАЕМ НА ПОИНТ

получаете значение в значениях цены. А в формулу должны быть вставлены пункты от … и до …

Получается, стоп от цены находится на расстоянии, либо iATR(………)/_Point либо razmer_fikc_sl но использовать два разных значения в функции не очень удобно, следовательно лучше оставить только один вариант

double lot =MathFloor((Free*MaxRisk/100)/(sl/Point*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА

и не забывайте что sl должно быть высчитано ДО попытки вычислить размер лота.

 
sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1)/Point;// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА
Обязательно
 

Сделай так...

void OnTick()
  {
//---
if(tip_sl==en_po_atr)
     { //ЕСЛИ ТИП СТОП ЛОССА СТОИТ ПО АТР ТО ВЫСЧИТЫВАЕМ ЕГО ИЗ АТР
     sl= iATR( NULL,PeriodForWork_sl,atr_sl_period,1)/Point;// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА
      Print("СТОП ПО АТР, ЕГО РАЗМЕР "+sl);
     }
     else //ИНАЧЕ- ТО ЕСТЬ ЕСЛИ СТОП ЛОСС ФИКСИРОВАННЫЙ В ПУНКТАХ
     {
     sl= razmer_fikc_sl; // ПЕЕРМЕННОЙ СТОП ЛОССА ПРИСВАЕВАЕМ ФИКСИРОВАНОНЕ ЗНАЧЕНИЕ ПУНКТОВ И ДОМНОЖАЕМ НА ПОИНТ
      Print("СТОП ПО АТР, ЕГО РАЗМЕР "+sl);
     }
double lot =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА
 
MakarFX:

Просто удали это

Закоменитровал строку и тест завёлся- БОЛЬШОЕ СПАСИБО! Только не понял зачем при получении в переменную стоплосса из iATR в конце делить на поинт? P/S с математикой у меня реально сложности- я не придуриваюсь:-( Но думаю раз тест пошёл и при депо в 100 лот ставится минимальный, а при депо в 10000 всё время разный, значит норма работает О_о Ещё раз благодарю за помощь...

 
DanilaMactep:

Закоменитровал строку и тест завёлся- БОЛЬШОЕ СПАСИБО! Только не понял зачем при получении в переменную стоплосса из iATR в конце делить на поинт? P/S с математикой у меня реально сложности- я не придуриваюсь:-( Но думаю раз тест пошёл и при депо в 100 лот ставится минимальный, а при депо в 10000 всё время разный, значит норма работает О_о Ещё раз благодарю за помощь...

ATR выдает десятичное число, типа 0,00120

razmer_fikc_sl у тебя целое число

для вычисления лота тебе надо пункты, т.е. целые числа

ATR/Point выдает целое число

 
Старая тема, но что-то решение найти не могу. Как прописать временной промежуток(например с 12:00 до 14:00) и только Один раз в этом промежутке открыть ордер, удовлетворяющий какому-то условию (RSI<30 например).

Или

Что-то типа аналога Sleep: открыть ордер по заданному условию и ничего не делать 2 часа. Но Sleep в тестере не работает. 
 
Порт-моне тв:
Старая тема, но что-то решение найти не могу. Как прописать временной промежуток(например с 12:00 до 14:00) и только Один раз в этом промежутке открыть ордер, удовлетворяющий какому-то условию (RSI<30 например).

Или

Что-то типа аналога Sleep: открыть ордер по заданному условию и ничего не делать 2 часа. Но Sleep в тестере не работает. 

первое условие - время пришло
второе условие - рси
третье условие - в истории нет по цене открытия такого ордера в промежутки времени

 

Добрый день.

 Есть индикатор Elliott Wave Oscillator  , он выдаёт числовые значения переменной EWO . Существуют положительные EWO те что выше нуля и отрицательные EWO которые ниже нуля.

Из последних 100 показаний EWO, нужно вычислить среднее значение  положительных EWO и отдельно среднее значение отрицательных EWO

Значения из индикатора получаю так     double EWO=iCustom(Symbol(),0,"Elliott Wave Oscillator",0,0);

Подскажите, каким кодом mql4 можно это реализовать в советник ?


Найти среднюю по модулю удалось.

double avarage_EWO = 0;
for(int g=0;g<100;g++)
avarage_EWO = avarage_EWO + MathAbs(  iCustom(Symbol(),0,"Elliott Wave Oscillator",0,g) ); // средняя по модулю
avarage_EWO = avarage_EWO/100;


Но вот как расчитать по отдельности среднюю положительную и среднюю отрицательную EWO ?

Благодарю !



 

https://www.mql5.com/ru/forum/170952/page195#comment_19853399

тут fxsaber представил функцию с:

ORDER_REASON_SL

Ордер выставлен в результате срабатывания Stop Loss

ORDER_REASON_TP

Ордер выставлен в результате срабатывания Take Profit

не могу сообразить как и для чего  ORDER_REASON_TP,

как работает DEAL_REASON_TP имею представление, а вот что с ордерами не понятно тут

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