Вопрос по Symbol() - страница 2

 
ClanVi:

Все приведено правильно, был на фунте открыт бай, а тралила сова стоп на евробаксе где был селл, выставляя цену  стопа фунта

 

 эти функции просто считают убыточную серию и лот соответсвенно, ничего не меняя

тикет это хорошо, только почему выполнилось условие и пошла команда ордер модифи на другом символе?

Пример скрипта, который показывает, что если вызываемая функция перебирает ордера, то меняется и выбранный ордер в вызывающей функции, со всеми вытекающими. Пример на истории. У меня были сделки по AUDUSD и AUDJPY
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---
    ordSel( "AUDUSD" );
    Print( "AUDUSD ", OrderTicket() );
    ordSel( "AUDJPY" );
    Print( "AUDJPY ", OrderTicket() );   
}
//+------------------------------------------------------------------+
void ordSel( string ordSymbol )
{
   for ( int i = OrdersHistoryTotal()-1; i >= 0; i -- )
      if ( OrderSelect( i, SELECT_BY_POS, MODE_HISTORY) )
         if ( OrderSymbol() == ordSymbol)
            break;
   return;
}

А это лог

22:00:31 Script 112 AUDJPY,H1: loaded successfully
22:00:31 112 AUDJPY,H1: initialized
22:00:31 112 AUDJPY,H1: AUDUSD 59742642
22:00:31 112 AUDJPY,H1: AUDJPY 59893089
22:00:31 112 AUDJPY,H1: uninit reason 0 

 
evillive:
это был единичный случай или повторяется?

пока да)

Mislaid:
Пример скрипта, который показывает, что если вызываемая функция перебирает ордера, то меняется и выбранный ордер в вызывающей функции, со всеми вытекающими. Пример на истории. У меня были сделки по AUDUSD и AUDJPY

А это лог

22:00:31 Script 112 AUDJPY,H1: loaded successfully
22:00:31 112 AUDJPY,H1: initialized
22:00:31 112 AUDJPY,H1: AUDUSD 59742642
22:00:31 112 AUDJPY,H1: AUDJPY 59893089
22:00:31 112 AUDJPY,H1: uninit reason 0 

 

очень интересно, спасибо, а вот тип ордера тоже также мог поменятся? и если бы был другой магик он бы спас ситуацию?  

Наверно лучше тогда сделать вычесления до OrderSelect отдельно для бай и селл, ведь запомнив тикет, параметры все равно могут поменятся (зачем тогда проверки)

 
ClanVi:

пока да)

 

очень интересно, спасибо, а вот тип ордера тоже также мог поменятся? и если бы был другой магик он бы спас ситуацию?  

Наверно лучше тогда сделать вычесления до OrderSelect отдельно для бай и селл, ведь запомнив тикет, параметры все равно могут поменятся (зачем тогда проверки)

Первый вопрос - да, второй - нет. 

Вообще, похоже, Ваши значения Ubitok и Lot  ( отдельно для бай и селл) можно сосчитать  вне цикла.

Проверки нужны, чтобы выбрать нужный ордер. А запомнить тикет, чтобы выбранный ордер не потерять. 

 
ClanVi:

Сегодня советник  установленный на фунте начал тралить ордер на евро хотя в функции есть проверка

Магик одинаковый но почему он полез на другой график?

 

 


Он полез на тот график, который Вы сделали активным (открыли его). Ваше ограничение, приведенное в стартовом посте, именно это и подразумевает: "Если магик совпадает, окно ордера активно и ордер не закрыт, то траль его по самое не-балуй". 
 
tara:

Он полез на тот график, который Вы сделали активным (открыли его). Ваше ограничение, приведенное в стартовом посте, именно это и подразумевает: "Если магик совпадает, окно ордера активно и ордер не закрыт, то траль его по самое не-балуй". 
В каждом окне стояла своя копия советника, причем тут график который я открыл? функцию уже переделал, буду тестить
 
ClanVi:
В каждом окне стояла своя копия советника, причем тут график который я открыл? функцию уже переделал, буду тестить


Может стоять один советник на юане, но он станет тралить ордера на всех графиках, как только Вы их откроете. 

Запоминайте символ, на котором советнику разрешено работать.  

 
ClanVi:

Все приведено правильно, был на фунте открыт бай, а тралила сова стоп на евробаксе где был селл, выставляя цену  стопа фунта

 

 эти функции просто считают убыточную серию и лот соответсвенно, ничего не меняя

тикет это хорошо, только почему выполнилось условие и пошла команда ордер модифи на другом символе?

Эти функции не просто считают, а выбирают ордера для работы с ним. Вот и получается, что сначала выбран ордер

    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
     {
      if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderCloseTime()==0)

А потом в функциях

                          OpenPriceOrder  = NormalizeDouble(OrderOpenPrice(),Digits);
                         Ubitok          = NormalizeDouble(LastSeriesloss(),2);
                         Lot             = NormalizeDouble(OrderLotFun(OP_BUY),2);

новый перебор ордеров. И на каком символе перебор остановился тот и остаётся для работы, а в функции OrderModify(OrderTicket(), ...)  вот и получили не тот ордер который нужен.

 
AlexeyVik:

Эти функции не просто считают, а выбирают ордера для работы с ним. Вот и получается, что сначала выбран ордер

А потом в функциях

новый перебор ордеров. И на каком символе перебор остановился тот и остаётся для работы, а в функции OrderModify(OrderTicket(), ...)  вот и получили не тот ордер который нужен.

Да, но во всех функциях есть проверка OrderSymbol()==Symbol() , так что по логике перебор мог остановится только на символе на котором работает сова
 

Такое возможно если у вас в блоке модификации ордера нету проверки символа OrderSymbol()==Symbol().

Функция модификации схватила первую позицию при новом переборе позиций и модифицировала ее. И пофигу что там навыбирала описанная функция.


 

 
ClanVi:
Да, но во всех функциях есть проверка OrderSymbol()==Symbol() , так что по логике перебор мог остановится только на символе на котором работает сова

Не совсем так.

Перебор ордеров, проверка свой/чужой -> свой.

Затем повторный перебор в другой функции, проверка свой/чужой/размер лота ->ничего не найдено... НО ордер уже выбран перед проверкой свой/чужой...

Возврат в функцию уже с другим ордером для работы...

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