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

ale002

::: __,,,^._.^,,,__ :::
значения у них отличаются на несколько порядков. Как привести их к значениям одного порядка?

Ну, можно в % их выводить, тада размерность у всех будет одинаковая. Получитсо осциллятор. За 100% брать изменение за скока-то баров (bars). Тада цена одного пункта в % будет:

rate = 100 / (ArrayMaximum(buffer, bars) - ArrayMinimum(buffer, bars))

А значение, котор надо рисовать в каждой точке:

line_buffer[0] = (buffer[0] - ArrayMinimum(buffer, bars)) * rate
 

Ugar

Гуру форума
Здравствуйте, помогите решить такую проблему: хочу чтоб в одном индикаторе отображались евробакс, индекс доллара и индекс евро, ток значения у них отличаются на несколько порядков. Как привести их к значениям одного порядка? Просто множители добавить - думаю не по феншую как то...
Почему же, вполне. Множитель это самый простой вариант. А за основу множителя можно взять какой нибудь индикатор волатильности, например ATR или Standard Deviation. Тайм фрейм им задать побольше, например D1, и период побольше, например год.
Можно конечно, как в wpr, сваять ценовой канал и отображать положение цены в %. Но это уже будут совсем другие показания. По сути это WPR разных инструментов в одном окне. Для этой реализации вполне можно применить iWPR()
 

hoz

Активный участник
Подскажите, кто уверен, switch - быстрый оператор, или тормознутый? А то я слышал разные версии, но что-то сам лично не уверен.
 

ale002

::: __,,,^._.^,,,__ :::
Подскажите, кто уверен, switch - быстрый оператор, или тормознутый? А то я слышал разные версии, но что-то сам лично не уверен.
Это абстрактный вопрос, бо от многого зависит. Напишите 2 варианта того что хотите - 1 switch, другой if. Поместите в цикл итераций на мильён, перед циклом запомните в переменную время, после цикла выведите затраченное время на чарт или в файл. Потом в цикле замените switch на if - увидите разницу
 

qqmber

Почетный гражданин
Подскажите, кто уверен, switch - быстрый оператор, или тормознутый? А то я слышал разные версии, но что-то сам лично не уверен.
Вжик.
switch() исполняется так же как
if(case1) {case 1 block}
else if(case2) {case 2 block}
else if...
else {default block}
 
Последнее редактирование:

hoz

Активный участник
Дело в том, что я написал функцию, которая получает цену открытия:

PHP:
double fGet_TradePrice(int fi_price,    // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
   double ld_price = 0.0;
   
   switch (fi_price)
   {
         case 0:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);
         
         case 1:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Ask;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_ASK);
   }

    if (ld_price != 0)
        return (ld_price);
}


По сути, мне интересно мнение со стороны, грамотно ли я реализовал данную функцию? Щяс пытаюсь понять в каких местах лучше, а на сколько часто использовать RefreshRates(), а так же некоторые проверки рыночных условий. Так как раньше писал всё для тестера.
 
Последнее редактирование:

qqmber

Почетный гражданин
По сути, мне интересно мнение со стороны, грамотно ли я реализовал данную функцию? Щяс пытаюсь понять в каких местах лучше, а на сколько часто использовать RefreshRates(), а так же некоторые проверки рыночных условий. Так как раньше писал всё для тестера.

break; в конце каждого блока case нужен.
С пивом потянет. Не самое короткое решение, но работать будет.
Единственно, в самом конце нет смысла проверять if (ld_price != 0) , если этот if и не выполнится, функция все равно вернет 0 по умолчанию.
RefreshRates() надо вызвать если перед текущим куском кода есть времязатратные вычисления. В частности, уместно внутри функции, когда неизвестно сколько времени прошло с момента запуска start().
 
Последнее редактирование:

ale002

::: __,,,^._.^,,,__ :::
А можно всё сократить

PHP:
double fGet_TradePrice(int fi_price, string fs_symbol) {
	RefreshRates();
	if(fi_price) return(MarketInfo(fs_symbol, MODE_ASK));
	return(MarketInfo(fs_symbol, MODE_BID));
}
 

luka_russki

Интересующийся
http://ru.wikipedia.org/wiki/%D0%9E%D1%81%D1%86%D0%B8%D0%BB%D0%BB%D1%8F%D1%82%D 0%BE%D1%80_%D0%9C%D0%B0%D0%BA%D0%BA%D0%BB%D0%B5%D0 %BB%D0%BB%D0%B0%D0%BD%D0%B0

Привет всем! Кто-нибудь может писать этот индикатор?
 

qqmber

Почетный гражданин
А можно всё сократить

PHP:
double fGet_TradePrice(int fi_price, string fs_symbol) {
	RefreshRates();
	if(fi_price) return(MarketInfo(fs_symbol, MODE_ASK));
	return(MarketInfo(fs_symbol, MODE_BID));
}

Не пойдет. Здесь вам не С, if(int) нельзя.
Ну и хорошо бы возвращать 0 если передан fi_price>1.
 

ale002

::: __,,,^._.^,,,__ :::
Не пойдет. Здесь вам не С, if(int) нельзя.
А вы проверьте. Можно ваще оба условия в одном операторе проверять:

PHP:
#property indicator_separate_window

int start(){
	Alert(fGet_TradePrice(OP_BUY, Symbol()), " Bid=", Bid, " Ask=", Ask);
	return(0);
}

double fGet_TradePrice(int fi_price, string fs_symbol) { 
	RefreshRates();
	return(fi_price * MarketInfo(fs_symbol, MODE_ASK) + (!fi_price) * MarketInfo(fs_symbol, MODE_BID));
}


Ну и хорошо бы возвращать 0 если передан fi_price>1.

Это да, для самодисциплины. А так - избыточный код, как я понял эта переменная не вычисляется, а вбита в вызове функции явно - тока 0 и 1
 

qqmber

Почетный гражданин
А вы проверьте. Можно ваще оба условия в одном операторе проверять:
Так можно. И RefreshRates() тут лишний.
Заметьте кстати, что на маркет исполнении эти вычисления вовсе не нужны. Сервер сам все посчитает.
 

hoz

Активный участник
break; в конце каждого блока case нужен.
Точно! Как-то я так проворонил...

С пивом потянет. Не самое короткое решение, но работать будет.
Пово не пью, НО и длинным то его особо не назовёшь. Если тянуть сразу через MarketInfo(), тогда будет короче, но разве есть в этом смысл? Я слышал, что так по скорость исполнения медленнее будет, ежели сразу брать рыночную цену БИД или АСК.

Единственно, в самом конце нет смысла проверять if (ld_price != 0) , если этот if и не выполнится, функция все равно вернет 0 по умолчанию.
Это ещё почему?

RefreshRates() надо вызвать если перед текущим куском кода есть времязатратные вычисления. В частности, уместно внутри функции, когда неизвестно сколько времени прошло с момента запуска start().
Хм. НО тут опять же загвоздка. Может быть косяк там и там.
Во-первых, в случае, если вызывать функцию MarketInfo() в начале какой-то функции, и там будет расчёт с одной рыночной ценой, например, (если иметь в виду цену), а дальше, когда MarketInfo() обновит цену цена может измениться, и стать другой. Хотя изначальный расчёт был по другой цене. Таким образом будет логическая ошибка. Это ж как-то нужно решать?
 

hoz

Активный участник
Единственно, в самом конце нет смысла проверять if (ld_price != 0) , если этот if и не выполнится, функция все равно вернет 0 по умолчанию.


Это понятно, с утра посмотрел, очевидно.. писал ночью изначально код, накосячил.. вопрос снимаю этот.
 

qqmber

Почетный гражданин
Пово не пью, НО и длинным то его особо не назовёшь. Если тянуть сразу через MarketInfo(), тогда будет короче, но разве есть в этом смысл? Я слышал, что так по скорость исполнения медленнее будет, ежели сразу брать рыночную цену БИД или АСК.
Формально да, медленнее из-за расходов на вызов функции, но это такие микросекунды, которые вряд ли могут повлиять.
Хм. НО тут опять же загвоздка. Может быть косяк там и там.
Во-первых, в случае, если вызывать функцию MarketInfo() в начале какой-то функции, и там будет расчёт с одной рыночной ценой, например, (если иметь в виду цену), а дальше, когда MarketInfo() обновит цену цена может измениться, и стать другой. Хотя изначальный расчёт был по другой цене. Таким образом будет логическая ошибка. Это ж как-то нужно решать?
Тут конечно от алгоритма зависит, но работать со старыми ценами когда уже есть новые это обычно плохая идея.
Кроме того, у вас ведь мультивалютник, судя по коду, и я бы не стал ту пару, на графике которой стоит эксперт, обрабатывать как-то особенно. А ведь именно так и получится, если с ней работать через Bid/Ask а с остальными через MarketInfo().
 

hoz

Активный участник
Кроме того, у вас ведь мультивалютник


Вообще-то нет. Я пишу сову, которая торгует пока что на одном инструменте. Просто когда код разрастается, начинаешь понимать, что всё сложнее его читать из-за количества строк. Т.е. читать то просто, но искать что где находится уже не комфортно. Потому я щяс прилаживаю усилия, всё-таки написать функции и выкинуть их в библиотеки. А так же научится всё это структурировать. Просто уже мозг устал гортать экраны того или иного эксперта. Есс-но, пишу заранее, чтоб функции были универсальными, как для мультивалютника, то и для одного инструмента.

судя по коду, и я бы не стал ту пару, на графике которой стоит эксперт, обрабатывать как-то особенно. А ведь именно так и получится, если с ней работать через Bid/Ask а с остальными через MarketInfo().


Да, вы правы! Тока прошу заметить, что у нас не будет такого! Мы же сразу проверим, какой символ. Если символ текущего окна, то... Ну а если другой, то уже.. через MarketInfo() тянуть..
 
Последнее редактирование:

Алекc1234

Местный житель
Вопрос такой: мой советник в тестере работает как-то непонятно. Если тестируешь за прошлый день, то результаты такие, какие и ожидаешь(как и реально он работал в этот день), а стоит поставить тест на две недели, как может получиться так, что за прошлый день сов закрыл сделку совсем по другому, чем если тестировать только за этот день. Подскажите, почему же так?
 
Верх