Всё верно, не могло. Поэтому выдало по Bid<openPrice ордера по евре по 1.11262.
То есть, предлагаете сделать проверить на наличие ордера чере if(OrderSelect()), а потом во вложенном if уже сравнивать символ чарта с символом ордера, цену открытия и т.п.?
Да, именно, сначала OrderSelect(), а следующей проверкой - уже остальные параметры.
Никакой разницы нет в одной строке писать выбор ордера и проверку символа и магика или разделить их на 3 разные строки. Согласно изменениям в новых билдах проверка условий происходит поэтапно, тоесть если первое условие не выполнено, следующие и проверяться не будут. То-же самое что и 3 строки. Выполнено первое условие, проверяем второе. И только если и второе условие выполнено переходит на проверку третьего условия.
Проблема видимо в том, что в удалённой части кода есть вызов пользовательской функции в которой есть выбор другого ордера.
Если бы там было еще хоть одно упоминание о работе с ордерами, это было бы первым, на что я обратил внимание. Но там только расчёты, ни единой пользовательской функции не используется. Непонятно, что именно вызывает выбор ордера с другой пары. Поэтому я так и озадачился указанной в документации "программной средой" и уже переделал код, как предложил evillive и готов с бубнами поплясать. Следующим извратом будет принудительное сравнение с бидом\аском нужной пары через маркетинфо.
UPD.: Проблема решилась. На самом деле была найдена вложенная функция, в которой используется свой OrderSelect. Спасибо за поданную идею, AlexeyVik.
Всем привет! Подскажите как решить задачу, в цикле нахожу нужный номер бара, но мне также нужен и прошлый номер бара по циклу, как реализовать это лаконично? Спасибо.
for(i=limit; i>=0; i--)
{
yesterday_weekday = TimeDayOfWeek(iTime(Symbol(),0,i-1))-TimeDayOfWeek(iTime(Symbol(),0,i));
if (yesterday_weekday ==1)
yesterday_time=iTime(Symbol(),0,i);
yesterday_shift=iBarShift(Symbol(),0,yesterday_time0);//последний бар
}
Но почему то он не срабатывает на истории если в функции ЕСЛИ заданы оба параметра, если их задать по очереди все срабатывает на отлично вот код (и еще: подскажите как сделать, чтобы если уже есть открытый ордер Buy следующий ордер Buy не открывался, даже если все условия соответствуют?):
Вот создал советник (не для работы, просто для практики)
Но почему то он не срабатывает на истории если в функции ЕСЛИ заданы оба параметра, если их задать по очереди все срабатывает на отлично вот код (и еще: подскажите как сделать, чтобы если уже есть открытый ордер Buy следующий ордер Buy не открывался, даже если все условия соответствуют?):
Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???
А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение PC-->MA означает?
А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.
Вот как-то так:
_ExpertOrdersB=0;
_ExpertOrdersS=0;
for(int z=OrdersTotal()-1; z>=0; z --)
{
if(!OrderSelect(z,SELECT_BY_POS))
{
Print(". OrderSelect("+IntegerToString(z)+", SELECT_BY_POS ) FAIL!. Error #"+IntegerToString(GetLastError()));
}
if((OrderMagicNumber()==magic) && OrderSymbol()==_Symbol)
{
switch(OrderType())
{
default: break;
case0:
_ExpertOrdersB++;
break;
case1:
_ExpertOrdersS++;
break;
}
}
}
if (_ExpertOrdersB < 1) //если нет покупок, то пытаемся купить, при условии, что:
if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point);
Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???
А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение PC-->MA означает?
А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.
start() как то по "привычке" переправил )
Почему Ask == MA редкое событие? разве текущая цена спроса редко касается линии Moving Average?
А PC-->MA у меня это - если предыдущая цена закрытия выше линии Moving Average (по другому я не придумал как сделать).
Так вот, когда я в функцию ЕСЛИ по очереди включаю сначала только Ask == MA а потом только PC-->MA все нормально работает, а вот когда их совмещаю, не работает!
Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???
А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение PC-->MA означает?
А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.
Вот как-то так:
Я понял так, что РС-- > MA это тоже самое что РС-1 > MA
Всё верно, не могло. Поэтому выдало по Bid<openPrice ордера по евре по 1.11262.
То есть, предлагаете сделать проверить на наличие ордера чере if(OrderSelect()), а потом во вложенном if уже сравнивать символ чарта с символом ордера, цену открытия и т.п.?
Не помогут пляски с бубном.
Никакой разницы нет в одной строке писать выбор ордера и проверку символа и магика или разделить их на 3 разные строки. Согласно изменениям в новых билдах проверка условий происходит поэтапно, тоесть если первое условие не выполнено, следующие и проверяться не будут. То-же самое что и 3 строки. Выполнено первое условие, проверяем второе. И только если и второе условие выполнено переходит на проверку третьего условия.
Проблема видимо в том, что в удалённой части кода есть вызов пользовательской функции в которой есть выбор другого ордера.
Если бы там было еще хоть одно упоминание о работе с ордерами, это было бы первым, на что я обратил внимание. Но там только расчёты, ни единой пользовательской функции не используется. Непонятно, что именно вызывает выбор ордера с другой пары. Поэтому я так и озадачился указанной в документации "программной средой" и уже переделал код, как предложил evillive и готов с бубнами поплясать. Следующим извратом будет принудительное сравнение с бидом\аском нужной пары через маркетинфо.
UPD.: Проблема решилась. На самом деле была найдена вложенная функция, в которой используется свой OrderSelect. Спасибо за поданную идею, AlexeyVik.
Вот создал советник (не для работы, просто для практики)
Но почему то он не срабатывает на истории если в функции ЕСЛИ заданы оба параметра, если их задать по очереди все срабатывает на отлично вот код (и еще: подскажите как сделать, чтобы если уже есть открытый ордер Buy следующий ордер Buy не открывался, даже если все условия соответствуют?):
Вот создал советник (не для работы, просто для практики)
Но почему то он не срабатывает на истории если в функции ЕСЛИ заданы оба параметра, если их задать по очереди все срабатывает на отлично вот код (и еще: подскажите как сделать, чтобы если уже есть открытый ордер Buy следующий ордер Buy не открывался, даже если все условия соответствуют?):
Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???
А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение PC-->MA означает?
А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.
Вот как-то так:
Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???
А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение PC-->MA означает?
А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.
start() как то по "привычке" переправил )
Почему Ask == MA редкое событие? разве текущая цена спроса редко касается линии Moving Average?
А PC-->MA у меня это - если предыдущая цена закрытия выше линии Moving Average (по другому я не придумал как сделать).
Так вот, когда я в функцию ЕСЛИ по очереди включаю сначала только Ask == MA а потом только PC-->MA все нормально работает, а вот когда их совмещаю, не работает!
Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???
А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение PC-->MA означает?
А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.
Вот как-то так:
Я понял так, что РС-- > MA это тоже самое что РС-1 > MA
Я понял так, что РС-- > MA это тоже самое что РС-1 > MA
Получается что да! А вот почему он не работает в вот такой связке:
Хотя ниже на картинке все сходится
Получается что да! А вот почему он не работает в вот такой связке:
Хотя ниже на картинке все сходится