[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 234

 
deyron:
Здравствуйте. Подскажите пожалуйста, если один советник прикреплен сразу к нескольким окнам валютных пар, то изменения в советнике в одном окне влияют на советника другого окна??? т.е. локальные переменные меняются или нет???


 Если у того же советника ты изменишь мэджик, то эксперты будут работать отдельно каждый в своём окне. 

 

ОЧЕНЬ НУЖНА ПОМОЩЬ В ПЕРЕДЕЛКЕ СОВЕТНИКА!!!

В нем меня все устраивает, вот только хотелось бы.... Если не удалось перевести сделку в безубыток или закрыть по тейку, то закрывать ее по противоположному новому сигналу на открытие не изменяя стратегии торговли. К примеру есть сделка Sell цена развернулась и сов не перевел ее в безубыток он начинает на новой свече открывать сделки Sell c увеличением лота в надежде на откат,,, а хочется чтоб он продолжал работу так как будто закрыл эту сделку по стоп лосу/теку... разворот цены он открывается бай а ту закрывает, пускай с большим минусом.... Вот как-то так

/*декомпиль удалён*/

 
deyron:
Здравствуйте. Подскажите пожалуйста, если один советник прикреплен сразу к нескольким окнам валютных пар, то изменения в советнике в одном окне влияют на советника другого окна??? т.е. локальные переменные меняются или нет???
Нет, не влияют друг на друга. Одинаковый магик позиций может быть вреден только тогда, когда советник определяет закрытие позиции только по магику.
 

всем доброго времени суток.  помогите пожалуйста разобраться в глобальных переменных. задача примерно такая: у меня есть переменная bool line_1=false; она меняется на true; при достижения цены и делает уровни достижения при достижения которых будут другие действия и bool line_1 опять становится false; если мне надо перезагрузить систему или параметры не достигнуты в пятницу вечером то значения этой переменной теряются ну и само собой влияют на результат торговли, как я понимаю мне надо их сделать глобальными переменными bool. я с этим пока не сталкивался и прошу подсказать правильно ли я думаю составить код, если что то подскажите пожалуйста где надо исправить, спасибо.  

 

bool line_1=GlobalVariableGet(false);

if(macd_2<0&&macd_1>0) {line_1=GlobalVariableSet(true);}

if(macd_2>0&&macd_1<0) {line_1=GlobalVariableSet(false);} 

Если код будет построен таким образом то при перезагрузки терминала переменная оставит прежнее значение на момент перезагрузки или обнулит в состояние объявленное в начале программы?  Ещё раз спасибо! 

 
paladin80:
Нет, не влияют друг на друга. Одинаковый магик позиций может быть вреден только тогда, когда советник определяет закрытие позиции только по магику.

 Да, можно, конечно, иначе фильтровать. Например, по символу и тд. Я сказал, самый простой вариант.
 
laveosa:

всем доброго времени суток.  помогите пожалуйста разобраться в глобальных переменных. задача примерно такая: у меня есть переменная bool line_1=false; она меняется на true; при достижения цены и делает уровни достижения при достижения которых будут другие действия и bool line_1 опять становится false; если мне надо перезагрузить систему или параметры не достигнуты в пятницу вечером то значения этой переменной теряются ну и само собой влияют на результат торговли, как я понимаю мне надо их сделать глобальными переменными bool. я с этим пока не сталкивался и прошу подсказать правильно ли я думаю составить код, если что то подскажите пожалуйста где надо исправить, спасибо.  

 

bool line_1=GlobalVariableGet(false);

if(macd_2<0&&macd_1>0) {line_1=GlobalVariableSet(true);}

if(macd_2>0&&macd_1<0) {line_1=GlobalVariableSet(false);} 

Если код будет построен таким образом то при перезагрузки терминала переменная оставит прежнее значение на момент перезагрузки или обнулит в состояние объявленное в начале программы?  Ещё раз спасибо! 

Для начала почитайте про GlobalVariableSet() - у Вас не хватает параметров и Вы её неправильно используете.

А последовательность действий такова: когда значение перменной, которую Вы хотите сохранить, меняется, это значение передаётся соответствующей глобальной переменной терминала с ипользование упомянутой функции. А при переинициализации советнка в init() передаёте своей переменной значение посредством функции GlobalVariableGet().

 

Господа!Подскажите пожалуйста!

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

ПРОБЛЕМА.Программа в ТЕСТЕРЕ  открывает ордера по цене не совпадающей с указанной в коде условиями.

Например открывает ордер по цене 0.86084 при этом в массива самое близкое значение 0.85375

Т.е. разница - положительная.  Тогда как в коде указано что ордера открывать если разница < 0.00000 т.е. отрицательная.


Подскажите пожалуйста где ошибка.

Спасибо.

int start()
{
 double Price=iOpen (Symbol (),0,0);        
 double SL=NormalizeDouble (Price-3000*Point, Digits);         
 double TP=NormalizeDouble (Price+100*Point, Digits);    
 #include <MASSIV.mqh> //объявление массива типа double (неповторяющиеся значения цены с пятью знаками после точки)
 double value =  Bid ;//параметру value функции ArrayBsearch присваивается значение  цены последнего тика

 int S = ArrayBsearch(  massiv,  value, WHOLE_ARRAY,  0, MODE_ASCEND);//функция возвращает индекс значения цены макс. близкой к цене последнего тика 
 if( (NormalizeDouble (Bid-massiv[S],Digits) <=0))//если разница между значением массива возвращенным на последнем тике и ценой последнего тика отрицательная или = 0.00000


{
                        
 OrderSend(Symbol(),OP_BUY,0.1,Ask,1,SL,TP,"jfh",123 );//ордер открыть
 
solnce600:

Господа!Подскажите пожалуйста!

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

ПРОБЛЕМА.Программа в ТЕСТЕРЕ  открывает ордера по цене не совпадающей с указанной в коде условиями.

Например открывает ордер по цене 0.86084 при этом в массива самое близкое значение 0.85375

Т.е. разница - положительная.  Тогда как в коде указано что ордера открывать если разница < 0.00000 т.е. отрицательная.

Подскажите пожалуйста где ошибка.

Спасибо.

Путь поиска ошибок: пройтись по каждой строчке снизу вверх и осознать соответствие того, что хотелось получить, и что написано.

if ((NormalizeDouble (Bid-massiv[S],Digits) <=0))
//если разница между значением массива возвращенным на последнем тике и ценой последнего тика отрицательная или = 0.00000
Это условие преполагает, что... - Вы так задумывали??? (1 - 1000000 <= 0) - удовлетворяет??? 

Я Вам давал решение, а Вы "прошли мимо"...

 
TarasBY:

Путь поиска ошибок: пройтись по каждой строчке снизу вверх и осознать соответствие того, что хотелось получить, и что написано.

Это условие преполагает, что... - Вы так задумывали??? (1 - 1000000 <= 0) - удовлетворяет??? 

Я Вам давал решение, а Вы "прошли мимо"...

Большое спасибо.Мимо не проходил.Я даже скопировал себе ту Вашу подсказку....просто не до конца разобрался.....извините за тупость .... сейчас напрягу мозги и постараюсь  разобраться.

Я только не понимаю почему Вы значение переменной Вid (цена последнего тика) принимаете за единицу.Я то полагаю,что это значение из 6 знаков с дробной точкой после первого ... и значение 

massiv[S]  так же на мой взгляд состоит из 6 знаков с дробной точкой после первого.Подскажите пожалуйста что я недопонимаю.

Ваш код я внимательно изучал.Вот он

    double ld_Delta = 10. * Point;
    if (NormalizeDouble (MathAbs (Bid - Price), Digits) <= ld_Delta)//
и данная цена есть цена открытия нового бара
    {OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"jfh",123);}//открыть ордер 


Но я не понял

-Почему вместо переменной  massiv[S]  Вы предлагаете использовать переменную Price? Ведь в ней содержится значение цены открытия последнего бара.

Ведь моя главная идея -  одно из обязательных условий открытия  ордера  - совпадение цены его открытия с одним из значений массива , которое наиболее приближено к цене последнего тика.

Полностью моя стратегия выглядит так

ОТКРЫТЬ ОРДЕР при одновременном исполнении 2 условий

-по цене открытия последней свечи

-по цене максимально приближенной к одному из значений массива(значения массива -  около 2000 не повторяющихся значений  цены Вid идущие в случайном порядке)

Буду Вам очень признателен за помощь и подсказку - а то я уже второй день ломаю голову ..... и все безрезультатно.


	          
 
solnce600:

Большое спасибо.Мимо не проходил.Я даже скопировал себе ту Вашу подсказку....просто не до конца разобрался.....извините за тупость .... сейчас напрягу мозги и постараюсь  разобраться.

Я только не понимаю почему Вы значение переменной Вid (цена последнего тика) принимаете за единицу.Я то полагаю,что это значение из 6 знаков с дробной точкой после первого ... и значение 

massiv[S]  так же на мой взгляд состоит из 6 знаков с дробной точкой после первого.Подскажите пожалуйста что я недопонимаю.

Ваш код я внимательно изучал.Вот он

    double ld_Delta = 10. * Point;
    if (NormalizeDouble (MathAbs (Bid - Price), Digits) <= ld_Delta)//
и данная цена есть цена открытия нового бара
    {OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"jfh",123);}//открыть ордер 

Но я не понял

-Почему вместо переменной  massiv[S]  Вы предлагаете использовать переменную Price? Ведь в ней содержится значение цены открытия последнего бара.

Ведь моя главная идея -  одно из обязательных условий открытия  ордера  - совпадение цены его открытия с одним из значений массива , которое наиболее приближено к цене последнего тика.

Полностью моя стратегия выглядит так

ОТКРЫТЬ ОРДЕР при одновременном исполнении 2 условий

-по цене открытия последней свечи

-по цене максимально приближенной к одному из значений массива(значения массива -  около 2000 не повторяющихся значений  цены Вid идущие в случайном порядке)

Буду Вам очень признателен за помощь и подсказку - а то я уже второй день ломаю голову ..... и все безрезультатно.

Чтобы понять что происходит, нужно вывести расчёты на принт:

    //если разница между значением массива возвращенным на последнем тике 
    // и ценой последнего тика отрицательная или = 0.00000
    if ((NormalizeDouble (Bid-massiv[S], Digits) <= 0))
    {
        Print ("massiv[", S , "] = ", massiv[S], " | massiv[", S - 1, "] = ", massiv[S-1], " | massiv[", S + 1, "] = ", massiv[S+1], " | Bid = ", Bid);
        OrderSend(Symbol(),OP_BUY,0.1,Ask,1,SL,TP,"jfh",123 );//ордер открыт
    }
и проанализируйте полученные результаты. 
Причина обращения: